################################################################################ # # Copyright (c) 2007-2008 Dario Senic, Jurko Gospodnetic. # # Use, modification and distribution is subject to the Boost Software # License Version 1.0. (See accompanying file LICENSE_1_0.txt or # http://www.boost.org/LICENSE_1_0.txt) # ################################################################################ ################################################################################ # # Boost Build wxFormBuilder generator tool module. # # wxFormBuilder is a GUI designer tool for the wxWidgets library. It can then # generate C++ sources modeling the designed GUI using the wxWidgets library # APIs. # # This module defines a wxFormBuilder project file type and rules needed to # generate C++ source files from those projects. With it you can simply list # wxFormBuilder projects as sources for some target and Boost Build will # automatically convert them to C++ sources and process from there. # # The wxFormBuilder executable location may be provided as a parameter when # configuring this toolset. Otherwise the default wxFormBuilder.exe executable # name is used located in the folder pointed to by the WXFORMBUILDER environment # variable. # # Current limitations: # # * Works only on Windows. # * Works only when run via Boost Jam using the native Windows cmd.exe command # interpreter, i.e. the default native Windows Boost Jam build. # * Used wxFormBuilder projects need to have their output file names defined # consistently with target names assumed by this build script. This means # that their target names must use the prefix 'wxFormBuilderGenerated_' and # have no output folder defined where the base name is equal to the .fpb # project file's name. # ################################################################################ ################################################################################ # # Implementation note: # # Avoiding the limitation on the generated target file names can be done but # would require depending on external tools to copy the wxFormBuilder project to # a temp location and then modify it in-place to set its target file names. On # the other hand wxFormBuilder is expected to add command-line options for # choosing the target file names from the command line which will allow us to # remove this limitation in a much cleaner way. # (23.08.2008.) (Jurko) # ################################################################################ import generators ; import os ; import path ; import toolset ; import type ; ################################################################################ # # wxFormBuilder.generate() # ------------------------ # # Action for processing WX_FORM_BUILDER_PROJECT types. # ################################################################################ # # Implementation notes: # # wxFormBuilder generated CPP and H files need to be moved to the location # where the Boost Build target system expects them so that the generated CPP # file can be included into the compile process and that the clean rule # succesfully deletes both CPP and H files. We expect wxFormBuilder to generate # files in the same location where the provided WX_FORM_BUILDER_PROJECT file is # located. # (15.05.2007.) (Dario) # ################################################################################ actions generate { start "" /wait "$(EXECUTABLE)" /g "$(2)" move "$(1[1]:BSR=$(2:P))" "$(1[1]:P)" move "$(1[2]:BSR=$(2:P))" "$(1[2]:P)" } ################################################################################ # # wxFormBuilder.init() # -------------------- # # Main toolset initialization rule called via the toolset.using rule. # ################################################################################ rule init ( executable ? ) { if $(.initialized) { if $(.debug-configuration) { ECHO notice: [wxFormBuilder-cfg] Repeated initialization request (executable \"$(executable:E="")\") detected and ignored. ; } } else { local environmentVariable = WXFORMBUILDER ; if $(.debug-configuration) { ECHO notice: [wxFormBuilder-cfg] Configuring wxFormBuilder... ; } # Deduce the path to the used wxFormBuilder executable. if ! $(executable) { executable = "wxFormBuilder.exe" ; local executable-path = [ os.environ $(environmentVariable) ] ; if $(executable-path)-is-not-empty { executable = [ path.root $(executable) $(executable-path) ] ; } else if $(.debug-configuration) { ECHO notice: [wxFormBuilder-cfg] No wxFormBuilder path configured either explicitly or using the $(environmentVariable) environment variable. ; ECHO notice: [wxFormBuilder-cfg] To avoid complications please update your configuration to includes a correct path to the wxFormBuilder executable. ; ECHO notice: [wxFormBuilder-cfg] wxFormBuilder executable will be searched for on the system path. ; } } if $(.debug-configuration) { ECHO notice: [wxFormBuilder-cfg] Will use wxFormBuilder executable \"$(executable)\". ; } # Now we are sure we have everything we need to initialize this toolset. .initialized = true ; # Store the path to the used wxFormBuilder executable. .executable = $(executable) ; # Type registration. type.register WX_FORM_BUILDER_PROJECT : fbp ; # Parameters to be forwarded to the action rule. toolset.flags wxFormBuilder.generate EXECUTABLE : $(.executable) ; # Generator definition and registration. generators.register-standard wxFormBuilder.generate : WX_FORM_BUILDER_PROJECT : CPP(wxFormBuilderGenerated_%) H(wxFormBuilderGenerated_%) ; } } ################################################################################ # # wxFormBuilder.is-initialized() # ------------------------------ # # Returns whether this toolset has been initialized. # ################################################################################ rule is-initialized ( ) { return $(.initialized) ; } ################################################################################ # # Startup code executed when loading this module. # ################################################################################ # Global variables for this module. .executable = ; .initialized = ; if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ] { .debug-configuration = true ; }