Compare commits
354 Commits
Author | SHA1 | Date | |
---|---|---|---|
8f0f320a07 | |||
12f6936084 | |||
866b40d872 | |||
f06d37c8b9 | |||
21f8e2435e | |||
97c4f7c757 | |||
b3df37e9ea | |||
1bf1c30242 | |||
b932380b3b | |||
e3ea429253 | |||
dca4c49770 | |||
b068fe7574 | |||
ecd91e1171 | |||
f36b71af3f | |||
90c3867cae | |||
20b5020284 | |||
cb540741a4 | |||
bc17a9b38f | |||
cec1331054 | |||
bb4657e465 | |||
29ca9b3f13 | |||
5ab982b84c | |||
e6e860e3c1 | |||
3cfffed7ec | |||
b2d47cd439 | |||
6a10d68fac | |||
88a8f2395d | |||
b82d6f2e62 | |||
150943f23f | |||
59f1a89f4f | |||
ea66501311 | |||
e9e3c6711f | |||
8269a98d01 | |||
19dee2b2a5 | |||
5b6353395d | |||
7e5c6e6b12 | |||
44f61da571 | |||
5c28e557bd | |||
ef7e9259cb | |||
6d5f44d4e5 | |||
8b2387f7a3 | |||
7b746db64e | |||
3aca248e9d | |||
3914dd896c | |||
df120af953 | |||
b745ae1153 | |||
693f8cec64 | |||
e12acccd33 | |||
bd9cf55b85 | |||
f5ab51c477 | |||
b0f2bbb7d5 | |||
c1dcfa297f | |||
034dbcd9a6 | |||
b5d5fe7a7b | |||
610b8f1266 | |||
a316c4f922 | |||
97dbaeb82d | |||
a2f72c6b87 | |||
7055cad73c | |||
4548f4e3c9 | |||
19dbab3426 | |||
69f5bea2b2 | |||
2ee9dda49d | |||
f011b23499 | |||
80d52f25b8 | |||
0face546e3 | |||
ca747232cd | |||
a7b46093e9 | |||
09892eed63 | |||
117df43f64 | |||
acc12822b6 | |||
8c7b43f60c | |||
7c8becc3f9 | |||
d1a35501ef | |||
28a245f0ab | |||
87a6d9f04f | |||
556c821cc6 | |||
441fc9bc65 | |||
1861874f5c | |||
|
6d51c5cbde | ||
73af83803a | |||
353f4f45bc | |||
5bac91f92f | |||
bbe9563ceb | |||
5ec74604c6 | |||
8e06efe61e | |||
0756874ddb | |||
dded5e2648 | |||
fbe60f6ba2 | |||
8dd9799666 | |||
f2c755c8bb | |||
01ca86de8b | |||
943fabd0d1 | |||
d08e2f6b5c | |||
90365dd197 | |||
8d05516c40 | |||
db49d86866 | |||
e667455c32 | |||
e62332aba6 | |||
397639849d | |||
96d5caf2e5 | |||
f4b10a30af | |||
cf52c3fc6f | |||
5378afb6f8 | |||
48d9273cc6 | |||
efea4f1181 | |||
b4fa6d965c | |||
ac56ad34f6 | |||
2fd533a32a | |||
c938ed71d1 | |||
ec60201a62 | |||
0cafb8c5b3 | |||
004810386b | |||
a15ee9daaf | |||
cd33405697 | |||
efa77066bf | |||
a1bb9d81fd | |||
0344f02cb1 | |||
d52bdaf046 | |||
ad7ccb771d | |||
044ee343ca | |||
eb54a2b64a | |||
2dd1ce9f1d | |||
1e157c79ec | |||
2385874f4a | |||
c5c42e6f4a | |||
9a627b2150 | |||
937c964c3e | |||
a2a1d08014 | |||
0ccf43cc96 | |||
d202e15a57 | |||
94f808b1fc | |||
51a9dd365f | |||
6e590b62a6 | |||
3aac190ad6 | |||
d6b9487e65 | |||
66d2700faa | |||
ba98af1424 | |||
cf4f80c9ae | |||
d74785d579 | |||
4fd822fb95 | |||
b39fd80d8c | |||
ef00c9f377 | |||
1ddc03b285 | |||
f686f9e787 | |||
b6c19b7f00 | |||
4fc18e5d91 | |||
cda5584448 | |||
30d82392b5 | |||
63d875da7f | |||
8593c5e219 | |||
9bf0abbece | |||
02ef6e0846 | |||
f97ee94e44 | |||
55a2ea6d6b | |||
59ab8e46c4 | |||
baebe744b3 | |||
0ad3f815c5 | |||
ca6336c715 | |||
a11c27f415 | |||
5c77cac354 | |||
46294b2a88 | |||
5f71781806 | |||
22b007df3a | |||
4339d358f8 | |||
e4b96b759f | |||
fcb686ac5f | |||
e5c690a4fc | |||
5b67ad88d3 | |||
dbd8b47bf9 | |||
8222958ae3 | |||
56f104b5e7 | |||
947a65a75e | |||
66fac4f982 | |||
254584435f | |||
f74d8202d3 | |||
bbf2319da6 | |||
812b1cbe9c | |||
0d2fe02b9c | |||
c7fb88db82 | |||
49f4367125 | |||
c4d062752d | |||
5b3e10ff72 | |||
5f1ad78e8c | |||
9f00063d57 | |||
6328ceee2a | |||
26a9307533 | |||
90886ed9ad | |||
8df73e9d11 | |||
f239b27c3a | |||
5e6b83411b | |||
54e77f235f | |||
4e08de9043 | |||
0d8aec0eb1 | |||
573a542f84 | |||
ef2a9084db | |||
bfcd0c0b05 | |||
215f5e4b51 | |||
6229cef015 | |||
6be0d322a7 | |||
89e43fea1c | |||
458eeaf93d | |||
dd3d468a28 | |||
a4dec210ae | |||
fa14102ba5 | |||
87a15b3868 | |||
f23fbcd6d1 | |||
b02a7573b9 | |||
d0cd0a14a4 | |||
5cb895f465 | |||
cd1c54bf0d | |||
a4fead7dc6 | |||
59a3cb4e10 | |||
785e8e18fd | |||
49e1bca1f7 | |||
fd054a07c4 | |||
328babe1f4 | |||
c60589a9c9 | |||
04fc9866c4 | |||
7a807575b2 | |||
787b3249a7 | |||
3115e55739 | |||
0c07ea0437 | |||
0e7c976089 | |||
921f0d2cb1 | |||
c23426c5aa | |||
ea2b1e73d1 | |||
9bf4b8fa96 | |||
008fa4844d | |||
568b78e2e2 | |||
3b00016278 | |||
a655d04541 | |||
5534878f68 | |||
1efee50b2c | |||
3ff09978f4 | |||
ac1fc6d106 | |||
06b9c98ed0 | |||
f58744d31f | |||
bf136e79f2 | |||
ab2fa1662f | |||
68118c2707 | |||
6ce3d59ad9 | |||
983862a528 | |||
658b73e4de | |||
b882f8de99 | |||
8426a54a57 | |||
ee1640008c | |||
7cfd23e16f | |||
5c3b615aee | |||
935848c3b5 | |||
d047a1bf29 | |||
016bf5eac7 | |||
33504f586b | |||
86594c62b6 | |||
ea25f62f7c | |||
f2cfc25604 | |||
a1f5f022d1 | |||
7992450383 | |||
b41a368da1 | |||
1b63dc7503 | |||
db788cdd35 | |||
3f8b4d616f | |||
aac32d20b0 | |||
12f1909d35 | |||
31ef45258f | |||
9f9b7f0bf4 | |||
918c629435 | |||
eaac473f44 | |||
fa5aa51daa | |||
347d651ab6 | |||
08085f09c4 | |||
5915ac2b95 | |||
a98c111cd2 | |||
93ffed2eb2 | |||
f8e6666a2c | |||
5720662b7c | |||
432d221be2 | |||
|
a1efb1c1b3 | ||
7c7ee142e0 | |||
ba69f05e99 | |||
6180410cc4 | |||
2d44a88fb6 | |||
28e3781331 | |||
c0a28d0207 | |||
0e27e967d0 | |||
1ecce7e99e | |||
25b73ebd8f | |||
bca963af5c | |||
ba5377a1ce | |||
8d7fd4bda8 | |||
e3e2e46d6e | |||
9e0ce5a55c | |||
b88131eb2f | |||
dff80587ac | |||
cd2696dd0b | |||
36643c1ab1 | |||
778d9ed8b2 | |||
660d30558a | |||
82fbd34149 | |||
e0b82d37af | |||
7a90325b67 | |||
49116e6b59 | |||
90300a1606 | |||
1eb07e9a22 | |||
9975eec165 | |||
04c0a6a86f | |||
bfdf3a12fd | |||
6dd9c835ce | |||
cfec0dcadc | |||
a1c1cc1855 | |||
add9f9c50d | |||
ba3d656110 | |||
ab4ca71ac7 | |||
aba11155a4 | |||
3b586cb476 | |||
88fd4bd405 | |||
7869d38dd8 | |||
e8990199ef | |||
6078cb0977 | |||
85b0111a6e | |||
6bb0a55a55 | |||
95d5ada865 | |||
cd9fffd828 | |||
30511a3443 | |||
d656df5407 | |||
d54d363a25 | |||
697db2a987 | |||
daa90e431c | |||
bdeaec11ba | |||
7eeb6312ba | |||
07d9b97ddc | |||
af033ee4e0 | |||
c9de4f37e6 | |||
64caaa9a53 | |||
d196845c85 | |||
5288a47bfb | |||
9bd9abcad1 | |||
b5a8b6f628 | |||
|
7edcef2b30 | ||
|
c34821864e | ||
97c24eec6b | |||
053df2360f | |||
8d766e4804 | |||
e29ec5a126 | |||
de46bb0cc1 | |||
084080a682 | |||
3a564c0ca2 | |||
ac89a122d8 | |||
ea6ae1be10 | |||
a649c7f4cb | |||
2f83f36659 | |||
a46936bc0b | |||
95ee63292e | |||
bcd33fe098 |
6
.gitignore
vendored
6
.gitignore
vendored
@ -3,5 +3,9 @@
|
|||||||
/_yardoc/
|
/_yardoc/
|
||||||
/build_test_run/
|
/build_test_run/
|
||||||
/coverage/
|
/coverage/
|
||||||
/doc/
|
/dist/
|
||||||
|
/gen/
|
||||||
|
/large_project/
|
||||||
/pkg/
|
/pkg/
|
||||||
|
/test/
|
||||||
|
/yard/
|
||||||
|
253
CHANGELOG.md
253
CHANGELOG.md
@ -1,80 +1,193 @@
|
|||||||
## ChangeLog
|
## v3.0.2
|
||||||
|
|
||||||
### v1.17.0
|
### Fixes
|
||||||
|
|
||||||
#### New Features
|
- #159 - Compiler check configure methods should respect :use flag
|
||||||
|
- #160 - Configure parameters should not be stored as unscoped construction variables
|
||||||
|
|
||||||
|
## v3.0.1
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- #156 - Avoid running configure operation twice
|
||||||
|
- #157 - Load configure task arguments before early configure operations
|
||||||
|
- #158 - Do not configure for clean tasks when not yet configured
|
||||||
|
|
||||||
|
## v3.0.0
|
||||||
|
|
||||||
|
- #136 - Move rsconscache into build directory
|
||||||
|
- #140 - Support naming environments
|
||||||
|
- #143 - Add Size builder
|
||||||
|
- #142 - Add 'sh' script DSL method
|
||||||
|
- #144 - Add FileUtils class methods to script DSL
|
||||||
|
- #145 - Support environment variable to set rscons build directory
|
||||||
|
- #146 - Add ^^/ shortcut to top-level build directory
|
||||||
|
- #139 - Add tasks
|
||||||
|
- #147 - Add task options
|
||||||
|
- #148 - Add license/copyright to distributable script
|
||||||
|
- #150 - Add env.expand() shortcut method to expand paths and construction variables
|
||||||
|
- #152 - Add download script method
|
||||||
|
- #153 - Allow passing spawn options to sh
|
||||||
|
- #154 - Record build directory absolute path
|
||||||
|
- #149 - Add shortcut method for creating environments
|
||||||
|
- #131 - Only configure if necessary
|
||||||
|
- #151 - Store configure task parameters in configuration cache data
|
||||||
|
- #137 - Add variants
|
||||||
|
- #155 - Add build_dir script method
|
||||||
|
|
||||||
|
## v2.3.0
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
- #125 - Support subsidiary Rsconscript files
|
||||||
|
- #126 - Add PATH manipulation methods
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- #121 - env.depends() does not work with build-root-relative "^/" paths
|
||||||
|
- #130 - Document -f command line option
|
||||||
|
- #133 - Clarify failed command error message indicating to run -F
|
||||||
|
- #134 - Document CMD_STDOUT variable for Command builder
|
||||||
|
- #135 - Write dependency file to build directory when user invokes Object builder directly
|
||||||
|
- #141 - Document phony targets
|
||||||
|
|
||||||
|
## v2.2.0
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
- #120 - improve support for MSYS2
|
||||||
|
- #119 - add failure messages for failed configuration checks
|
||||||
|
- #118 - compiler checks should support cross-compilers and freestanding compilers
|
||||||
|
|
||||||
|
## v2.1.0
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
- #117 - ruby 2.7 compatibility
|
||||||
|
|
||||||
|
## v2.0.2
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- #113 - distinguish object files built from multiple sources with the same base name but different extensions
|
||||||
|
|
||||||
|
## v2.0.1
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- #112 - Install builder cannot replace a currently executing binary on Linux
|
||||||
|
|
||||||
|
## v2.0.0
|
||||||
|
|
||||||
|
- convert rscons from a Ruby gem to a standalone script
|
||||||
|
- compress rscons distributable script
|
||||||
|
- add configure operation to detect compilers, check for headers/libraries, etc... (invoked automatically if needed)
|
||||||
|
- Environments store builder classes instead of instances of builder classes
|
||||||
|
- use a separate Builder instance for each build operation
|
||||||
|
- load Rsconscript from Rsconscript/Rsconscript.rb instead of Rsconsfile
|
||||||
|
- drop support for builder run methods using the old 5 parameter signature
|
||||||
|
- remove Environment#build_dir
|
||||||
|
- set Environment build root in configure step
|
||||||
|
- remove Builder#finalize (now #run called repeatedly until builder completes)
|
||||||
|
- remove Builder#setup
|
||||||
|
- remove Builder#features and Builder#produces?
|
||||||
|
- add functionality to allow builders to wait on Ruby threads or other builders
|
||||||
|
- add install/uninstall/distclean command-line operations
|
||||||
|
- preserve makefile dependency files under build directory
|
||||||
|
- remove a few deprecated methods
|
||||||
|
- pass a Builder instance to build hooks instead of a build operation Hash
|
||||||
|
- support a basic markup syntax in builder run messages to colorize target/source files
|
||||||
|
- hide (but store) failed compilation command by default so the user doesn't have to scroll back as much to see compiler output
|
||||||
|
- refactor to remove some redundancy among built-in builders
|
||||||
|
- track object file source language (correctly determine linker when only passed object files previously built by particular toolchains)
|
||||||
|
- add barriers
|
||||||
|
- add InstallDirectory builder
|
||||||
|
- change Install builder to copy files on 'install' operation
|
||||||
|
- add "prefix" construction variable based on configured installation prefix
|
||||||
|
- allow passing builder objects as sources to build targets
|
||||||
|
- differentiate 'build' targets from 'install' targets in cache contents
|
||||||
|
- add verbose mode
|
||||||
|
- show build progress as a percentage in builder output messages
|
||||||
|
- various performance improvements
|
||||||
|
- wrote a new user guide
|
||||||
|
- added new website ([https://holtrop.github.io/rscons/](https://holtrop.github.io/rscons/))
|
||||||
|
- added new logo
|
||||||
|
|
||||||
|
## v1.17.0
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
- allow construction variable expansion on `true` and `false` values.
|
- allow construction variable expansion on `true` and `false` values.
|
||||||
- remove makefile target name check when parsing dependencies
|
- remove makefile target name check when parsing dependencies
|
||||||
|
|
||||||
### v1.16.0
|
## v1.16.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- Add `Rscons.glob`
|
- Add `Rscons.glob`
|
||||||
- Support command-line variables
|
- Support command-line variables
|
||||||
- improve debuggability of cache.up_to_date?
|
- improve debuggability of `cache.up_to_date?`
|
||||||
- allow passing a VarSet into cache methods
|
- allow passing a VarSet into cache methods
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- generate dependencies for D builds
|
- generate dependencies for D builds
|
||||||
|
|
||||||
### v1.15.0
|
## v1.15.0
|
||||||
|
|
||||||
- allow json 1.x or 2.x
|
- allow json 1.x or 2.x
|
||||||
|
|
||||||
### v1.14.0
|
## v1.14.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- #45 - Add Rscons::VarSet#values_at
|
- #45 - Add `Rscons::VarSet#values_at`
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- #44 - Environment#print_builder_run_message should support string commands
|
- #44 - `Environment#print_builder_run_message` should support string commands
|
||||||
|
|
||||||
### v1.13.0
|
## v1.13.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- #43 - Add ability to record side-effect file production
|
- #43 - Add ability to record side-effect file production
|
||||||
|
|
||||||
### v1.12.0
|
## v1.12.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- #40 - env.depends should imply env.build_after
|
- #40 - env.depends should imply `env.build_after`
|
||||||
- #41 - be more colorful
|
- #41 - be more colorful
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- #39 - wait for in-progress subcommands to complete on build failure
|
- #39 - wait for in-progress subcommands to complete on build failure
|
||||||
- #42 - cloned Environments should inherit n_threads
|
- #42 - cloned Environments should inherit `n_threads`
|
||||||
|
|
||||||
### v1.11.1
|
## v1.11.1
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- fix the circular build dependency detection logic
|
- fix the circular build dependency detection logic
|
||||||
|
|
||||||
### v1.11.0
|
## v1.11.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- Change default Environment :clone option to :all to clone all attributes
|
- Change default Environment :clone option to :all to clone all attributes
|
||||||
- #38 - raise error when circular dependencies are found
|
- #38 - raise error when circular dependencies are found
|
||||||
- #34 - Allow overriding n_threads on a per-Environment level
|
- #34 - Allow overriding `n_threads` on a per-Environment level
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- #35 - env.build_after should expand paths
|
- #35 - `env.build_after` should expand paths
|
||||||
- #36 - SHCFLAGS and SHCXXFLAGS should inherit non-SH flags by default
|
- #36 - `SHCFLAGS` and `SHCXXFLAGS` should inherit non-SH flags by default
|
||||||
- #37 - Fix non-blocking thread-wait if Rscons.n_threads is set to 0
|
- #37 - Fix non-blocking thread-wait if `Rscons.n_threads` is set to 0
|
||||||
|
|
||||||
### v1.10.0
|
## v1.10.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- #23 - add parallelization - builds are now parallelized by default
|
- #23 - add parallelization - builds are now parallelized by default
|
||||||
- #31 - add LEXSUFFIX, YACCSUFFIX construction variables
|
- #31 - add LEXSUFFIX, YACCSUFFIX construction variables
|
||||||
@ -84,100 +197,100 @@
|
|||||||
- Add builder features
|
- Add builder features
|
||||||
- #8 - add SharedObject and SharedLibrary builders
|
- #8 - add SharedObject and SharedLibrary builders
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- expand target and source paths before calling Builder#create_build_target
|
- expand target and source paths before calling `Builder#create_build_target`
|
||||||
- #29 - fix PROGSUFFIX handling
|
- #29 - fix `PROGSUFFIX` handling
|
||||||
- #32 - Pre-build hooks do not respect modified key values
|
- #32 - Pre-build hooks do not respect modified key values
|
||||||
|
|
||||||
### v1.9.3
|
## v1.9.3
|
||||||
|
|
||||||
- Environment#parse_flags should put -std=XXX flags in CCFLAGS, not CFLAGS
|
- `Environment#parse_flags` should put -std=XXX flags in CCFLAGS, not CFLAGS
|
||||||
|
|
||||||
### v1.9.2
|
## v1.9.2
|
||||||
|
|
||||||
- allow phony targets in conjunction with build roots
|
- allow phony targets in conjunction with build roots
|
||||||
|
|
||||||
### v1.9.1
|
## v1.9.1
|
||||||
|
|
||||||
- change *SUFFIX defaults to arrays
|
- change *SUFFIX defaults to arrays
|
||||||
- add various C++ file suffixes
|
- add various C++ file suffixes
|
||||||
- use ${INCPREFIX} instead of hard-coded "-I" in Preprocess builder
|
- use ${INCPREFIX} instead of hard-coded "-I" in Preprocess builder
|
||||||
|
|
||||||
### v1.9.0
|
## v1.9.0
|
||||||
|
|
||||||
#### New Features
|
### New Features
|
||||||
|
|
||||||
- #6 - add Install and Copy builders
|
- #6 - add Install and Copy builders
|
||||||
- #22 - allow overriding Command builder short description with CMD_DESC variable
|
- #22 - allow overriding Command builder short description with `CMD_DESC` variable
|
||||||
- #24 - add "rscons" executable
|
- #24 - add "rscons" executable
|
||||||
- #25 - add support for phony targets given as Symbols instead of Strings
|
- #25 - add support for phony targets given as Symbols instead of Strings
|
||||||
- #26 - support registering multiple build targets with the same target name
|
- #26 - support registering multiple build targets with the same target name
|
||||||
- #27 - add Directory builder
|
- #27 - add Directory builder
|
||||||
|
|
||||||
#### Fixes
|
### Fixes
|
||||||
|
|
||||||
- #20 - fix variable references that expand to arrays in build target sources
|
- #20 - fix variable references that expand to arrays in build target sources
|
||||||
- #21 - rework Preprocess builder to consider deep dependencies
|
- #21 - rework Preprocess builder to consider deep dependencies
|
||||||
- fix Rscons.set_suffix to append the given suffix if the filename has none
|
- fix `Rscons.set_suffix` to append the given suffix if the filename has none
|
||||||
- remove ${CFLAGS} from default CPP_CMD
|
- remove ${CFLAGS} from default `CPP_CMD`
|
||||||
|
|
||||||
### v1.8.1
|
## v1.8.1
|
||||||
|
|
||||||
- fix Environment#dump when construction variables are symbols
|
- fix Environment#dump when construction variables are symbols
|
||||||
|
|
||||||
### v1.8.0
|
## v1.8.0
|
||||||
|
|
||||||
- new Command builder to execute arbitrary user commands
|
- new Command builder to execute arbitrary user commands
|
||||||
- new SimpleBuilder class
|
- new SimpleBuilder class
|
||||||
- create new builders quickly by passing a block to Environment#add_builder
|
- create new builders quickly by passing a block to `Environment#add_builder`
|
||||||
- improved YARD documentation
|
- improved YARD documentation
|
||||||
- add Environment#dump to debug Environment construction variables
|
- add Environment#dump to debug Environment construction variables
|
||||||
|
|
||||||
### v1.7.0
|
## v1.7.0
|
||||||
|
|
||||||
- allow build hooks to register new build targets
|
- allow build hooks to register new build targets
|
||||||
- add post-build hooks (register with Environment#add_post_build_hook)
|
- add post-build hooks (register with `Environment#add_post_build_hook`)
|
||||||
- clear all build targets after processing an Environment
|
- clear all build targets after processing an Environment
|
||||||
- allow trailing slashes in arguments to Environment#build_dir
|
- allow trailing slashes in arguments to `Environment#build_dir`
|
||||||
|
|
||||||
### v1.6.1
|
## v1.6.1
|
||||||
|
|
||||||
- add DEPFILESUFFIX construction variable to override dependency file suffix
|
- add DEPFILESUFFIX construction variable to override dependency file suffix
|
||||||
- fix Environment#depends to expand its arguments for construction variables
|
- fix Environment#depends to expand its arguments for construction variables
|
||||||
|
|
||||||
### v1.6.0
|
## v1.6.0
|
||||||
|
|
||||||
- support lambdas as construction variable values
|
- support lambdas as construction variable values
|
||||||
|
|
||||||
### v1.5.0
|
## v1.5.0
|
||||||
|
|
||||||
- add "json" as a runtime dependency
|
- add "json" as a runtime dependency
|
||||||
- update construction variables to match SCons more closely
|
- update construction variables to match SCons more closely
|
||||||
- add CPPDEFPREFIX, INCPREFIX, CPPDEFINES, CCFLAGS, LIBDIRPREFIX, and LIBLINKPREFIX
|
- add `CPPDEFPREFIX`, `INCPREFIX`, `CPPDEFINES`, `CCFLAGS`, `LIBDIRPREFIX`, and `LIBLINKPREFIX`
|
||||||
- add Environment#shell
|
- add `Environment#shell`
|
||||||
- add Environment#parse_flags, #parse_flags!, #merge_flags
|
- add `Environment#parse_flags`, `#parse_flags!`, `#merge_flags`
|
||||||
- unbuffer $stdout by default
|
- unbuffer `$stdout` by default
|
||||||
- add PROGSUFFIX construction variable (defaults to .exe on MinGW/Cygwin)
|
- add `PROGSUFFIX` construction variable (defaults to `.exe` on MinGW/Cygwin)
|
||||||
- add Rscons::BuildTarget and Builder#create_build_target
|
- add `Rscons::BuildTarget` and `Builder#create_build_target`
|
||||||
- update specs to RSpec 3.x and fix to run on MinGW/Cygwin/Linux
|
- update specs to RSpec 3.x and fix to run on MinGW/Cygwin/Linux
|
||||||
- add YARD documentation to get to 100% coverage
|
- add YARD documentation to get to 100% coverage
|
||||||
|
|
||||||
### v1.4.3
|
## v1.4.3
|
||||||
|
|
||||||
- fix builders properly using construction variable overrides
|
- fix builders properly using construction variable overrides
|
||||||
- expand nil construction variables to empty strings
|
- expand nil construction variables to empty strings
|
||||||
|
|
||||||
### v1.4.2
|
## v1.4.2
|
||||||
|
|
||||||
- add Environment#expand_path
|
- add `Environment#expand_path`
|
||||||
- expand construction variable references in builder targets and sources before invoking builder
|
- expand construction variable references in builder targets and sources before invoking builder
|
||||||
|
|
||||||
### v1.4.1
|
## v1.4.1
|
||||||
|
|
||||||
- fix invoking a builder with no sources while a build root defined
|
- fix invoking a builder with no sources while a build root defined
|
||||||
|
|
||||||
### v1.4.0
|
## v1.4.0
|
||||||
|
|
||||||
- add CFile builder
|
- add CFile builder
|
||||||
- add Disassemble builder
|
- add Disassemble builder
|
||||||
@ -190,21 +303,21 @@
|
|||||||
- implement copy-on-write semantics for construction variables when cloning Environments
|
- implement copy-on-write semantics for construction variables when cloning Environments
|
||||||
- only load the cache once instead of on each Environment#process
|
- only load the cache once instead of on each Environment#process
|
||||||
- only write the cache when something has changed
|
- only write the cache when something has changed
|
||||||
- fix Cache#mkdir_p to handle relative paths (Issue #5)
|
- fix `Cache#mkdir_p` to handle relative paths (Issue #5)
|
||||||
- flush the cache to disk if a builder raises an exception (Issue #4)
|
- flush the cache to disk if a builder raises an exception (Issue #4)
|
||||||
|
|
||||||
### v1.3.0
|
## v1.3.0
|
||||||
|
|
||||||
- change Environment#execute() options parameter to accept the following options keys:
|
- change Environment#execute() options parameter to accept the following options keys:
|
||||||
- :env to pass an environment Hash to Kernel#system
|
- :env to pass an environment Hash to Kernel#system
|
||||||
- :options to pass an options Hash to Kernel#system
|
- :options to pass an options Hash to Kernel#system
|
||||||
|
|
||||||
### v1.2.0
|
## v1.2.0
|
||||||
|
|
||||||
- add :clone option to Environment#clone to control exactly which Environment attributes are cloned
|
- add :clone option to Environment#clone to control exactly which Environment attributes are cloned
|
||||||
- allow nil to be passed in to Environment#build_root=
|
- allow nil to be passed in to `Environment#build_root=`
|
||||||
|
|
||||||
### v1.1.0
|
## v1.1.0
|
||||||
|
|
||||||
- Change Cache#up_to_date?() and #register_build() to accept a single target
|
- Change `Cache#up_to_date?` and `#register_build` to accept a single target
|
||||||
file or an array of target file names
|
file or an array of target file names
|
||||||
|
14
DEVELOPING.md
Normal file
14
DEVELOPING.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Developing
|
||||||
|
|
||||||
|
# Specs
|
||||||
|
|
||||||
|
To run the rscons specs, the following commands must be available:
|
||||||
|
|
||||||
|
* gcc
|
||||||
|
* clang
|
||||||
|
* g++
|
||||||
|
* clang++
|
||||||
|
* gdc
|
||||||
|
* ldc
|
||||||
|
* flex
|
||||||
|
* bison
|
14
Gemfile
14
Gemfile
@ -1,4 +1,14 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
# Specify your gem's dependencies in rscons.gemspec
|
gem "rspec"
|
||||||
gemspec
|
gem "rake"
|
||||||
|
gem "simplecov", "~> 0.15.0"
|
||||||
|
if RbConfig::CONFIG["host"]["msys"]
|
||||||
|
gem "json", "2.1.0"
|
||||||
|
else
|
||||||
|
gem "json"
|
||||||
|
gem "yard"
|
||||||
|
gem "rdoc"
|
||||||
|
gem "redcarpet"
|
||||||
|
gem "syntax"
|
||||||
|
end
|
||||||
|
58
Gemfile.lock
58
Gemfile.lock
@ -1,48 +1,52 @@
|
|||||||
PATH
|
|
||||||
remote: .
|
|
||||||
specs:
|
|
||||||
rscons (1.17.0)
|
|
||||||
json (>= 1.8, < 3.0)
|
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
diff-lcs (1.3)
|
diff-lcs (1.5.0)
|
||||||
docile (1.3.2)
|
docile (1.1.5)
|
||||||
json (2.2.0)
|
json (2.6.1)
|
||||||
rake (12.3.2)
|
psych (4.0.3)
|
||||||
rdoc (6.1.1)
|
stringio
|
||||||
rspec (3.8.0)
|
rake (13.0.6)
|
||||||
rspec-core (~> 3.8.0)
|
rdoc (6.4.0)
|
||||||
rspec-expectations (~> 3.8.0)
|
psych (>= 4.0.0)
|
||||||
rspec-mocks (~> 3.8.0)
|
redcarpet (3.5.1)
|
||||||
rspec-core (3.8.2)
|
rspec (3.11.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-core (~> 3.11.0)
|
||||||
rspec-expectations (3.8.4)
|
rspec-expectations (~> 3.11.0)
|
||||||
|
rspec-mocks (~> 3.11.0)
|
||||||
|
rspec-core (3.11.0)
|
||||||
|
rspec-support (~> 3.11.0)
|
||||||
|
rspec-expectations (3.11.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-mocks (3.8.1)
|
rspec-mocks (3.11.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-support (3.8.2)
|
rspec-support (3.11.0)
|
||||||
simplecov (0.15.0)
|
simplecov (0.15.1)
|
||||||
docile (~> 1.1.0)
|
docile (~> 1.1.0)
|
||||||
json (>= 1.8, < 3)
|
json (>= 1.8, < 3)
|
||||||
simplecov-html (~> 0.10.0)
|
simplecov-html (~> 0.10.0)
|
||||||
simplecov-html (0.10.2)
|
simplecov-html (0.10.2)
|
||||||
yard (0.9.20)
|
stringio (3.0.1)
|
||||||
|
syntax (1.2.2)
|
||||||
|
webrick (1.7.0)
|
||||||
|
yard (0.9.27)
|
||||||
|
webrick (~> 1.7.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
x86-mingw32
|
x86-mingw32
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
json
|
||||||
rake
|
rake
|
||||||
rdoc
|
rdoc
|
||||||
rscons!
|
redcarpet
|
||||||
rspec
|
rspec
|
||||||
simplecov
|
simplecov (~> 0.15.0)
|
||||||
|
syntax
|
||||||
yard
|
yard
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.17.3
|
2.2.31
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2013 Josh Holtrop
|
Copyright (c) 2013-2022 Josh Holtrop
|
||||||
|
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
629
README.md
629
README.md
@ -1,591 +1,42 @@
|
|||||||
# Rscons
|
# Rscons
|
||||||
|
|
||||||
Rscons (https://github.com/holtrop/rscons) is a software construction framework
|

|
||||||
inspired by SCons and implemented in Ruby.
|
|
||||||
|
Rscons (https://github.com/holtrop/rscons) is an open-source build system
|
||||||
[](http://badge.fury.io/rb/rscons)
|
for developers.
|
||||||
|
It supports the following features:
|
||||||
## Installation
|
|
||||||
|
* multi-threaded job execution
|
||||||
$ gem install rscons
|
* auto-configuration
|
||||||
|
* built-in builders for several common operations
|
||||||
## Usage
|
* out-of-the-box support for C, C++, and D languages
|
||||||
|
* extensibility for other languages or custom builders
|
||||||
### Standalone
|
* compatible with Windows, Linux, OS X, and FreeBSD
|
||||||
|
* colorized output with build progress
|
||||||
Rscons provides a standalone executable ("rscons") with a command-line
|
* build hooks
|
||||||
interface. The rscons executable will read a build script (by default named
|
* user-defined tasks with dependencies and custom parameters
|
||||||
Rsconsfile or Rsconsfile.rb) and execute its contents.
|
* build variants
|
||||||
|
|
||||||
### With Rake
|
At its core, Rscons is mainly an engine to:
|
||||||
|
|
||||||
Rscons can be used with rake as well. The same content that would be written
|
* determine the proper order to perform build steps,
|
||||||
in Rsconsfile can be placed in a Rakefile. It could be placed within a rake
|
* determine whether each build target is up to date or in need of rebuild, and
|
||||||
task block or split among multiple tasks.
|
* schedule those build steps across multiple threads as efficiently as possible.
|
||||||
|
|
||||||
## Example Build Scripts
|
Along the way, Rscons provides a concise syntax for specifying common types of
|
||||||
|
build steps, but also provides an extensible framework for performing
|
||||||
### Example: Building a C Program
|
custom build operations as well.
|
||||||
|
|
||||||
```ruby
|
Rscons takes inspiration from:
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env["CFLAGS"] << "-Wall"
|
* [SCons](https://scons.org/)
|
||||||
env.Program("program", Rscons.glob("src/**/*.c"))
|
* [waf](https://waf.io/)
|
||||||
end
|
* [rake](https://github.com/ruby/rake)
|
||||||
```
|
* [CMake](https://cmake.org/)
|
||||||
|
* [Autoconf](https://www.gnu.org/software/autoconf/)
|
||||||
### Example: Building a D Program
|
|
||||||
|
Rscons is written in Ruby.
|
||||||
```ruby
|
The only requirement to run Rscons is that the system has a Ruby interpreter
|
||||||
Rscons::Environment.new do |env|
|
installed.
|
||||||
env["DFLAGS"] << "-Wall"
|
|
||||||
env.Program("program", Rscons.glob("src/**/*.d"))
|
See [https://holtrop.github.io/rscons/index.html](https://holtrop.github.io/rscons/index.html) for User Guide and Installation instructions.
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Cloning an Environment
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
main_env = Rscons::Environment.new do |env|
|
|
||||||
# Store object files from sources under "src" in "build/main"
|
|
||||||
env.build_dir("src", "build/main")
|
|
||||||
env["CFLAGS"] = ["-DSOME_DEFINE", "-O3"]
|
|
||||||
env["LIBS"] = ["SDL"]
|
|
||||||
env.Program("program", Rscons.glob("src/**/*.cc"))
|
|
||||||
end
|
|
||||||
|
|
||||||
debug_env = main_env.clone do |env|
|
|
||||||
# Store object files from sources under "src" in "build/debug"
|
|
||||||
env.build_dir("src", "build/debug")
|
|
||||||
env["CFLAGS"] -= ["-O3"]
|
|
||||||
env["CFLAGS"] += ["-g", "-O0"]
|
|
||||||
env.Program("program-debug", Rscons.glob("src/**/*.cc"))
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Custom Builder
|
|
||||||
|
|
||||||
Custom builders are implemented as classes which extend from `Rscons::Builder`.
|
|
||||||
The builder must have a `run` method which is called to invoke the builder.
|
|
||||||
The `run` method should return the name of the target built on success, and
|
|
||||||
`false` on failure.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
class GenerateFoo < Rscons::Builder
|
|
||||||
def run(target, sources, cache, env, vars)
|
|
||||||
cache.mkdir_p(File.dirname(target))
|
|
||||||
File.open(target, "w") do |fh|
|
|
||||||
fh.puts <<EOF
|
|
||||||
#define GENERATED 42
|
|
||||||
EOF
|
|
||||||
end
|
|
||||||
target
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.add_builder(GenerateFoo.new)
|
|
||||||
env.GenerateFoo("foo.h", [])
|
|
||||||
env.Program("a.out", Rscons.glob("*.c"))
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Custom Builder That Only Regenerates When Necessary
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
class CmdBuilder < Rscons::Builder
|
|
||||||
def run(target, sources, cache, env, vars)
|
|
||||||
cmd = ["cmd", "-i", sources.first, "-o", target]
|
|
||||||
unless cache.up_to_date?(target, cmd, sources, env)
|
|
||||||
cache.mkdir_p(File.dirname(target))
|
|
||||||
system(cmd)
|
|
||||||
cache.register_build(target, cmd, sources, env)
|
|
||||||
end
|
|
||||||
target
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.add_builder(CmdBuilder.new)
|
|
||||||
env.CmdBuilder("foo.gen", "foo_gen.cfg")
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
The `Cache#up_to_date?` method accepts an optional 5th parameter which is an
|
|
||||||
options Hash. The `:debug` option can be specified in this Hash with a value
|
|
||||||
of `true` to aid in debugging builders while developing them. For example:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
unless cache.up_to_date?(target, cmd, sources, env, debug: true)
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Custom Builder That Generates Multiple Output Files
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
class CModuleGenerator < Rscons::Builder
|
|
||||||
def run(target, sources, cache, env, vars)
|
|
||||||
c_fname = target
|
|
||||||
h_fname = target.sub(/\.c$/, ".h")
|
|
||||||
cmd = ["generate_c_and_h", sources.first, c_fname, h_fname]
|
|
||||||
unless cache.up_to_date?([c_fname, h_fname], cmd, sources, env)
|
|
||||||
cache.mkdir_p(File.dirname(target))
|
|
||||||
system(cmd)
|
|
||||||
cache.register_build([c_fname, h_fname], cmd, sources, env)
|
|
||||||
end
|
|
||||||
target
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.add_builder(CModuleGenerator.new)
|
|
||||||
env.CModuleGenerator("build/foo.c", "foo_gen.cfg")
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Custom Builder Using Builder#standard_build()
|
|
||||||
|
|
||||||
The `standard_build` method from the `Rscons::Builder` base class can be used
|
|
||||||
when the builder needs to execute a system command to produce the target file.
|
|
||||||
The `standard_build` method will return the correct value so its return value
|
|
||||||
can be used as the return value from the `run` method.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
class CmdBuilder < Rscons::Builder
|
|
||||||
def run(target, sources, cache, env, vars)
|
|
||||||
cmd = ["cmd", "-i", sources.first, "-o", target]
|
|
||||||
standard_build("CmdBld #{target}", target, cmd, sources, env, cache)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.add_builder(CmdBuilder.new)
|
|
||||||
env.CmdBuilder("foo.gen", "foo_gen.cfg")
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Custom Builder Using Environment#add_builder()
|
|
||||||
|
|
||||||
The `add_builder` method of the `Rscons::Environment` class optionally allows
|
|
||||||
you to define and register a builder by providing a name and action block. This
|
|
||||||
can be useful if the builder you are trying to define is easily expressed as a
|
|
||||||
short ruby procedure. When `add_builder` is called in this manner a new builder
|
|
||||||
will be registered with the environment with the given name. When this builder
|
|
||||||
is used it will call the provided block in order to build the target.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.add_builder(:JsonToYaml) do |target, sources, cache, env, vars|
|
|
||||||
unless cache.up_to_date?(target, :JsonToYaml, sources, env)
|
|
||||||
cache.mkdir_p(File.dirname(target))
|
|
||||||
File.open(target, 'w') do |f|
|
|
||||||
f.write(YAML.dump(JSON.load(IO.read(sources.first))))
|
|
||||||
end
|
|
||||||
cache.register_build(target, :JsonToYaml, sources, env)
|
|
||||||
end
|
|
||||||
target
|
|
||||||
end
|
|
||||||
env.JsonToYaml('foo.yml','foo.json')
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Using different compilation flags for some sources
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env["CFLAGS"] = ["-O3", "-Wall", "-DDEFINE"]
|
|
||||||
env.add_build_hook do |build_op|
|
|
||||||
if build_op[:target] =~ %r{build/third-party}
|
|
||||||
build_op[:vars]["CFLAGS"] -= ["-Wall"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
env.build_dir("src", "build")
|
|
||||||
env.Program("program", Rscons.glob("**/*.cc"))
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Creating a static library
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.Library("mylib.a", Rscons.glob("src/**/*.c"))
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example: Creating a C++ parser source from a Yacc/Bison input file
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.CFile("#{env.build_root}/parser.tab.cc", "parser.yy")
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
## Details
|
|
||||||
|
|
||||||
### Environments
|
|
||||||
|
|
||||||
The Environment is the main top-level object that Rscons operates with. An
|
|
||||||
Environment must be created by the user in order to build anything. All build
|
|
||||||
targets are registered within an Environment. In many cases only a single
|
|
||||||
Environment will be needed, but more than one can be created (either from
|
|
||||||
scratch or by cloning another existing Environment) if needed.
|
|
||||||
|
|
||||||
An Environment consists of:
|
|
||||||
|
|
||||||
* a collection of builders
|
|
||||||
* a collection of construction variables used by those builders
|
|
||||||
* a mapping of build directories from source directories
|
|
||||||
* a default build root to apply if no specific build directories are matched
|
|
||||||
* a collection of user-defined build targets
|
|
||||||
* a collection of user-defined build hooks
|
|
||||||
|
|
||||||
When cloning an environment, by default the construction variables, builders,
|
|
||||||
build hooks, build directories, and build root are cloned, but the new
|
|
||||||
environment does not inherit any of the registered build targets.
|
|
||||||
|
|
||||||
The set of environment attributes that are cloned is controllable via the
|
|
||||||
`:clone` option to the `#clone` method.
|
|
||||||
For example, `env.clone(clone: [:variables, :builders])` will include
|
|
||||||
construction variables, and builders but not build hooks, build directories, or
|
|
||||||
the build root.
|
|
||||||
|
|
||||||
The set of pending targets is never cloned.
|
|
||||||
|
|
||||||
Cloned environments contain "deep copies" of construction variables.
|
|
||||||
For example, in:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
base_env = Rscons::Environment.new
|
|
||||||
base_env["CPPPATH"] = ["one", "two"]
|
|
||||||
cloned_env = base_env.clone
|
|
||||||
cloned_env["CPPPATH"] << "three"
|
|
||||||
```
|
|
||||||
|
|
||||||
`base_env["CPPPATH"]` will not include "three".
|
|
||||||
|
|
||||||
### Builders
|
|
||||||
|
|
||||||
Builders are the workhorses that Rscons uses to execute build operations.
|
|
||||||
Each builder is specialized to perform a particular operation.
|
|
||||||
|
|
||||||
Rscons ships with a number of builders:
|
|
||||||
|
|
||||||
* Command, which executes a user-defined command to produce the target.
|
|
||||||
* Copy, which is identical to Install.
|
|
||||||
* CFile, which builds a C or C++ source file from a lex or yacc input file.
|
|
||||||
* Disassemble, which disassembles an object file to a disassembly listing.
|
|
||||||
* Install, which installs files or directories to a specified destination.
|
|
||||||
* Library, which collects object files into a static library archive file.
|
|
||||||
* Object, which compiles source files to produce an object file.
|
|
||||||
* Preprocess, which invokes the C/C++ preprocessor on a source file.
|
|
||||||
* Program, which links object files to produce an executable.
|
|
||||||
* SharedLibrary, which links object files to produce a dynamically loadable
|
|
||||||
library.
|
|
||||||
* SharedObject, which compiles source files to produce an object file, in a way
|
|
||||||
that is able to be used to create a shared library.
|
|
||||||
|
|
||||||
If you want to create an Environment that does not contain any builders,
|
|
||||||
you can use the `:exclude_builders` key to the Environment constructor.
|
|
||||||
|
|
||||||
#### Command
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Command(target, sources, "CMD" => command)
|
|
||||||
# Example
|
|
||||||
env.Command("docs.html", "docs.md",
|
|
||||||
"CMD" => ["pandoc", "-fmarkdown", "-thtml", "-o${_TARGET}", "${_SOURCES}"],
|
|
||||||
"CMD_DESC" => "PANDOC")
|
|
||||||
```
|
|
||||||
|
|
||||||
The command builder executes a user-defined command in order to produce the
|
|
||||||
desired target file based on the provided source files.
|
|
||||||
|
|
||||||
#### CFile
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.CFile(target, source)
|
|
||||||
# Example
|
|
||||||
env.CFile("parser.c", "parser.y")
|
|
||||||
```
|
|
||||||
|
|
||||||
The CFile builder will generate a C or C++ source file from a lex (.l, .ll)
|
|
||||||
or yacc (.y, .yy) input file.
|
|
||||||
|
|
||||||
#### Disassemble
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Disassemble(target, source)
|
|
||||||
# Example
|
|
||||||
env.Disassemble("module.dis", "module.o")
|
|
||||||
```
|
|
||||||
|
|
||||||
The Disassemble builder generates a disassembly listing using objdump from
|
|
||||||
and object file.
|
|
||||||
|
|
||||||
#### Install
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Install(destination, sources)
|
|
||||||
# Example
|
|
||||||
env.Install("dist/bin", "app.exe")
|
|
||||||
env.Install("dist/share", "share")
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Library
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Library(target, sources)
|
|
||||||
# Example
|
|
||||||
env.Library("lib.a", Rscons.glob("src/**/*.c"))
|
|
||||||
```
|
|
||||||
|
|
||||||
The Library builder creates a static library archive from the given source
|
|
||||||
files.
|
|
||||||
|
|
||||||
#### Object
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Object(target, sources)
|
|
||||||
# Example
|
|
||||||
env.Object("module.o", "module.c")
|
|
||||||
```
|
|
||||||
|
|
||||||
The Object builder compiles the given sources to an object file. Although it
|
|
||||||
can be called explicitly, it is more commonly implicitly called by the Program
|
|
||||||
builder.
|
|
||||||
|
|
||||||
#### Preprocess
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Preprocess(target, source)
|
|
||||||
# Example
|
|
||||||
env.Preprocess("module-preprocessed.cc", "module.cc")
|
|
||||||
```
|
|
||||||
|
|
||||||
The Preprocess builder invokes either `${CC}` or `${CXX}` (depending on if the
|
|
||||||
source contains an extension in `${CXXSUFFIX}` or not) and writes the
|
|
||||||
preprocessed output to the target file.
|
|
||||||
|
|
||||||
#### Program
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.Program(target, sources)
|
|
||||||
# Example
|
|
||||||
env.Program("myprog", Rscons.glob("src/**/*.cc"))
|
|
||||||
```
|
|
||||||
|
|
||||||
The Program builder compiles and links the given sources to an executable file.
|
|
||||||
Object files or source files can be given as `sources`. A platform-dependent
|
|
||||||
program suffix will be appended to the target name if one is not specified.
|
|
||||||
This can be controlled with the `PROGSUFFIX` construction variable.
|
|
||||||
|
|
||||||
#### SharedLibrary
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.SharedLibrary(target, sources)
|
|
||||||
# Example
|
|
||||||
env.SharedLibrary("mydll", Rscons.glob("src/**/*.cc"))
|
|
||||||
```
|
|
||||||
|
|
||||||
The SharedLibrary builder compiles and links the given sources to a dynamically
|
|
||||||
loadable library. Object files or source files can be given as `sources`.
|
|
||||||
A platform-dependent prefix and suffix will be appended to the target name if
|
|
||||||
they are not specified by the user. These values can be controlled by
|
|
||||||
overriding the `SHLIBPREFIX` and `SHLIBSUFFIX` construction variables.
|
|
||||||
|
|
||||||
#### SharedObject
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.SharedObject(target, sources)
|
|
||||||
# Example
|
|
||||||
env.SharedObject("lib_module.o", "lib_module.c")
|
|
||||||
```
|
|
||||||
|
|
||||||
The SharedObject builder compiles the given sources to an object file. Any
|
|
||||||
compilation flags necessary to build the object file in a manner that allows it
|
|
||||||
to be used to create a shared library are added. Although it can be called
|
|
||||||
explicitly, it is more commonly implicitly called by the SharedLibrary builder.
|
|
||||||
|
|
||||||
### Construction Variables
|
|
||||||
|
|
||||||
Construction variables are used to define the toolset and any build options
|
|
||||||
that Rscons will use to build a project. The default construction variable
|
|
||||||
values are configured to build applications using gcc. However, all
|
|
||||||
construction variables can be overridden by the user.
|
|
||||||
|
|
||||||
| Name | Type | Description | Default |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| AR | String | Static library archiver executable | "ar" |
|
|
||||||
| ARCMD | Array | Static library archiver command line | ["${AR}", "${ARFLAGS}", "${_TARGET}", "${_SOURCES}"] |
|
|
||||||
| ARFLAGS | Array | Static library archiver flags | ["rcs"] |
|
|
||||||
| AS | String | Assembler executable | "${CC}" |
|
|
||||||
| ASCMD | Array | Assembler command line | ["${AS}", "-c", "-o", "${_TARGET}", "${ASDEPGEN}", "${INCPREFIX}${ASPPPATH}", "${ASPPFLAGS}", "${ASFLAGS}", "${_SOURCES}"] |
|
|
||||||
| ASDEPGEN | Array | Assembly dependency generation flags | ["-MMD", "-MF", "${_DEPFILE}", "-MT", "TARGET"] |
|
|
||||||
| ASFLAGS | Array | Assembler flags | [] |
|
|
||||||
| ASPPFLAGS | Array | Assembler preprocessor flags | ["${CPPFLAGS}"] |
|
|
||||||
| ASPPPATH | Array | Assembler preprocessor path | ["${CPPPATH}"] |
|
|
||||||
| ASSUFFIX | Array | Assembly file suffixes | [".S"] |
|
|
||||||
| CC | String | C compiler executable | "gcc" |
|
|
||||||
| CCCMD | Array | C compiler command line | ["${CC}", "-c", "-o", "${_TARGET}", "${CCDEPGEN}", "${INCPREFIX}${CPPPATH}", "${CPPFLAGS}", "${CFLAGS}", "${CCFLAGS}", "${_SOURCES}"] |
|
|
||||||
| CCDEPGEN | Array | C compiler dependency generation flags | ["-MMD", "-MF", "${_DEPFILE}", "-MT", "TARGET"] |
|
|
||||||
| CCFLAGS | Array | Common flags for both C and C++ compiler | [] |
|
|
||||||
| CFLAGS | Array | C compiler flags | [] |
|
|
||||||
| CPP_CMD | Array | Preprocess command line | ["${_PREPROCESS_CC}", "-E", "${_PREPROCESS_DEPGEN}", "-o", "${_TARGET}", "${INCPREFIX}${CPPPATH}", "${CPPFLAGS}", "${_SOURCES}"] |
|
|
||||||
| CPP_TARGET_SUFFIX | String | Suffix used for crt:preprocess target filename. | ".c" |
|
|
||||||
| CPPDEFINES | Array | C preprocessor defines | [] |
|
|
||||||
| CPPDEFPREFIX | String | Prefix used for C preprocessor to introduce a define | "-D" |
|
|
||||||
| CPPFLAGS | Array | C preprocessor flags | ["${CPPDEFPREFIX}${CPPDEFINES}"] |
|
|
||||||
| CPPPATH | Array | C preprocessor path | [] |
|
|
||||||
| CSUFFIX | Array | C source file suffixes | [".c"] |
|
|
||||||
| CXX | String | C++ compiler executable | "g++" |
|
|
||||||
| CXXCMD | Array | C++ compiler command line | ["${CXX}", "-c", "-o", "${_TARGET}", "${CXXDEPGEN}", "${INCPREFIX}${CPPPATH}", "${CPPFLAGS}", "${CXXFLAGS}", "${CCFLAGS}", "${_SOURCES}"] |
|
|
||||||
| CXXDEPGEN | Array | C++ compiler dependency generation flags | ["-MMD", "-MF", "${_DEPFILE}", "-MT", "TARGET"] |
|
|
||||||
| CXXFLAGS | Array | C++ compiler flags | [] |
|
|
||||||
| CXXSUFFIX | Array | C++ source file suffixes | [".cc", ".cpp", ".cxx", ".C"] |
|
|
||||||
| D_IMPORT_PATH | Array | D compiler import path | [] |
|
|
||||||
| DC | String | D compiler executable | "gdc" |
|
|
||||||
| DCCMD | Array | D compiler command line | ["${DC}", "-c", "-o", "${_TARGET}", "${DDEPGEN}", "${INCPREFIX}${D_IMPORT_PATH}", "${DFLAGS}", "${_SOURCES}"] |
|
|
||||||
| DDEPGEN | Array | D compiler dependency generation flags | ["-MMD", "-MF", "${_DEPFILE}", "-MT", "TARGET"] |
|
|
||||||
| DEPFILESUFFIX | String | Dependency file suffix for Makefile-style dependency rules emitted by the compiler (used internally for temporary dependency files used to determine a source file's dependencies) | ".mf" |
|
|
||||||
| DFLAGS | Array | D compiler flags | [] |
|
|
||||||
| DISASM_CMD | Array | Disassemble command line | ["${OBJDUMP}", "${DISASM_FLAGS}", "${_SOURCES}"] |
|
|
||||||
| DISASM_FLAGS | Array | Disassemble flags | ["--disassemble", "--source"] |
|
|
||||||
| DSUFFIX | String/Array | Default D source file suffix | ".d" |
|
|
||||||
| INCPREFIX | String | Prefix used for C preprocessor to add an include path | "-I" |
|
|
||||||
| LD | String | nil | Linker executable (automatically determined when nil) | nil (if nil, ${CC}, ${CXX}, or ${DC} is used depending on the sources being linked) |
|
|
||||||
| LDCMD | Array | Link command line | ["${LD}", "-o", "${_TARGET}", "${LDFLAGS}", "${_SOURCES}", "${LIBDIRPREFIX}${LIBPATH}", "${LIBLINKPREFIX}${LIBS}"] |
|
|
||||||
| LDFLAGS | Array | Linker flags | [] |
|
|
||||||
| LEX | String | Lex executable | "flex" |
|
|
||||||
| LEX_CMD | Array | Lex command line | ["${LEX}", "${LEX_FLAGS}", "-o", "${_TARGET}", "${_SOURCES}"] |
|
|
||||||
| LEX_FLAGS | Array | Lex flags | [] |
|
|
||||||
| LEXSUFFIX | Array | Lex input file suffixes | [".l", ".ll"] |
|
|
||||||
| LIBDIRPREFIX | String | Prefix given to linker to add a library search path | "-L" |
|
|
||||||
| LIBLINKPREFIX | String | Prefix given to linker to add a library to link with | "-l" |
|
|
||||||
| LIBPATH | Array | Library load path | [] |
|
|
||||||
| LIBS | Array | Libraries to link with | [] |
|
|
||||||
| LIBSUFFIX | String/Array | Default static library file suffix | ".a" |
|
|
||||||
| OBJDUMP | String | Objdump executable | "objdump" |
|
|
||||||
| OBJSUFFIX | String/Array | Default object file suffix | ".o" |
|
|
||||||
| PROGSUFFIX | String | Default program suffix. | Windows: ".exe", POSIX: "" |
|
|
||||||
| SHCC | String | Shared object C compiler | "${CC}" |
|
|
||||||
| SHCCCMD | Array | Shared object C compiler command line | ["${SHCC}", "-c", "-o", "${_TARGET}", "${CCDEPGEN}", "${INCPREFIX}${CPPPATH}", "${CPPFLAGS}", "${SHCFLAGS}", "${SHCCFLAGS}", "${_SOURCES}"] |
|
|
||||||
| SHCCFLAGS | Array | Shared object C and C++ compiler flags | Windows: ["${CCFLAGS}"], POSIX: ["${CCFLAGS}", -fPIC"] |
|
|
||||||
| SHCFLAGS | Array | Shared object C compiler flags | ["${CFLAGS}"] |
|
|
||||||
| SHCXX | String | Shared object C++ compiler | "${CXX}" |
|
|
||||||
| SHCXXCMD | Array | Shared object C++ compiler command line | ["${SHCXX}", "-c", "-o", "${_TARGET}", "${CXXDEPGEN}", "${INCPREFIX}${CPPPATH}", "${CPPFLAGS}", "${SHCXXFLAGS}", "${SHCCFLAGS}", "${_SOURCES}"] |
|
|
||||||
| SHCXXFLAGS | Array | Shared object C++ compiler flags | ["${CXXFLAGS}"] |
|
|
||||||
| SHDC | String | Shared object D compiler | "gdc" |
|
|
||||||
| SHDCCMD | Array | Shared object D compiler command line | ["${SHDC}", "-c", "-o", "${_TARGET}", "${INCPREFIX}${D_IMPORT_PATH}", "${SHDFLAGS}", "${_SOURCES}"] |
|
|
||||||
| SHDFLAGS | Array | Shared object D compiler flags | Windows: ["${DFLAGS}"], POSIX: ["${DFLAGS}", "-fPIC"] |
|
|
||||||
| SHLD | String | Shared library linker | nil (if nil, ${SHCC}, ${SHCXX}, or ${SHDC} is used depending on the sources being linked) |
|
|
||||||
| SHLDCMD | Array | Shared library linker command line | ["${SHLD}", "-o", "${_TARGET}", "${SHLDFLAGS}", "${_SOURCES}", "${SHLIBDIRPREFIX}${LIBPATH}", "${SHLIBLINKPREFIX}${LIBS}"] |
|
|
||||||
| SHLDFLAGS | Array | Shared library linker flags | ["${LDFLAGS}", "-shared"] |
|
|
||||||
| SHLIBDIRPREFIX | String | Prefix given to shared library linker to add a library search path | "-L" |
|
|
||||||
| SHLIBLINKPREFIX | String | Prefix given to shared library linker to add a library to link with | "-l" |
|
|
||||||
| SHLIBPREFIX | String | Shared library file name prefix | Windows: "", POSIX: "lib" |
|
|
||||||
| SHLIBSUFFIX | String | Shared library file name suffix | Windows: ".dll", POSIX: ".so" |
|
|
||||||
| SIZE | String | Size executable. | "size" |
|
|
||||||
| YACC | String | Yacc executable | "bison" |
|
|
||||||
| YACC_CMD | Array | Yacc command line | ["${YACC}", "${YACC_FLAGS}", "-o", "${_TARGET}", "${_SOURCES}"] |
|
|
||||||
| YACC_FLAGS | Array | Yacc flags | ["-d"] |
|
|
||||||
| YACCSUFFIX | Array | Yacc input file suffixes | [".y", ".yy"] |
|
|
||||||
|
|
||||||
### Build Hooks
|
|
||||||
|
|
||||||
Environments can have build hooks which are added with `env.add_build_hook()`.
|
|
||||||
Build hooks are invoked immediately before a builder executes.
|
|
||||||
Build hooks can modify the construction variables in use for the build
|
|
||||||
operation.
|
|
||||||
They can also register new build targets.
|
|
||||||
|
|
||||||
Environments can also have post-build hooks added with `env.add_post_build_hook()`.
|
|
||||||
Post-build hooks are only invoked if the build operation was a success.
|
|
||||||
Post-build hooks can invoke commands using the newly-built files, or register
|
|
||||||
new build targets.
|
|
||||||
|
|
||||||
Each build hook block will be invoked for every build operation, so the block
|
|
||||||
should test the target or sources if its action should only apply to some
|
|
||||||
subset of build targets or source files.
|
|
||||||
|
|
||||||
Example build hook:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
# Build third party sources without -Wall
|
|
||||||
env.add_build_hook do |build_op|
|
|
||||||
if build_op[:builder].name == "Object" and
|
|
||||||
build_op[:sources].first =~ %r{src/third-party}
|
|
||||||
build_op[:vars]["CFLAGS"] -= ["-Wall"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
The `build_op` parameter to the build hook block is a Hash describing the
|
|
||||||
build operation with the following keys:
|
|
||||||
* `:builder` - `Builder` instance in use
|
|
||||||
* `:env` - `Environment` calling the build hook; note that this may be
|
|
||||||
different from the Environment that the build hook was added to in the case
|
|
||||||
that the original Environment was cloned with build hooks!
|
|
||||||
* `:target` - `String` name of the target file
|
|
||||||
* `:sources` - `Array` of the source files
|
|
||||||
* `:vars` - `Rscons::VarSet` containing the construction variables to use.
|
|
||||||
The build hook can overwrite entries in `build_op[:vars]` to alter the
|
|
||||||
construction variables in use for this specific build operation.
|
|
||||||
|
|
||||||
### Phony Targets
|
|
||||||
|
|
||||||
A build target name given as a Symbol instead of a String is interpreted as a
|
|
||||||
"phony" target.
|
|
||||||
Phony targets operate similarly to normal build targets, except that a file is
|
|
||||||
not expected to be produced by the builder.
|
|
||||||
Phony targets will still be "rebuilt" if any source or the command is out of
|
|
||||||
date.
|
|
||||||
|
|
||||||
### Explicit Dependencies
|
|
||||||
|
|
||||||
A target can be marked as depending on another file that Rscons would not
|
|
||||||
otherwise know about via the `Environment#depends` function. For example,
|
|
||||||
to force the linker to re-link a Program output when a linker script changes:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.Program("a.out", "foo.c", "LDFLAGS" => %w[-T linker_script.ld])
|
|
||||||
env.depends("a.out", "linker_script.ld")
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
You can pass multiple dependency files to `Environment#depends`:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
env.depends("my_app", "config/link.ld", "README.txt", *Rscons.glob("assets/**/*"))
|
|
||||||
```
|
|
||||||
|
|
||||||
### Command-Line Variables
|
|
||||||
|
|
||||||
Variables can be specified on the rscons command line. For example:
|
|
||||||
|
|
||||||
```
|
|
||||||
rscons VAR=val
|
|
||||||
```
|
|
||||||
|
|
||||||
These variables are accessible in a global VarSet called `Rscons.vars`.
|
|
||||||
|
|
||||||
### Construction Variable Naming
|
|
||||||
|
|
||||||
* uppercase strings - the default construction variables that Rscons uses
|
|
||||||
* strings beginning with "_" - set and used internally by builders
|
|
||||||
* symbols, lowercase strings - reserved as user-defined construction variables
|
|
||||||
|
|
||||||
### API documentation
|
|
||||||
|
|
||||||
Documentation for the complete Rscons API can be found at
|
|
||||||
http://www.rubydoc.info/github/holtrop/rscons/master.
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
1. Fork it
|
|
||||||
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
||||||
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
||||||
4. Push to the branch (`git push origin my-new-feature`)
|
|
||||||
5. Create new Pull Request
|
|
||||||
|
95
Rakefile.rb
95
Rakefile.rb
@ -5,23 +5,106 @@ rescue Bundler::BundlerError => e
|
|||||||
raise LoadError.new("Unable to setup Bundler; you might need to `bundle install`: #{e.message}")
|
raise LoadError.new("Unable to setup Bundler; you might need to `bundle install`: #{e.message}")
|
||||||
end
|
end
|
||||||
|
|
||||||
require "bundler/gem_tasks"
|
|
||||||
require "rspec/core/rake_task"
|
require "rspec/core/rake_task"
|
||||||
require "yard"
|
|
||||||
require "rake/clean"
|
require "rake/clean"
|
||||||
|
require "fileutils"
|
||||||
|
|
||||||
CLEAN.include %w[build_test_run .yardoc doc coverage]
|
CLEAN.include %w[build_test_run .yardoc yard coverage test]
|
||||||
CLOBBER.include %w[pkg]
|
CLOBBER.include %w[dist gen large_project pkg]
|
||||||
|
|
||||||
|
task :build_dist do
|
||||||
|
sh "ruby rb/build_dist.rb"
|
||||||
|
end
|
||||||
|
|
||||||
RSpec::Core::RakeTask.new(:spec, :example_string) do |task, args|
|
RSpec::Core::RakeTask.new(:spec, :example_string) do |task, args|
|
||||||
|
ENV["specs"] = "1"
|
||||||
if args.example_string
|
if args.example_string
|
||||||
ENV["partial_specs"] = "1"
|
ENV["partial_specs"] = "1"
|
||||||
task.rspec_opts = %W[-e "#{args.example_string}" -f documentation]
|
task.rspec_opts = %W[-e "#{args.example_string}" -f documentation]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
task :spec => :build_dist
|
||||||
|
task :spec do
|
||||||
|
ENV.delete("specs")
|
||||||
|
end
|
||||||
|
|
||||||
YARD::Rake::YardocTask.new do |yard|
|
# dspec task is useful to test the distributable release script, but is not
|
||||||
yard.files = ['lib/**/*.rb']
|
# useful for coverage information.
|
||||||
|
desc "Dist Specs"
|
||||||
|
task :dspec, [:example_string] => :build_dist do |task, args|
|
||||||
|
FileUtils.mkdir_p("test")
|
||||||
|
FileUtils.cp("dist/rscons", "test/rscons.rb")
|
||||||
|
ENV["dist_specs"] = "1"
|
||||||
|
Rake::Task["spec"].execute(args)
|
||||||
|
ENV.delete("dist_specs")
|
||||||
|
FileUtils.rm_f(Dir.glob(".rscons-*"))
|
||||||
|
end
|
||||||
|
|
||||||
|
task :gen_large_project, [:size] => :build_dist do |task, args|
|
||||||
|
size = (args.size || 10000).to_i
|
||||||
|
FileUtils.rm_rf("large_project")
|
||||||
|
FileUtils.mkdir_p("large_project/src")
|
||||||
|
size.times do |i|
|
||||||
|
File.open("large_project/src/fn#{i}.c", "w") do |fh|
|
||||||
|
fh.puts(<<-EOF)
|
||||||
|
int fn#{i}(void)
|
||||||
|
{
|
||||||
|
return #{i};
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
File.open("large_project/src/fn#{i}.h", "w") do |fh|
|
||||||
|
fh.puts %[int fn#{i}(void);]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
File.open("large_project/src/main.c", "w") do |fh|
|
||||||
|
size.times do |i|
|
||||||
|
fh.puts %[#include "fn#{i}.h"]
|
||||||
|
end
|
||||||
|
fh.puts <<-EOF
|
||||||
|
int main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
EOF
|
||||||
|
size.times do |i|
|
||||||
|
fh.puts %[result += fn#{i}();]
|
||||||
|
end
|
||||||
|
fh.puts <<-EOF
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
File.open("large_project/Rsconscript", "w") do |fh|
|
||||||
|
fh.puts <<EOF
|
||||||
|
default do
|
||||||
|
Environment.new do |env|
|
||||||
|
env.Program("project", glob("src/*.c"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
FileUtils.cp("dist/rscons", "large_project")
|
||||||
|
end
|
||||||
|
|
||||||
|
unless RbConfig::CONFIG["host"]["msys"]
|
||||||
|
require "yard"
|
||||||
|
YARD::Rake::YardocTask.new do |yard|
|
||||||
|
yard.files = ['lib/**/*.rb']
|
||||||
|
yard.options = ["-ogen/yard"]
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Build user guide"
|
||||||
|
task :user_guide do
|
||||||
|
system("ruby", "-Ilib", "rb/gen_user_guide.rb")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
task :default => :spec
|
task :default => :spec
|
||||||
|
|
||||||
|
task :all => [
|
||||||
|
:build_dist,
|
||||||
|
:spec,
|
||||||
|
:dspec,
|
||||||
|
:yard,
|
||||||
|
:user_guide,
|
||||||
|
]
|
||||||
|
@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
require "rscons/cli"
|
require "rscons/cli"
|
||||||
|
|
||||||
Rscons::Cli.run(ARGV)
|
if __FILE__ == $0
|
||||||
|
Rscons::Cli.new.run(ARGV)
|
||||||
|
end
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env.append('CPPPATH' => Rscons.glob('src/**'))
|
|
||||||
env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/')
|
|
||||||
env.Program('build_dir.exe', Rscons.glob('src/**/*.c'))
|
|
||||||
end
|
|
@ -1,22 +0,0 @@
|
|||||||
class MyObject < Rscons::Builder
|
|
||||||
def run(target, sources, cache, env, vars)
|
|
||||||
env.run_builder(env.builders["Object"], target, sources, cache, vars)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rscons::Environment.new(echo: :command) do |env|
|
|
||||||
env.add_builder(MyObject.new)
|
|
||||||
env.append('CPPPATH' => Rscons.glob('src/**'))
|
|
||||||
env.add_build_hook do |build_op|
|
|
||||||
if build_op[:builder].name == "MyObject" && build_op[:sources].first =~ %r{one\.c}
|
|
||||||
build_op[:vars]["CFLAGS"] << "-O1"
|
|
||||||
build_op[:sources] = ['src/two/two.c']
|
|
||||||
elsif build_op[:builder].name == "MyObject" && build_op[:target] =~ %r{two\.o}
|
|
||||||
new_vars = build_op[:vars].clone
|
|
||||||
new_vars["CFLAGS"] << "-O2"
|
|
||||||
build_op[:vars] = new_vars
|
|
||||||
end
|
|
||||||
end
|
|
||||||
env.MyObject('one.o', 'src/one/one.c')
|
|
||||||
env.MyObject('two.o', 'src/two/two.c')
|
|
||||||
end
|
|
@ -1,6 +0,0 @@
|
|||||||
env = Rscons::Environment.new do |env|
|
|
||||||
env.append('CPPPATH' => Rscons.glob('src/**/*/'))
|
|
||||||
env.build_dir("src", "build")
|
|
||||||
env.build_root = "build_root"
|
|
||||||
env.Program('build_dir.exe', Rscons.glob('src/**/*.c'))
|
|
||||||
end
|
|
@ -1,12 +0,0 @@
|
|||||||
Rscons::Environment.new(echo: :command) do |env|
|
|
||||||
env.append('CPPPATH' => Rscons.glob('src/**/*/'))
|
|
||||||
env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/')
|
|
||||||
env.add_build_hook do |build_op|
|
|
||||||
if build_op[:target] =~ %r{build_one/.*\.o}
|
|
||||||
build_op[:vars]["CFLAGS"] << "-O1"
|
|
||||||
elsif build_op[:target] =~ %r{build_two/.*\.o}
|
|
||||||
build_op[:vars]["CFLAGS"] << "-O2"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
env.Program('build_hook.exe', Rscons.glob('src/**/*.c'))
|
|
||||||
end
|
|
@ -1,8 +0,0 @@
|
|||||||
Rscons::Environment.new(echo: :command) do |env|
|
|
||||||
env.append('CPPPATH' => Rscons.glob('src/**').sort)
|
|
||||||
env.build_root = "build_root"
|
|
||||||
FileUtils.mkdir_p(env.build_root)
|
|
||||||
FileUtils.mv("src/one/one.c", "build_root")
|
|
||||||
env.Object("^/one.o", "^/one.c")
|
|
||||||
env.Program("build_dir.exe", Rscons.glob('src/**/*.c') + ["^/one.o"])
|
|
||||||
end
|
|
@ -1,6 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env["CSUFFIX"] = %w[.yargh .c]
|
|
||||||
env["CFLAGS"] += %w[-x c]
|
|
||||||
env["CPPPATH"] += Rscons.glob("src/**")
|
|
||||||
env.Program("build_dir.exe", Rscons.glob("src/**/*.{c,yargh}"))
|
|
||||||
end
|
|
@ -1,5 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env.echo = :command
|
|
||||||
env.Install("inst.exe", "install.rb")
|
|
||||||
end
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
class MyBuilder < Rscons::Builder
|
|
||||||
def run(options)
|
|
||||||
env, target = options.values_at(:env, :target)
|
|
||||||
env.print_builder_run_message("MyBuilder #{target}", "MyBuilder #{target} command")
|
|
||||||
target
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
|
||||||
env.echo = :command
|
|
||||||
env.add_builder(MyBuilder.new)
|
|
||||||
env.MyBuilder("foo")
|
|
||||||
end
|
|
@ -1,3 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env.Install("inst.exe", "install.rb")
|
|
||||||
end
|
|
@ -1,9 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env.Directory("inst")
|
|
||||||
env.Install("inst", "install_directory.rb")
|
|
||||||
|
|
||||||
env.Install("noexist/src", "src")
|
|
||||||
|
|
||||||
env.Directory("exist/src")
|
|
||||||
env.Install("exist/src", "src")
|
|
||||||
end
|
|
@ -1,6 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env.append('CPPPATH' => Rscons.glob('src/**'))
|
|
||||||
env.build_dir("src2", "build")
|
|
||||||
env.build_root = "build_root"
|
|
||||||
env.Program('build_dir.exe', Rscons.glob('src/**/*.c'))
|
|
||||||
end
|
|
@ -1,6 +0,0 @@
|
|||||||
Rscons::Environment.new do |env|
|
|
||||||
env.append("CPPPATH" => Rscons.glob("src/**"))
|
|
||||||
env.build_dir("src/one/", "build_one/")
|
|
||||||
env.build_dir("src/two", "build_two")
|
|
||||||
env.Program("build_dir.exe", Rscons.glob("src/**/*.c"))
|
|
||||||
end
|
|
@ -1,4 +1,4 @@
|
|||||||
Rscons::Environment.new do |env|
|
env do |env|
|
||||||
env.CFile("lexer.c", "lexer.l")
|
env.CFile("lexer.c", "lexer.l")
|
||||||
env.CFile("parser.c", "parser.y")
|
env.CFile("parser.c", "parser.y")
|
||||||
end
|
end
|
@ -1,3 +1,3 @@
|
|||||||
Rscons::Environment.new do |env|
|
env do |env|
|
||||||
env.CFile("file.c", "foo.bar")
|
env.CFile("file.c", "foo.bar")
|
||||||
end
|
end
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
debug = Rscons::Environment.new(echo: :command) do |env|
|
debug = env(echo: :command) do |env|
|
||||||
env.build_dir('src', 'debug')
|
|
||||||
env['CFLAGS'] = '-O2'
|
env['CFLAGS'] = '-O2'
|
||||||
env['CPPFLAGS'] = '-DSTRING="Debug Version"'
|
env['CPPFLAGS'] = '-DSTRING="Debug Version"'
|
||||||
env.Program('program-debug.exe', Dir['src/*.c'])
|
env.Program('program-debug.exe', Dir['src/*.c'])
|
||||||
@ -7,6 +6,5 @@ end
|
|||||||
|
|
||||||
release = debug.clone do |env|
|
release = debug.clone do |env|
|
||||||
env["CPPFLAGS"] = '-DSTRING="Release Version"'
|
env["CPPFLAGS"] = '-DSTRING="Release Version"'
|
||||||
env.build_dir('src', 'release')
|
|
||||||
env.Program('program-release.exe', Dir['src/*.c'])
|
env.Program('program-release.exe', Dir['src/*.c'])
|
||||||
end
|
end
|
@ -1,11 +1,10 @@
|
|||||||
env1 = Rscons::Environment.new(echo: :command) do |env|
|
env1 = env(echo: :command) do |env|
|
||||||
env.build_dir('src', 'build')
|
|
||||||
env['CFLAGS'] = '-O2'
|
env['CFLAGS'] = '-O2'
|
||||||
env.add_build_hook do |build_op|
|
env.add_build_hook do |builder|
|
||||||
build_op[:vars]['CPPFLAGS'] = '-DSTRING="Hello"'
|
builder.vars['CPPFLAGS'] = '-DSTRING="Hello"'
|
||||||
end
|
end
|
||||||
env.add_post_build_hook do |build_op|
|
env.add_post_build_hook do |builder|
|
||||||
$stdout.puts "post #{build_op[:target]}"
|
$stdout.puts "post #{builder.target}"
|
||||||
end
|
end
|
||||||
env.Program('program.exe', Dir['src/*.c'])
|
env.Program('program.exe', Dir['src/*.c'])
|
||||||
end
|
end
|
||||||
|
4
build_tests/configure/autoconf_fail.rb
Normal file
4
build_tests/configure/autoconf_fail.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "nope.nope"
|
||||||
|
end
|
||||||
|
default
|
3
build_tests/configure/autoconf_false.rb
Normal file
3
build_tests/configure/autoconf_false.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
autoconf false
|
||||||
|
env do |env|
|
||||||
|
end
|
8
build_tests/configure/autoconf_rebuild.rb
Normal file
8
build_tests/configure/autoconf_rebuild.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler
|
||||||
|
check_c_header "stdio.h"
|
||||||
|
end
|
||||||
|
|
||||||
|
env do |env|
|
||||||
|
env.Program("simple.exe", "simple.c")
|
||||||
|
end
|
4
build_tests/configure/check_c_compiler.rb
Normal file
4
build_tests/configure/check_c_compiler.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler
|
||||||
|
end
|
||||||
|
default
|
3
build_tests/configure/check_c_compiler_custom.rb
Normal file
3
build_tests/configure/check_c_compiler_custom.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "mycompiler"
|
||||||
|
end
|
3
build_tests/configure/check_c_compiler_find_first.rb
Normal file
3
build_tests/configure/check_c_compiler_find_first.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "gcc", "clang"
|
||||||
|
end
|
6
build_tests/configure/check_c_compiler_non_default.rb
Normal file
6
build_tests/configure/check_c_compiler_non_default.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "clang"
|
||||||
|
end
|
||||||
|
env do |env|
|
||||||
|
env.Program("simple.exe", "simple.c")
|
||||||
|
end
|
12
build_tests/configure/check_c_compiler_use.rb
Normal file
12
build_tests/configure/check_c_compiler_use.rb
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "clang", use: "clang"
|
||||||
|
check_c_compiler
|
||||||
|
end
|
||||||
|
|
||||||
|
env "t1" do |env|
|
||||||
|
env.Program("test_gcc.exe", "simple.c")
|
||||||
|
end
|
||||||
|
|
||||||
|
env "t2", use: "clang" do |env|
|
||||||
|
env.Program("test_clang.exe", "simple.c")
|
||||||
|
end
|
8
build_tests/configure/check_c_header_cpppath.rb
Normal file
8
build_tests/configure/check_c_header_cpppath.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "string.h", check_cpppath: ["./usr1"]
|
||||||
|
check_c_header "frobulous.h", check_cpppath: ["./usr2"]
|
||||||
|
end
|
||||||
|
|
||||||
|
env do |env|
|
||||||
|
env.Object("test.o", "test.c")
|
||||||
|
end
|
3
build_tests/configure/check_c_header_failure.rb
Normal file
3
build_tests/configure/check_c_header_failure.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "not___found.h"
|
||||||
|
end
|
3
build_tests/configure/check_c_header_no_fail.rb
Normal file
3
build_tests/configure/check_c_header_no_fail.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "not___found.h", fail: false
|
||||||
|
end
|
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "not___found.h", set_define: "HAVE_NOT___FOUND_H"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Object("simple.o", "simple.c")
|
||||||
|
end
|
3
build_tests/configure/check_c_header_success.rb
Normal file
3
build_tests/configure/check_c_header_success.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "string.h"
|
||||||
|
end
|
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "string.h", set_define: "HAVE_STRING_H"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Object("simple.o", "simple.c")
|
||||||
|
end
|
7
build_tests/configure/check_cfg.rb
Normal file
7
build_tests/configure/check_cfg.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_cfg program: "my-config"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Program("myconfigtest", "simple.c")
|
||||||
|
end
|
7
build_tests/configure/check_cfg_package.rb
Normal file
7
build_tests/configure/check_cfg_package.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_cfg package: "mypackage"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Program("myconfigtest", "simple.c")
|
||||||
|
end
|
13
build_tests/configure/check_cfg_use.rb
Normal file
13
build_tests/configure/check_cfg_use.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
configure do
|
||||||
|
check_cfg package: "mypackage", use: "myp"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Copy("myconfigtest1.c", "simple.c")
|
||||||
|
env.Program("myconfigtest1.exe", "myconfigtest1.c")
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command, use: "myp") do |env|
|
||||||
|
env.Copy("myconfigtest2.c", "simple.c")
|
||||||
|
env.Program("myconfigtest2.exe", "myconfigtest2.c")
|
||||||
|
end
|
3
build_tests/configure/check_cxx_compiler.rb
Normal file
3
build_tests/configure/check_cxx_compiler.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_compiler
|
||||||
|
end
|
3
build_tests/configure/check_cxx_compiler_custom.rb
Normal file
3
build_tests/configure/check_cxx_compiler_custom.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_compiler "mycompiler"
|
||||||
|
end
|
3
build_tests/configure/check_cxx_compiler_find_first.rb
Normal file
3
build_tests/configure/check_cxx_compiler_find_first.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_compiler "g++", "clang++"
|
||||||
|
end
|
12
build_tests/configure/check_cxx_compiler_use.rb
Normal file
12
build_tests/configure/check_cxx_compiler_use.rb
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_compiler "clang++", use: "clang"
|
||||||
|
check_cxx_compiler
|
||||||
|
end
|
||||||
|
|
||||||
|
env "t1" do |env|
|
||||||
|
env.Program("test_gcc.exe", "simple.cc")
|
||||||
|
end
|
||||||
|
|
||||||
|
env "t2", use: "clang" do |env|
|
||||||
|
env.Program("test_clang.exe", "simple.cc")
|
||||||
|
end
|
8
build_tests/configure/check_cxx_header_cpppath.rb
Normal file
8
build_tests/configure/check_cxx_header_cpppath.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_header "string.h", check_cpppath: ["./usr1"]
|
||||||
|
check_cxx_header "frobulous.h", check_cpppath: ["./usr2"]
|
||||||
|
end
|
||||||
|
|
||||||
|
env do |env|
|
||||||
|
env.Object("test.o", "test.cc")
|
||||||
|
end
|
3
build_tests/configure/check_cxx_header_failure.rb
Normal file
3
build_tests/configure/check_cxx_header_failure.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_header "not___found.h"
|
||||||
|
end
|
3
build_tests/configure/check_cxx_header_no_fail.rb
Normal file
3
build_tests/configure/check_cxx_header_no_fail.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_header "not___found.h", fail: false
|
||||||
|
end
|
3
build_tests/configure/check_cxx_header_success.rb
Normal file
3
build_tests/configure/check_cxx_header_success.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_header "string.h"
|
||||||
|
end
|
3
build_tests/configure/check_d_compiler.rb
Normal file
3
build_tests/configure/check_d_compiler.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler
|
||||||
|
end
|
3
build_tests/configure/check_d_compiler_custom.rb
Normal file
3
build_tests/configure/check_d_compiler_custom.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "mycompiler"
|
||||||
|
end
|
3
build_tests/configure/check_d_compiler_find_first.rb
Normal file
3
build_tests/configure/check_d_compiler_find_first.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "gdc", "ldc2"
|
||||||
|
end
|
12
build_tests/configure/check_d_compiler_use.rb
Normal file
12
build_tests/configure/check_d_compiler_use.rb
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "ldc2", use: "ldc2"
|
||||||
|
check_d_compiler
|
||||||
|
end
|
||||||
|
|
||||||
|
env "t1" do |env|
|
||||||
|
env.Program("test_gcc.exe", "simple.d")
|
||||||
|
end
|
||||||
|
|
||||||
|
env "t2", use: "ldc2" do |env|
|
||||||
|
env.Program("test_ldc2.exe", "simple.d")
|
||||||
|
end
|
9
build_tests/configure/check_d_import_d_import_path.rb
Normal file
9
build_tests/configure/check_d_import_d_import_path.rb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler
|
||||||
|
check_d_import "std.stdio", check_d_import_path: ["./usr1"]
|
||||||
|
check_d_import "frobulous", check_d_import_path: ["./usr2"]
|
||||||
|
end
|
||||||
|
|
||||||
|
env do |env|
|
||||||
|
env.Object("test.o", "test.d")
|
||||||
|
end
|
3
build_tests/configure/check_d_import_failure.rb
Normal file
3
build_tests/configure/check_d_import_failure.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_d_import "not.found"
|
||||||
|
end
|
3
build_tests/configure/check_d_import_no_fail.rb
Normal file
3
build_tests/configure/check_d_import_no_fail.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_d_import "not.found", fail: false
|
||||||
|
end
|
4
build_tests/configure/check_d_import_success.rb
Normal file
4
build_tests/configure/check_d_import_success.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler
|
||||||
|
check_d_import "std.stdio"
|
||||||
|
end
|
3
build_tests/configure/check_lib_failure.rb
Normal file
3
build_tests/configure/check_lib_failure.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_lib "mfoofoo"
|
||||||
|
end
|
3
build_tests/configure/check_lib_libpath1.rb
Normal file
3
build_tests/configure/check_lib_libpath1.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Library("usr2/libfrobulous.a", "two.c")
|
||||||
|
end
|
8
build_tests/configure/check_lib_libpath2.rb
Normal file
8
build_tests/configure/check_lib_libpath2.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
configure do
|
||||||
|
check_lib "m", check_libpath: ["./usr1"]
|
||||||
|
check_lib "frobulous", check_libpath: ["./usr2"]
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Program("simple.exe", "simple.c")
|
||||||
|
end
|
3
build_tests/configure/check_lib_no_fail.rb
Normal file
3
build_tests/configure/check_lib_no_fail.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_lib "mfoofoo", fail: false
|
||||||
|
end
|
7
build_tests/configure/check_lib_success.rb
Normal file
7
build_tests/configure/check_lib_success.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_lib "m"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Program("simple.exe", "simple.c")
|
||||||
|
end
|
13
build_tests/configure/check_lib_use.rb
Normal file
13
build_tests/configure/check_lib_use.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
configure do
|
||||||
|
check_lib "m", use: :m
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Copy("test1.c", "simple.c")
|
||||||
|
env.Program("test2.exe", "test1.c")
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command, use: %w[m]) do |env|
|
||||||
|
env.Copy("test2.c", "simple.c")
|
||||||
|
env.Program("test2.exe", "test2.c")
|
||||||
|
end
|
8
build_tests/configure/check_lib_use_false.rb
Normal file
8
build_tests/configure/check_lib_use_false.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
configure do
|
||||||
|
check_lib "m", use: false
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Copy("test1.c", "simple.c")
|
||||||
|
env.Program("test2.exe", "test1.c")
|
||||||
|
end
|
3
build_tests/configure/check_program_failure.rb
Normal file
3
build_tests/configure/check_program_failure.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_program "program-that-is-not-found"
|
||||||
|
end
|
3
build_tests/configure/check_program_no_fail.rb
Normal file
3
build_tests/configure/check_program_no_fail.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_program "program-that-is-not-found", fail: false
|
||||||
|
end
|
3
build_tests/configure/check_program_success.rb
Normal file
3
build_tests/configure/check_program_success.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_program "find"
|
||||||
|
end
|
6
build_tests/configure/configure_with_top_level_env.rb
Normal file
6
build_tests/configure/configure_with_top_level_env.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler
|
||||||
|
end
|
||||||
|
env do |env|
|
||||||
|
puts "Prefix is #{Task["configure"]["prefix"]}"
|
||||||
|
end
|
28
build_tests/configure/custom_config_check.rb
Normal file
28
build_tests/configure/custom_config_check.rb
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
configure do
|
||||||
|
custom_check("Checking 'grep' version") do |op|
|
||||||
|
stdout, stderr, status = op.log_and_test_command(%w[grep --version])
|
||||||
|
should_fail = true
|
||||||
|
if status != 0
|
||||||
|
fail_message = "error executing grep"
|
||||||
|
elsif stdout =~ /^grep \(GNU grep\) 1\./
|
||||||
|
fail_message = "too old!"
|
||||||
|
status = 1
|
||||||
|
elsif stdout =~ /^grep \(GNU grep\) 2\./
|
||||||
|
fail_message = "we'll work with it but you should upgrade"
|
||||||
|
status = 1
|
||||||
|
should_fail = false
|
||||||
|
op.store_merge("CPPDEFINES" => "GREP_WORKAROUND")
|
||||||
|
else
|
||||||
|
op.store_append("CPPDEFINES" => "GREP_FULL")
|
||||||
|
end
|
||||||
|
op.complete(status, success_message: "good!", fail_message: fail_message, fail: should_fail)
|
||||||
|
end
|
||||||
|
custom_check("Checking sed -E flag") do |op|
|
||||||
|
stdout, stderr, status = op.log_and_test_command(%w[sed -E -e s/ab+/rep/], stdin: "abbbc")
|
||||||
|
op.complete(stdout =~ /repc/ ? 0 : 1, success_message: "good", fail_message: "fail")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
env do |env|
|
||||||
|
puts env["CPPDEFINES"]
|
||||||
|
end
|
13
build_tests/configure/everything.rb
Normal file
13
build_tests/configure/everything.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
project_name "configure test"
|
||||||
|
autoconf false
|
||||||
|
configure do
|
||||||
|
check_c_compiler
|
||||||
|
check_cxx_compiler
|
||||||
|
check_d_compiler
|
||||||
|
check_cfg package: "mypackage"
|
||||||
|
check_c_header "stdio.h"
|
||||||
|
check_cxx_header "iostream"
|
||||||
|
check_d_import "std.stdio"
|
||||||
|
check_lib "m"
|
||||||
|
check_program "ls"
|
||||||
|
end
|
8
build_tests/configure/multiple_set_define.rb
Normal file
8
build_tests/configure/multiple_set_define.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
configure do
|
||||||
|
check_c_header "math.h", set_define: "HAVE_MATH_H"
|
||||||
|
check_c_header "stdio.h", set_define: "HAVE_STDIO_H"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Object("simple.o", "simple.c")
|
||||||
|
end
|
3
build_tests/configure/no_configure_output.rb
Normal file
3
build_tests/configure/no_configure_output.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
default do
|
||||||
|
puts "default"
|
||||||
|
end
|
5
build_tests/configure/on_fail.rb
Normal file
5
build_tests/configure/on_fail.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "foo123c", fail: false, on_fail: "Install the foo123 package"
|
||||||
|
check_d_compiler "foo123d", fail: false
|
||||||
|
check_cxx_compiler "foo123cxx", on_fail: lambda {puts "Install the foo123cxx package"}
|
||||||
|
end
|
1
build_tests/configure/scope.rb
Normal file
1
build_tests/configure/scope.rb
Normal file
@ -0,0 +1 @@
|
|||||||
|
check_c_compiler "gcc"
|
6
build_tests/configure/simple.c
Normal file
6
build_tests/configure/simple.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
printf("This is a simple C program\n");
|
||||||
|
}
|
6
build_tests/configure/simple.cc
Normal file
6
build_tests/configure/simple.cc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
std::cout << "Hi" << std::endl;
|
||||||
|
}
|
7
build_tests/configure/simple.d
Normal file
7
build_tests/configure/simple.d
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import std.stdio;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
writeln("Hello");
|
||||||
|
return 0;
|
||||||
|
}
|
4
build_tests/configure/two.c
Normal file
4
build_tests/configure/two.c
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
int two(void)
|
||||||
|
{
|
||||||
|
return 42;
|
||||||
|
}
|
@ -1,16 +1,16 @@
|
|||||||
class MySource < Rscons::Builder
|
class MySource < Rscons::Builder
|
||||||
def run(target, sources, cache, env, vars)
|
def run(options)
|
||||||
File.open(target, 'w') do |fh|
|
File.open(@target, 'w') do |fh|
|
||||||
fh.puts <<EOF
|
fh.puts <<EOF
|
||||||
#define THE_VALUE 5678
|
#define THE_VALUE 5678
|
||||||
EOF
|
EOF
|
||||||
end
|
end
|
||||||
target
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
env do |env|
|
||||||
env.add_builder(MySource.new)
|
env.add_builder(MySource)
|
||||||
env.MySource('inc.h', [])
|
env.MySource('inc.h', [])
|
||||||
env.Program('program.exe', Dir['*.c'])
|
env.Program('program.exe', Dir['*.c'])
|
||||||
end
|
end
|
@ -1,10 +1,11 @@
|
|||||||
Rscons::Environment.new do |env|
|
env do |env|
|
||||||
env.Command("inc.c",
|
env.Command("inc.c",
|
||||||
[],
|
[],
|
||||||
"CMD" => %w[ruby gen.rb ${_TARGET}],
|
"CMD" => %w[ruby gen.rb ${_TARGET}],
|
||||||
"CMD_DESC" => "Generating")
|
"CMD_DESC" => "Generating")
|
||||||
env["build_root"] = env.build_root
|
env["build_root"] = env.build_root
|
||||||
env["inc_c"] = "inc.c"
|
env["inc_c"] = "inc.c"
|
||||||
env.build_after("${build_root}/program.o", "${inc_c}")
|
env.Object("program.o", "program.c")
|
||||||
env.Program("program.exe", ["program.c", "inc.c"])
|
env.build_after("program.o", "${inc_c}")
|
||||||
|
env.Program("program.exe", ["program.o", "inc.c"])
|
||||||
end
|
end
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
class MySource < Rscons::Builder
|
class MySource < Rscons::Builder
|
||||||
def run(target, sources, cache, env, vars)
|
def run(options)
|
||||||
File.open(target, 'w') do |fh|
|
File.open(@target, 'w') do |fh|
|
||||||
fh.puts <<EOF
|
fh.puts <<EOF
|
||||||
#define THE_VALUE 678
|
#define THE_VALUE 678
|
||||||
EOF
|
EOF
|
||||||
end
|
end
|
||||||
target
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
env = Rscons::Environment.new do |env|
|
env = env do |env|
|
||||||
env["hdr"] = "inc.h"
|
env["hdr"] = "inc.h"
|
||||||
env["src"] = "program.c"
|
env["src"] = "program.c"
|
||||||
env.add_builder(MySource.new)
|
env.add_builder(MySource)
|
||||||
env.MySource('${hdr}')
|
env.MySource('${hdr}')
|
||||||
env.Program('program.exe', "${src}")
|
env.Program('program.exe', "${src}")
|
||||||
end
|
end
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
class MySource < Rscons::Builder
|
class MySource < Rscons::Builder
|
||||||
def run(target, sources, cache, env, vars)
|
def run(options)
|
||||||
File.open(target, 'w') do |fh|
|
File.open(@target, 'w') do |fh|
|
||||||
fh.puts <<EOF
|
fh.puts <<EOF
|
||||||
#define THE_VALUE #{env.expand_varref("${the_value}")}
|
#define THE_VALUE #{@env.expand_varref("${the_value}")}
|
||||||
EOF
|
EOF
|
||||||
end
|
end
|
||||||
target
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
e1 = Rscons::Environment.new do |env|
|
e1 = env do |env|
|
||||||
env.add_builder(MySource.new)
|
env.add_builder(MySource)
|
||||||
env["one"] = "5"
|
env["one"] = "5"
|
||||||
env[:cfg] = {val: "9"}
|
env[:cfg] = {val: "9"}
|
||||||
env["two"] = lambda do |args|
|
env["two"] = lambda do |args|
|
||||||
|
6
build_tests/custom_builder/error_run_return_value.rb
Normal file
6
build_tests/custom_builder/error_run_return_value.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
env do |env|
|
||||||
|
env.add_builder(:MyBuilder) do |options|
|
||||||
|
"hi"
|
||||||
|
end
|
||||||
|
env.MyBuilder("foo")
|
||||||
|
end
|
6
build_tests/custom_builder/error_wait_for.rb
Normal file
6
build_tests/custom_builder/error_wait_for.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
env do |env|
|
||||||
|
env.add_builder(:MyBuilder) do |options|
|
||||||
|
wait_for(1)
|
||||||
|
end
|
||||||
|
env.MyBuilder("foo")
|
||||||
|
end
|
@ -1,19 +1,19 @@
|
|||||||
class CHGen < Rscons::Builder
|
class CHGen < Rscons::Builder
|
||||||
def run(target, sources, cache, env, vars)
|
def run(options)
|
||||||
c_fname = target
|
c_fname = @target
|
||||||
h_fname = target.sub(/\.c$/, ".h")
|
h_fname = @target.sub(/\.c$/, ".h")
|
||||||
unless cache.up_to_date?([c_fname, h_fname], "", sources, env)
|
unless @cache.up_to_date?([c_fname, h_fname], "", @sources, @env)
|
||||||
puts "CHGen #{c_fname}"
|
puts "CHGen #{c_fname}"
|
||||||
File.open(c_fname, "w") {|fh| fh.puts "int THE_VALUE = 42;"}
|
File.open(c_fname, "w") {|fh| fh.puts "int THE_VALUE = 42;"}
|
||||||
File.open(h_fname, "w") {|fh| fh.puts "extern int THE_VALUE;"}
|
File.open(h_fname, "w") {|fh| fh.puts "extern int THE_VALUE;"}
|
||||||
cache.register_build([c_fname, h_fname], "", sources, env)
|
@cache.register_build([c_fname, h_fname], "", @sources, @env)
|
||||||
end
|
end
|
||||||
target
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Rscons::Environment.new do |env|
|
env do |env|
|
||||||
env.add_builder(CHGen.new)
|
env.add_builder(CHGen)
|
||||||
env.CHGen("inc.c", ["program.c"])
|
env.CHGen("inc.c", ["program.c"])
|
||||||
env.Program("program.exe", %w[program.c inc.c])
|
env.Program("program.exe", %w[program.c inc.c])
|
||||||
end
|
end
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
Rscons::Environment.new do |env|
|
env do |env|
|
||||||
env["build_root"] = env.build_root
|
env["build_root"] = env.build_root
|
||||||
env["inc_h"] = "inc.h"
|
env["inc_h"] = "inc.h"
|
||||||
|
|
||||||
env.Copy("copy_inc.h", "${inc_h}")
|
env.Copy("copy_inc.h", "${inc_h}")
|
||||||
env.depends("${build_root}/program.o", "${inc_h}")
|
env.depends("program.o", "${inc_h}")
|
||||||
env.Program("program.exe", ["program.c", "inc.c"])
|
env.Object("program.o", "program.c")
|
||||||
|
env.Program("program.exe", ["program.o", "inc.c"])
|
||||||
|
|
||||||
env.Command("inc.c",
|
inc_c = env.Command("inc.c",
|
||||||
[],
|
[],
|
||||||
"CMD" => %w[ruby gen.rb ${_TARGET}],
|
"CMD" => %w[ruby gen.rb ${_TARGET}],
|
||||||
"CMD_DESC" => "Generating")
|
"CMD_DESC" => "Generating")
|
||||||
env.produces("inc.c", "inc.h")
|
inc_c.produces("inc.h")
|
||||||
end
|
end
|
||||||
|
15
build_tests/custom_builder/produces_env.rb
Normal file
15
build_tests/custom_builder/produces_env.rb
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
env do |env|
|
||||||
|
env["build_root"] = env.build_root
|
||||||
|
env["inc_h"] = "inc.h"
|
||||||
|
|
||||||
|
env.Copy("copy_inc.h", "${inc_h}")
|
||||||
|
env.depends("program.o", "${inc_h}")
|
||||||
|
env.Object("program.o", "program.c")
|
||||||
|
env.Program("program.exe", ["program.o", "inc.c"])
|
||||||
|
|
||||||
|
env.Command("inc.c",
|
||||||
|
[],
|
||||||
|
"CMD" => %w[ruby gen.rb ${_TARGET}],
|
||||||
|
"CMD_DESC" => "Generating")
|
||||||
|
env.produces("inc.c", "inc.h")
|
||||||
|
end
|
19
build_tests/custom_builder/wait_for_thread.rb
Normal file
19
build_tests/custom_builder/wait_for_thread.rb
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
class MyBuilder < Rscons::Builder
|
||||||
|
def run(options)
|
||||||
|
if @thread
|
||||||
|
true
|
||||||
|
else
|
||||||
|
print_run_message("#{name} #{target}", nil)
|
||||||
|
@thread = Thread.new do
|
||||||
|
sleep 2
|
||||||
|
FileUtils.touch(@target)
|
||||||
|
end
|
||||||
|
wait_for(@thread)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
env do |env|
|
||||||
|
env.add_builder(MyBuilder)
|
||||||
|
env.MyBuilder("foo")
|
||||||
|
end
|
7
build_tests/d/Rsconscript
Normal file
7
build_tests/d/Rsconscript
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "gdc"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Program("hello-d.exe", glob("*.d"))
|
||||||
|
end
|
@ -1,3 +0,0 @@
|
|||||||
Rscons::Environment.new(echo: :command) do |env|
|
|
||||||
env.Program("hello-d.exe", Rscons.glob("*.d"))
|
|
||||||
end
|
|
7
build_tests/d/build-ldc2.rb
Normal file
7
build_tests/d/build-ldc2.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "ldc2"
|
||||||
|
end
|
||||||
|
|
||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Program("hello-d.exe", glob("*.d"))
|
||||||
|
end
|
5
build_tests/d/link_objects.rb
Normal file
5
build_tests/d/link_objects.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
env(echo: :command) do |env|
|
||||||
|
env.Object("main.o", "main.d")
|
||||||
|
env.Object("mod.o", "mod.d")
|
||||||
|
env.Program("hello-d.exe", ["main.o", "mod.o"])
|
||||||
|
end
|
3
build_tests/direct/c_program.rb
Normal file
3
build_tests/direct/c_program.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
env do |env|
|
||||||
|
env.Program("test.exe", glob("*.c"), direct: true)
|
||||||
|
end
|
5
build_tests/direct/c_shared_library.rb
Normal file
5
build_tests/direct/c_shared_library.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
env do |env|
|
||||||
|
lib = env.SharedLibrary("mylib", ["two.c", "three.c"], direct: true)
|
||||||
|
program = env.Program("test.exe", "main.c", "LIBS" => ["mylib"], "LIBPATH" => ["."])
|
||||||
|
env.depends(program, lib)
|
||||||
|
end
|
7
build_tests/direct/main.c
Normal file
7
build_tests/direct/main.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include "two.h"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
two();
|
||||||
|
return 0;
|
||||||
|
}
|
7
build_tests/direct/three.c
Normal file
7
build_tests/direct/three.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include "three.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void three(void)
|
||||||
|
{
|
||||||
|
printf("three\n");
|
||||||
|
}
|
1
build_tests/direct/three.h
Normal file
1
build_tests/direct/three.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
void three(void);
|
7
build_tests/direct/two.c
Normal file
7
build_tests/direct/two.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include "two.h"
|
||||||
|
#include "three.h"
|
||||||
|
|
||||||
|
void two(void)
|
||||||
|
{
|
||||||
|
three();
|
||||||
|
}
|
1
build_tests/direct/two.h
Normal file
1
build_tests/direct/two.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
void two(void);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user