1 [+] PWD/Pwd built-in added; usage:
3 [+] SORT/Sort built-in added; usage:
4 sorted = [ SORT $(list) ] ;
5 [+] COMMAND/Command built-in added; usage:
6 res = [ COMMAND shellcmd-list [[ : options ]] ];
8 exit-status, exit-code:
9 return exit code as last list element
11 don't return command output
13 don't trim command output;
14 default: trim left and right
16 don't left-trim command output
18 don't right-trim command output
19 status-first, code-first:
22 parse output as list (break on whitespaces -- <= ' ')
24 don't break on spaces (' ') when 'parse-output' activated
26 don't break on tabs ('\t') when 'parse-output' activated
27 no-nl-break, no-lf-break:
28 don't break on LF ('\n') when 'parse-output' activated
30 don't break on CR ('\r') when 'parse-output' activated
31 default: ignore command output, return empty string if everything is ok
32 or numeric exit code (non-zero)
33 [+] COMMAND/Command built-in synthax changed; new synthax:
34 res = [ COMMAND shellcmd-list [[ : options ]] ];
35 new options (added to common description)
36 [+] COMMAND/Command built-in now can parse command output
39 # VAR = [ RemoveOpt options-to-remove : options-list ] ;
40 # remove options from list
41 [+] rule RemoveOptWild
42 # VAR = [ RemoveOpt regexp-options-to-remove : options-list ] ;
43 # remove options from list with egrep-like regexps
46 # set compile flags for profile; works only for gcc/g++
48 # none, default: don't change
49 # empty: remove optimisation flags
50 # speed: optimise for speed and pIII
51 # size: optimise for size
52 # debug: don't optimize, add debug info
54 [+] rule ObjectNoAliasing
55 # ObjectNoAliasing filelist ;
56 # turn off aliasing optimization for specified files
57 # works only for gcc/g++
59 [*] MainC++ wasn't working properly
60 [*] XXXC++ variables changed to XXXC++ZZZ (MainC++ --> C++Main)
61 [+] LOCATE_BIN and ALL_LOCATE_BIN variables added (for Main and MainC++ targets)
62 so now one can do something like this:
63 ALL_LOCATE_TARGET = $(TOP)/build/obj ;
64 ALL_LOCATE_BIN = $(TOP)/build ;
65 and have a nice bunch of *.o files in build/obj and binary in build/
66 [+] new rule: lib-config
67 call $(1) --cflags and $(1) --libs (many libs provides such configurators)
68 add necessary flags to compiler and linker vars
69 return "tan" (non-empty string) if library is present
70 if $(2) != "" -- don't add flags, just check
71 [+] PATH_SEPARATOR variable added
72 [*] build process changed (.o and .a moved to subdir)
73 [+] allow []...] and [^]...] in globs (so ranges can include ']')
74 [+] :Q now quotes all special shell chars, not only '\'
75 [*] some regexprs was broken by tab expansion; fixed
76 [*] OPTIMC++ renamed to C++OPTIM
78 [+] LOCATE_LIB, LOCATE_LIBSO and ALL_LOCATE_LIB[SO] variables added (for Library and SharedLibrary targets)
79 so now one can do something like this:
80 ALL_LOCATE_TARGET = $(TOP)/build/obj ;
81 ALL_LOCATE_LIB = $(TOP)/build/liba ;
82 ALL_LOCATE_LIBSO = $(TOP)/build/libso ;
83 ALL_LOCATE_BIN = $(TOP)/build ;
84 and have a nice bunch of files in various dirs.
86 [*] JAMCMDARGS now set before parsing Jamfiles (and what sense was to set it after? %-)
87 [+] JAM_TARGETS variable added; scripts are free to modify it, so we can easy define targets from whithin
89 [+] SubIncludeOnce varname : TOP ... ;
90 will do SubInclude iff 'varname' is not set (and will set 'varname')
91 so one can include all necessary libraries in all necessary projects
93 [+] partial Objective C support:
94 ObjC-Main, std. set of OBJC* vars
95 OBJC_GNUSTEP_BASE_LIB = gnustep-base ;
96 OBJC_GNUSTEP_GUI_LIB = gnustep-gui ;
97 rules: ObjCUseGNUstepBase, ObjCUseGNUstepGui, ObjCUseGNUstep
99 [+] 'lib-config-ex' rule:
100 lib-config-ex "command" : "var-name-to-modify"
101 "var-name-to-modify" can be omited;
102 rule returs value of command
105 Echo-n: same as Echo, but does not writes '\n'
106 O-Flush: flush standard output (for Echo-n)
107 [+] added rules: LinkFlagsOn, C++LinkFlagsOn, ObjCLinkFlagsOn
108 same as Object*Flags, but for linker flags
109 we need this due to 'gristing' in multidir builds
111 [+] new variable: JAM_FORCE_GCC_OPTIONS
112 set it to override GCC detection
114 [+] rule set-profile:
115 selects 'debug', 'standard', 'speed' or 'size' profile according to vars:
118 OPT_SPEED = 1 : speed
121 [+] rule set-default-subdir-locates (sets my defaults for ALL_LOCATE_XXX: _build/, etc)
123 [+] alias for set-default-subdir-locates: set-default-target-locations ;
127 [+] jam now correctly creates dirs for files like 'dir/source'
128 [+] alias for set-default-subdir-locates: set-default-locations ;
130 [+] added acions for WINDOZE=1 (my own way to cross-build windoze soft with wine and mingw)
132 WINE -- wine command; default is "wine"
133 MGPATH -- path to mingw bin dir; default is "c:\mingw\bin\" (note the last '\')
134 MGCC -- mingw gcc compiler name; default is "mingw32-gcc.exe";
135 MG -- mingw g++ compiler name; default is "mingw32-g++.exe -static-libgcc"
136 vars for 'windoze-fix' rule (this rule should be invoked in Jamrules; it is harmless to
137 invoke it for any build scheme):
138 WINDOZE_THREADS -- if not empty, add "-mthreads"
139 WINSUBSYS -- either 'console' or 'windows'; default is 'console'
140 WINLIBS -- list of windoze libraries to add; default is '-lkernel32'
142 [!] WARNING! COMPATIBILITY BREAKING CHANGE!
143 [*] old SubInclude rule renamed to SubIncludeMany
144 [*] new SubInclude rule works as SubIncludeOnce (autogenerates guard var)
146 [+] new built-in: [ ExprI1 num0 op num1 ]
147 integer math; understands 5 standard ops ('%' as C '%')
148 [ ExprI1 40 + 2 ] ==> "42"
149 it also understands "<", "<=", ">", ">=", "=" and "!="
150 [+] [ ExprI1 "#" string ] -- return string length
151 [+] new built-in: [ Split str : delims ]
152 split `str` using `delims`
153 [ Split "a,b,c;d" : ",;" ] ==> a b c d
154 if `delims` is not specified, split string to chars
156 [+] lexer now needs less spaces (and sometimes more quoting)
157 [+] added header caching (when using set-default-locations rule)
159 [+] new build-in: [ NormPath pathstr ]
160 it will add 'pwd' if path is not absolute and will try to resolve some '.' and '..'
161 (only leading '..' though).
162 it can be used in SubDir replacement to automate dir building
164 [+] added 'rule name expansion':
165 rule print-foo { Echo "foo" ; }
169 [+] added default 'help' and 'push' targets
170 redefine actions AShowHelp and AGitPush in Jamrules to use the correspoinding target
172 [+] added help-profile target
174 [+] new variables: CFLAGS.all, OPTIM.all, LINKFLAGS.all, LINKLIBS.all
175 profile now sets *.all flags
177 [+] K8JAM-PROGRESS-TIME-DELTA variable (float, seconds between progress/time indicator)
179 [+] regexp engine now undestands some character classes (like :space:) and non-greedy ops
181 [+] call 'check-setup-windoze' rule to enable WINDOZE=1 builds
182 [+] setup-windoze rule will setup windoze build regardless of WINDOZE=1
183 [+] call use-mingw32 rule to use i686-pc-mingw32 crosscompiler instead of wine
184 [+] call windoze-fix after setting WINDOZE_THREADS, WINLIBS and WINSUBSYS
186 [+] sys-has-command cmd -- perform `which`, return "tan" or ""
188 [+] new built-in: ListLength
190 [+] `PreUserObject` rule
191 this rule will be called before `Object` rule decides how to build something;
192 the calling convention is the same as for `UserObject`, but `PreUserObject`
193 should return non-empty string if it wants to bypass default generator rules.
195 [+] documentation: built-in DependsList
197 returns a list of child dependencies for a given target
199 [+] new built-ins: HaveRule, HaveActions
200 HaveRule rulename [rulename...] [ : glob/regexp case-insensitive ignore-case ]
201 HaveActions rulename [rulename...] [ : glob/regexp case-insensitive ignore-case ]
202 returns non-empty string if all specified rules or actions are defined
203 note that we can have rule without actions and actions without rule
204 specify `glob` option to treat names as shell-like globs
205 specify `regexp` option to treat names as regexps
206 specify `case-insensitive` option to ignore case
208 [+] new built-in: ForceFile
209 reverts NoFile effect
211 [+] added flags to Glob and Match: now we can use globs and regexps, and do
212 that ignoring the case.
214 [+] new rule: FileExists fname [fname...] ;
215 returns non-empty string if all files exists; understand pathes.
230 [+] set-default-locations now recognizes DEBUG and respects BUILD_DIR
232 [+] new variables: CC.standard and C++.standard; defaults to gnu99 and gnu++98 if set-profile called
234 [+] new rule: DetectLibrary libnames [: includes [: pathes]]
235 default path list is $(DETECT_LIBRARY_PATH)
236 it will check $(p)/lib for library and $(p)/include for header
237 returns prefix or empty list
239 LIBJIMTCL_PFX = [ DetectLibrary libjim.a : jim.h : /opt/jim /opt/jim-tcl ] ;
240 if $(LIBJIMTCL_PFX) {
241 LINKFLAGS.all += -L$(LIBJIMTCL_PFX)/lib ;
242 LINKLIBS.all += -ljim ;
243 HDRS += $(LIBJIMTCL_PFX)/include ;
244 DEFINES += USE_JIM_TCL ;
247 [+] you can set K8JAM-JOBS variable to force number of jobs
249 [+] use DBG=1 to suppress NDEBUG define for non-debug profiles
251 [+] easy independent targets in *Main:
252 specify independent target name as 3rd arg to *Main:
253 Main alsatest : alsatest.c : alsatest ; # or Main alsatest : alsatest.c : _ ;
254 Main zytest : zytest.c : test tests ;
260 [+] 'clean' now doesn't clean 'Jamrules.auto.configure'; use 'distclean' to kill it
262 [+] JAMCONFIGARGS variable, which collects --* arguments
263 [+] 'config' now understands '--prefix' and sets PREFIX =? xxx
264 [+] InstallUserDefined rule:
265 # $(1): gristed source file
267 # $(3): directory to install
268 # $(LOCATE): the same as $(2) -- can be used in actions
270 [+] -configure-detect-library- now allows additional parameters (allow-any-lib and allow-any-header)
273 [+] *Main now understands some flags, which must be specified after file name:
276 processing.c !no-aliasing # add OPTIM_NOALIAS to build command
278 '!xyz' actually calls rule named --main-option-xyz-- if any, passing GRISTED filename as $(1) and
279 UNMODIFIED file name as $(2). sample no-aliasing rule:
280 rule --main-option-no-aliasing-- {
281 if $(OPTIM_NOALIAS) {
282 CCFLAGS on $(1) += $(OPTIM_NOALIAS) ;
283 C++FLAGS on $(1) += $(OPTIM_NOALIAS) ;
284 OBJCFLAGS on $(1) += $(OPTIM_NOALIAS) ;
287 use '!!filename' if your file name starts with '!'
289 [+] -configure-pkg-config-necessary- rule
290 optional: set PROJECT_NAME to project name which should be displayed on failure
291 -configure-pkg-config-necessary-
292 "GLib" "glib-2.0 >= 2.30.0"
297 [+] -configure-enable-disable-vars- variable to easy '--enable-xxx' and '--disable-xxx' options:
298 # "auto": check with pkg-config or so, show '--disable-xxx'
299 # "": disabled by default, show '--enable-xxx'
300 # non-empty string: enabled by default, show '--disable-xxx'
301 -configure-enable-disable-vars- +=
302 "sqlite" USE_SQLITE "auto" "don't use sqlite"
303 "gtkhtml" USE_GTKHTML "auto" "don't use GTKHTML"
304 "gtkspell" USE_GTKSPELL "auto" "don't use GTKSpell"
305 "svg" USE_RSVG "auto" "don't use librsvg"
306 "soup" USE_SOUP "auto" "don't use libsoup"
307 "curl" USE_CURL "auto" "don't use libcurl"
308 "dock" USE_DOCK "tan" "disable dock icon"
311 [*] Exit ; now exits without output and with SUCCESS exit code
313 [+] PROFILE variable now selects profile in set-profile rule
315 [+] RandName rule: generate random name
316 [ RandName ] -- /tmp/XXX
317 [ RandName "abc/" ] -- abc/XXX
318 [ RandName "" ] -- XXX
320 [+] ListWrite rule: write string list to file
321 ListFileWrite filename : list [: terminator] [: append]
322 default terminator is '\n'
325 [+] -configure-try-compile-cc- rule
326 $(1) -- program, string list
327 $(2) -- additional compiler flags (optional)
328 $(3) -- additional linker flags (optional)
329 rule -configure-test-timegm- {
330 return [ -configure-try-compile-cc-
331 "#include <stdlib.h>"
334 "struct tm _tm = { 0 };"
335 "_tm.tm_year = 2000;"
344 [+] -configure-test-compile-cc- rule:
346 $(2) -- program, string list
347 $(3) -- additional compiler flags (optional)
348 $(4) -- additional linker flags (optional)
350 [-] Echo-n removed, O-Flush removed, Echo now accepts some flags as $(2):
351 -n -- don't write newline
352 -Q -- don't write anything (so Echo : -n -Q will effectively do fflush(stdout);)
354 [+] Exit now accepts the same $(2) args as Echo