1################################################################################ 2# 3# Copyright (c) 2007-2008 Dario Senic, Jurko Gospodnetic. 4# 5# Use, modification and distribution is subject to the Boost Software 6# License Version 1.0. (See accompanying file LICENSE_1_0.txt or 7# http://www.boost.org/LICENSE_1_0.txt) 8# 9################################################################################ 10 11################################################################################ 12# 13# Boost Build wxFormBuilder generator tool module. 14# 15# wxFormBuilder is a GUI designer tool for the wxWidgets library. It can then 16# generate C++ sources modeling the designed GUI using the wxWidgets library 17# APIs. 18# 19# This module defines a wxFormBuilder project file type and rules needed to 20# generate C++ source files from those projects. With it you can simply list 21# wxFormBuilder projects as sources for some target and Boost Build will 22# automatically convert them to C++ sources and process from there. 23# 24# The wxFormBuilder executable location may be provided as a parameter when 25# configuring this toolset. Otherwise the default wxFormBuilder.exe executable 26# name is used located in the folder pointed to by the WXFORMBUILDER environment 27# variable. 28# 29# Current limitations: 30# 31# * Works only on Windows. 32# * Works only when run via Boost Jam using the native Windows cmd.exe command 33# interpreter, i.e. the default native Windows Boost Jam build. 34# * Used wxFormBuilder projects need to have their output file names defined 35# consistently with target names assumed by this build script. This means 36# that their target names must use the prefix 'wxFormBuilderGenerated_' and 37# have no output folder defined where the base name is equal to the .fpb 38# project file's name. 39# 40################################################################################ 41 42################################################################################ 43# 44# Implementation note: 45# 46# Avoiding the limitation on the generated target file names can be done but 47# would require depending on external tools to copy the wxFormBuilder project to 48# a temp location and then modify it in-place to set its target file names. On 49# the other hand wxFormBuilder is expected to add command-line options for 50# choosing the target file names from the command line which will allow us to 51# remove this limitation in a much cleaner way. 52# (23.08.2008.) (Jurko) 53# 54################################################################################ 55 56import generators ; 57import os ; 58import path ; 59import toolset ; 60import type ; 61 62 63################################################################################ 64# 65# wxFormBuilder.generate() 66# ------------------------ 67# 68# Action for processing WX_FORM_BUILDER_PROJECT types. 69# 70################################################################################ 71# 72# Implementation notes: 73# 74# wxFormBuilder generated CPP and H files need to be moved to the location 75# where the Boost Build target system expects them so that the generated CPP 76# file can be included into the compile process and that the clean rule 77# successfully deletes both CPP and H files. We expect wxFormBuilder to generate 78# files in the same location where the provided WX_FORM_BUILDER_PROJECT file is 79# located. 80# (15.05.2007.) (Dario) 81# 82################################################################################ 83 84actions generate 85{ 86 start "" /wait "$(EXECUTABLE)" /g "$(2)" 87 move "$(1[1]:BSR=$(2:P))" "$(1[1]:P)" 88 move "$(1[2]:BSR=$(2:P))" "$(1[2]:P)" 89} 90 91 92################################################################################ 93# 94# wxFormBuilder.init() 95# -------------------- 96# 97# Main toolset initialization rule called via the toolset.using rule. 98# 99################################################################################ 100 101rule init ( executable ? ) 102{ 103 if $(.initialized) 104 { 105 if $(.debug-configuration) 106 { 107 ECHO notice: [wxFormBuilder-cfg] Repeated initialization request 108 (executable \"$(executable:E="")\") detected and ignored. ; 109 } 110 } 111 else 112 { 113 local environmentVariable = WXFORMBUILDER ; 114 115 if $(.debug-configuration) 116 { 117 ECHO notice: [wxFormBuilder-cfg] Configuring wxFormBuilder... ; 118 } 119 120 # Deduce the path to the used wxFormBuilder executable. 121 if ! $(executable) 122 { 123 executable = "wxFormBuilder.exe" ; 124 local executable-path = [ os.environ $(environmentVariable) ] ; 125 if $(executable-path)-is-not-empty 126 { 127 executable = [ path.root $(executable) $(executable-path) ] ; 128 } 129 else if $(.debug-configuration) 130 { 131 ECHO notice: [wxFormBuilder-cfg] No wxFormBuilder path 132 configured either explicitly or using the 133 $(environmentVariable) environment variable. ; 134 ECHO notice: [wxFormBuilder-cfg] To avoid complications please 135 update your configuration to includes a correct path to the 136 wxFormBuilder executable. ; 137 ECHO notice: [wxFormBuilder-cfg] wxFormBuilder executable will 138 be searched for on the system path. ; 139 } 140 } 141 if $(.debug-configuration) 142 { 143 ECHO notice: [wxFormBuilder-cfg] Will use wxFormBuilder executable 144 \"$(executable)\". ; 145 } 146 147 # Now we are sure we have everything we need to initialize this toolset. 148 .initialized = true ; 149 150 # Store the path to the used wxFormBuilder executable. 151 .executable = $(executable) ; 152 153 # Type registration. 154 type.register WX_FORM_BUILDER_PROJECT : fbp ; 155 156 # Parameters to be forwarded to the action rule. 157 toolset.flags wxFormBuilder.generate EXECUTABLE : $(.executable) ; 158 159 # Generator definition and registration. 160 generators.register-standard wxFormBuilder.generate : 161 WX_FORM_BUILDER_PROJECT : CPP(wxFormBuilderGenerated_%) 162 H(wxFormBuilderGenerated_%) ; 163 } 164} 165 166 167################################################################################ 168# 169# wxFormBuilder.is-initialized() 170# ------------------------------ 171# 172# Returns whether this toolset has been initialized. 173# 174################################################################################ 175 176rule is-initialized ( ) 177{ 178 return $(.initialized) ; 179} 180 181 182################################################################################ 183# 184# Startup code executed when loading this module. 185# 186################################################################################ 187 188# Global variables for this module. 189.executable = ; 190.initialized = ; 191 192if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ] 193{ 194 .debug-configuration = true ; 195} 196