From 950d24ffce69ccb85cef22b49b4964d5b5079f7f Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 1 Jul 2003 11:48:53 +0000 Subject: [PATCH] Gettext improvements. Allow main target in sources for 'gettext.update' rule. Improve 'stage' target to help installting gettext files. [SVN r18903] --- src/tools/gettext.jam | 76 +++++++++++++++++++++++++++++++++---------- src/tools/stage.jam | 13 +++++++- 2 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/tools/gettext.jam b/src/tools/gettext.jam index 492969c0b..e0b3af12a 100644 --- a/src/tools/gettext.jam +++ b/src/tools/gettext.jam @@ -16,7 +16,7 @@ # - Decide on a file name which will contain translations and # what main target name will be used to update it. For example:: # -# gettext.update update-russian : russian.po a.cpp b.cpp ; +# gettext.update update-russian : russian.po a.cpp my_app ; # # - Create the initial translation file by running # @@ -54,6 +54,7 @@ import generators ; import errors ; import feature : feature ; import toolset : flags ; +import regex ; .path = "" ; @@ -75,18 +76,22 @@ rule init ( path ? # Path where all tools are located. If not specified, # Creates a main target 'name', which, when updated, will cause # file 'existing-translation' to be updated with translations -# extracted from 'sources' --- which, for now, must be names -# of source files. +# extracted from 'sources'. It's possible to specify main target +# in sources --- it which case all target from dependency graph +# of those main targets will be scanned, provided they are of +# appropricate type. The 'gettext.types' feature can be used to +# control the types. # # The target will be updated only if explicitly requested on the # command line. -rule update ( name : existing-translation sources + ) +rule update ( name : existing-translation sources + : requirements * ) { local project = [ CALLER_MODULE ] ; targets.main-target-alternative [ new update-translations-class $(name) : $(project) : $(existing-translation) $(sources) + : [ targets.main-target-requirements $(requirements) : $(project) ] ] ; local project-target = [ project.target $(project) ] ; $(project-target).mark-target-as-explicit $(name) ; @@ -101,34 +106,71 @@ type.register gettext.catalog : mo : : main ; # sources. type.register gettext.POT : pot ; +# Identifies the keyword that should be used when scanning sources. +# Default: i18n feature gettext.keyword : : free ; +# Contains space-separated list of sources types which should be scanned. +# Default: "C CPP" +feature gettext.types : : free ; generators.register-standard gettext.compile : gettext.PO : gettext.catalog ; -rule update-translations-class ( name : project : sources * ) +rule update-translations-class ( name : project : sources * : requirements ) { basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements) : $(default-build) ; + + IMPORT gettext : regex.split : $(__name__) : regex.split ; rule construct ( source-targets * : property-set ) { + local types = [ $(property-set).get ] ; + types ?= "C CPP" ; + types = [ regex.split $(types) " " ] ; property-set = [ property-set.empty ] ; if ! $(.constructed) { - local new-messages = [ new file-target $(self.name) : gettext.POT : $(self.project) ] ; - local extract = - [ new action $(new-messages) : $(source-targets[2-]) : gettext.extract ] ; - $(new-messages).action $(extract) ; + # First deterime the list of sources that must be scanned to + # messages. + local all-sources ; + for local s in $(source-targets[2-]) + { + all-sources += [ virtual-target.traverse $(s) : : include-sources ] ; + } + local right-sources ; + for local s in $(all-sources) + { + if [ $(s).type ] in $(types) + { + right-sources += $(s) ; + } + } - local r = [ new notfile-target $(self.name) : $(self.project) ] ; - local a = [ new action $(r) : $(source-targets[1]) $(new-messages) - : gettext.update-po-dispatch ] ; - $(r).action $(a) ; - .constructed = [ virtual-target.register $(r) ] ; + if $(right-sources) + { + local new-messages = [ new file-target $(self.name) : gettext.POT : $(self.project) ] ; + local extract = + [ new action $(new-messages) : $(right-sources) : gettext.extract ] ; + $(new-messages).action $(extract) ; + + local r = [ new notfile-target $(self.name) : $(self.project) ] ; + local a = [ new action $(r) : $(source-targets[1]) $(new-messages) + : gettext.update-po-dispatch ] ; + $(r).action $(a) ; + .constructed = [ virtual-target.register $(r) ] ; + } + else + { + errors.error "No source could be scanned by gettext tools" ; + } } return $(.constructed) ; } + + rule check-for-unused-sources ( result * : sources * ) + { + } } class update-translations-class : basic-target ; @@ -147,7 +189,7 @@ actions extract # When file to be updated does not exist (during the # first run), we need to copy the file created from sources. # In all other cases, we need to update the file. -local rule update-po-dispatch +rule update-po-dispatch { NOCARE $(>[1]) ; gettext.create-po $(<) : $(>) ; @@ -167,9 +209,9 @@ actions quietly existing updated create-po bind EXISTING_PO cp$(_)"$(>[1])"$(_)"$(EXISTING_PO)"$($(>[2]:E=ok)) } -actions updated update-po +actions updated update-po bind EXISTING_PO { - $(.path)msgmerge$(_)-U$(_)"$(>[1])"$(_)"$(>[2])" + $(.path)msgmerge$(_)-U$(_)"$(EXISTING_PO)"$(_)"$(>[1])" } actions gettext.compile diff --git a/src/tools/stage.jam b/src/tools/stage.jam index 50d591fb7..775829ec4 100644 --- a/src/tools/stage.jam +++ b/src/tools/stage.jam @@ -37,6 +37,12 @@ rule stage-target-class ( name-and-dir : project : sources * : requirements * : rule construct ( source-targets * : property-set ) { + local name = [ $(property-set).get ] ; + if $(name) && $(source-targets[2]) + { + errors.error " property cannot be specified when staging several targets" ; + } + local location = [ feature.get-values : [ $(property-set).raw ] ] ; if ! $(location) @@ -65,7 +71,12 @@ rule stage-target-class ( name-and-dir : project : sources * : requirements * : } else { - local n = [ $(i).name ] ; + local n = [ $(i).name ] ; + if $(name) + { + n = $(name) ; + } + i2 = [ new file-target $(n:D=) : [ $(i).type ] : $(self.project) ] ; local a = [ new action $(i2) : $(i) : common.copy ] ;