Compare commits

..

No commits in common. "master" and "v0.2.0" have entirely different histories.

288 changed files with 1499 additions and 13725 deletions

29
.gitignore vendored
View File

@ -1,11 +1,18 @@
/.bundle/ *.gem
/.yardoc/ *.rbc
/_yardoc/ .bundle
/build_test_run/ .config
/coverage/ .yardoc
/dist/ Gemfile.lock
/gen/ InstalledFiles
/large_project/ _yardoc
/pkg/ coverage
/test/ doc/
/yard/ lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
build_test_run

View File

@ -1,323 +0,0 @@
## v3.0.2
### Fixes
- #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.
- remove makefile target name check when parsing dependencies
## v1.16.0
### New Features
- Add `Rscons.glob`
- Support command-line variables
- improve debuggability of `cache.up_to_date?`
- allow passing a VarSet into cache methods
### Fixes
- generate dependencies for D builds
## v1.15.0
- allow json 1.x or 2.x
## v1.14.0
### New Features
- #45 - Add `Rscons::VarSet#values_at`
### Fixes
- #44 - `Environment#print_builder_run_message` should support string commands
## v1.13.0
### New Features
- #43 - Add ability to record side-effect file production
## v1.12.0
### New Features
- #40 - env.depends should imply `env.build_after`
- #41 - be more colorful
### Fixes
- #39 - wait for in-progress subcommands to complete on build failure
- #42 - cloned Environments should inherit `n_threads`
## v1.11.1
### Fixes
- fix the circular build dependency detection logic
## v1.11.0
### New Features
- Change default Environment :clone option to :all to clone all attributes
- #38 - raise error when circular dependencies are found
- #34 - Allow overriding `n_threads` on a per-Environment level
### Fixes
- #35 - `env.build_after` should expand paths
- #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
## v1.10.0
### New Features
- #23 - add parallelization - builds are now parallelized by default
- #31 - add LEXSUFFIX, YACCSUFFIX construction variables
- #30 - place object files for absolute source paths under build_root
- #28 - support redirecting standard output using the Command builder
- Always use a build root and default it to "build"
- Add builder features
- #8 - add SharedObject and SharedLibrary builders
### Fixes
- expand target and source paths before calling `Builder#create_build_target`
- #29 - fix `PROGSUFFIX` handling
- #32 - Pre-build hooks do not respect modified key values
## v1.9.3
- `Environment#parse_flags` should put -std=XXX flags in CCFLAGS, not CFLAGS
## v1.9.2
- allow phony targets in conjunction with build roots
## v1.9.1
- change *SUFFIX defaults to arrays
- add various C++ file suffixes
- use ${INCPREFIX} instead of hard-coded "-I" in Preprocess builder
## v1.9.0
### New Features
- #6 - add Install and Copy builders
- #22 - allow overriding Command builder short description with `CMD_DESC` variable
- #24 - add "rscons" executable
- #25 - add support for phony targets given as Symbols instead of Strings
- #26 - support registering multiple build targets with the same target name
- #27 - add Directory builder
### Fixes
- #20 - fix variable references that expand to arrays in build target sources
- #21 - rework Preprocess builder to consider deep dependencies
- fix `Rscons.set_suffix` to append the given suffix if the filename has none
- remove ${CFLAGS} from default `CPP_CMD`
## v1.8.1
- fix Environment#dump when construction variables are symbols
## v1.8.0
- new Command builder to execute arbitrary user commands
- new SimpleBuilder class
- create new builders quickly by passing a block to `Environment#add_builder`
- improved YARD documentation
- add Environment#dump to debug Environment construction variables
## v1.7.0
- allow build hooks to register new build targets
- add post-build hooks (register with `Environment#add_post_build_hook`)
- clear all build targets after processing an Environment
- allow trailing slashes in arguments to `Environment#build_dir`
## v1.6.1
- add DEPFILESUFFIX construction variable to override dependency file suffix
- fix Environment#depends to expand its arguments for construction variables
## v1.6.0
- support lambdas as construction variable values
## v1.5.0
- add "json" as a runtime dependency
- update construction variables to match SCons more closely
- add `CPPDEFPREFIX`, `INCPREFIX`, `CPPDEFINES`, `CCFLAGS`, `LIBDIRPREFIX`, and `LIBLINKPREFIX`
- add `Environment#shell`
- add `Environment#parse_flags`, `#parse_flags!`, `#merge_flags`
- unbuffer `$stdout` by default
- add `PROGSUFFIX` construction variable (defaults to `.exe` on MinGW/Cygwin)
- add `Rscons::BuildTarget` and `Builder#create_build_target`
- update specs to RSpec 3.x and fix to run on MinGW/Cygwin/Linux
- add YARD documentation to get to 100% coverage
## v1.4.3
- fix builders properly using construction variable overrides
- expand nil construction variables to empty strings
## v1.4.2
- add `Environment#expand_path`
- expand construction variable references in builder targets and sources before invoking builder
## v1.4.1
- fix invoking a builder with no sources while a build root defined
## v1.4.0
- add CFile builder
- add Disassemble builder
- add Preprocess builder
- pass the Environment object to build hooks in the :env key of the build_op parameter
- expand target/source paths beginning with "^/" to be relative to the Environment's build root
- many performance improvements, including:
- use JSON instead of YAML for the cache to improve loading speed (Issue #7)
- store a hash of the build command instead of the full command contents in the cache
- implement copy-on-write semantics for construction variables when cloning Environments
- only load the cache once instead of on each Environment#process
- only write the cache when something has changed
- fix `Cache#mkdir_p` to handle relative paths (Issue #5)
- flush the cache to disk if a builder raises an exception (Issue #4)
## v1.3.0
- change Environment#execute() options parameter to accept the following options keys:
- :env to pass an environment Hash to Kernel#system
- :options to pass an options Hash to Kernel#system
## v1.2.0
- add :clone option to Environment#clone to control exactly which Environment attributes are cloned
- allow nil to be passed in to `Environment#build_root=`
## v1.1.0
- Change `Cache#up_to_date?` and `#register_build` to accept a single target
file or an array of target file names

View File

@ -1,14 +0,0 @@
# Developing
# Specs
To run the rscons specs, the following commands must be available:
* gcc
* clang
* g++
* clang++
* gdc
* ldc
* flex
* bison

14
Gemfile
View File

@ -1,14 +1,4 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem "rspec" # Specify your gem's dependencies in rscons.gemspec
gem "rake" gemspec
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

View File

@ -1,52 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
diff-lcs (1.5.0)
docile (1.1.5)
json (2.6.1)
psych (4.0.3)
stringio
rake (13.0.6)
rdoc (6.4.0)
psych (>= 4.0.0)
redcarpet (3.5.1)
rspec (3.11.0)
rspec-core (~> 3.11.0)
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)
rspec-support (~> 3.11.0)
rspec-mocks (3.11.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.11.0)
rspec-support (3.11.0)
simplecov (0.15.1)
docile (~> 1.1.0)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.2)
stringio (3.0.1)
syntax (1.2.2)
webrick (1.7.0)
yard (0.9.27)
webrick (~> 1.7.0)
PLATFORMS
ruby
x86-mingw32
DEPENDENCIES
json
rake
rdoc
redcarpet
rspec
simplecov (~> 0.15.0)
syntax
yard
BUNDLED WITH
2.2.31

View File

@ -1,4 +1,4 @@
Copyright (c) 2013-2022 Josh Holtrop Copyright (c) 2013 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.

179
README.md
View File

@ -1,42 +1,159 @@
# Rscons # Rscons
![rscons logo](img/rscons_logo_1000.png) Software construction library inspired by SCons and implemented in Ruby
Rscons (https://github.com/holtrop/rscons) is an open-source build system [![Gem Version](https://badge.fury.io/rb/rscons.png)](http://badge.fury.io/rb/rscons)
for developers.
It supports the following features:
* multi-threaded job execution ## Installation
* auto-configuration
* built-in builders for several common operations
* out-of-the-box support for C, C++, and D languages
* extensibility for other languages or custom builders
* compatible with Windows, Linux, OS X, and FreeBSD
* colorized output with build progress
* build hooks
* user-defined tasks with dependencies and custom parameters
* build variants
At its core, Rscons is mainly an engine to: Add this line to your application's Gemfile:
* determine the proper order to perform build steps, gem "rscons"
* determine whether each build target is up to date or in need of rebuild, and
* schedule those build steps across multiple threads as efficiently as possible.
Along the way, Rscons provides a concise syntax for specifying common types of And then execute:
build steps, but also provides an extensible framework for performing
custom build operations as well.
Rscons takes inspiration from: $ bundle
* [SCons](https://scons.org/) Or install it yourself as:
* [waf](https://waf.io/)
* [rake](https://github.com/ruby/rake)
* [CMake](https://cmake.org/)
* [Autoconf](https://www.gnu.org/software/autoconf/)
Rscons is written in Ruby. $ gem install rscons
The only requirement to run Rscons is that the system has a Ruby interpreter
installed.
See [https://holtrop.github.io/rscons/index.html](https://holtrop.github.io/rscons/index.html) for User Guide and Installation instructions. ## Usage
Rscons is a Ruby library.
It can be called from a standalone Ruby script or it can be used with rake and
called from your Rakefile.
### Example: Building a C Program
```ruby
RScons::Environment.new do |env|
env["CFLAGS"] << "-Wall"
env.Program("program", Dir["**/*.c"])
end
```
### Example: Building a D Program
```ruby
RScons::Environment.new do |env|
env["DFLAGS"] << "-Wall"
env.Program("program", Dir["**/*.d"])
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", Dir["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", Dir["src/**/*.cc"])
end
```
### Example: Custom Builder
```ruby
class GenerateFoo < Rscons::Builder
def run(target, sources, cache, env, vars)
File.open(target, "w") do |fh|
fh.puts <<EOF
#define GENERATED 42
EOF
end
end
end
Rscons::Environment.new do |env|
env.GenerateFoo("foo.h", [])
env.Program("a.out", Dir["*.c"])
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", Dir["**/*.cc"])
end
```
### Example: Creating a static library
```ruby
Rscons::Environment.new do |env|
env.Library("mylib.a", Dir["src/**/*.c"])
end
```
## Details
### Default Builders
Rscons ships with a number of default builders:
* Library, which collects object files into a static library archive file
* Object, which compiles source files to produce an object file
* Program, which links object files to produce an executable
If you want to create an Environment that does not contain any (or select)
builders, you can use the `exclude_builders` key to the Environment constructor.
### Managing Environments
An Rscons::Environment consists of:
* a collection of construction variables
* a collection of builders
* a mapping of build directories
* a collection of targets to build
* a collection of build hooks
When cloning an environment, the construction variables and builders are
cloned, but the new environment does not inherit any of the targets, build
hooks, build directories, or the build root from the source environment.
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".
### Construction Variables
The default construction variables that Rscons uses are named using uppercase
strings.
Rscons options are lowercase symbols.
Lowercase strings are reserved as user-defined construction variables.
## 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

View File

@ -5,106 +5,22 @@ 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 "rake/clean" require "yard"
require "fileutils"
CLEAN.include %w[build_test_run .yardoc yard coverage test] RSpec::Core::RakeTask.new(:spec)
CLOBBER.include %w[dist gen large_project pkg]
task :build_dist do YARD::Rake::YardocTask.new do |yard|
sh "ruby rb/build_dist.rb" yard.files = ['lib/**/*.rb']
end
RSpec::Core::RakeTask.new(:spec, :example_string) do |task, args|
ENV["specs"] = "1"
if args.example_string
ENV["partial_specs"] = "1"
task.rspec_opts = %W[-e "#{args.example_string}" -f documentation]
end
end
task :spec => :build_dist
task :spec do
ENV.delete("specs")
end
# dspec task is useful to test the distributable release script, but is not
# 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 => [ task :clean do
:build_dist, FileUtils.rm_rf(["build_test_run", "doc", "coverage"])
:spec, end
:dspec,
:yard, task :clobber => :clean do
:user_guide, FileUtils.rm_rf(["pkg"])
] end

View File

@ -1,7 +0,0 @@
#!/usr/bin/env ruby
require "rscons/cli"
if __FILE__ == $0
Rscons::Cli.new.run(ARGV)
end

View File

@ -1,4 +0,0 @@
env do |env|
env.CFile("lexer.c", "lexer.l")
env.CFile("parser.c", "parser.y")
end

View File

@ -1,3 +0,0 @@
env do |env|
env.CFile("file.c", "foo.bar")
end

View File

@ -1,4 +0,0 @@
%{
%}
%%

View File

@ -1,9 +0,0 @@
%{
%}
%token ONE
%%
one: ONE
;

View File

@ -1,10 +0,0 @@
debug = env(echo: :command) do |env|
env['CFLAGS'] = '-O2'
env['CPPFLAGS'] = '-DSTRING="Debug Version"'
env.Program('program-debug.exe', Dir['src/*.c'])
end
release = debug.clone do |env|
env["CPPFLAGS"] = '-DSTRING="Release Version"'
env.Program('program-release.exe', Dir['src/*.c'])
end

View File

@ -1,14 +0,0 @@
env1 = env(echo: :command) do |env|
env['CFLAGS'] = '-O2'
env.add_build_hook do |builder|
builder.vars['CPPFLAGS'] = '-DSTRING="Hello"'
end
env.add_post_build_hook do |builder|
$stdout.puts "post #{builder.target}"
end
env.Program('program.exe', Dir['src/*.c'])
end
env2 = env1.clone do |env|
env.Program('program2.exe', Dir['src/*.c'])
end

View File

@ -1,4 +0,0 @@
configure do
check_c_compiler "nope.nope"
end
default

View File

@ -1,3 +0,0 @@
autoconf false
env do |env|
end

View File

@ -1,8 +0,0 @@
configure do
check_c_compiler
check_c_header "stdio.h"
end
env do |env|
env.Program("simple.exe", "simple.c")
end

View File

@ -1,4 +0,0 @@
configure do
check_c_compiler
end
default

View File

@ -1,3 +0,0 @@
configure do
check_c_compiler "mycompiler"
end

View File

@ -1,3 +0,0 @@
configure do
check_c_compiler "gcc", "clang"
end

View File

@ -1,6 +0,0 @@
configure do
check_c_compiler "clang"
end
env do |env|
env.Program("simple.exe", "simple.c")
end

View File

@ -1,12 +0,0 @@
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

View File

@ -1,8 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_c_header "not___found.h"
end

View File

@ -1,3 +0,0 @@
configure do
check_c_header "not___found.h", fail: false
end

View File

@ -1,7 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_c_header "string.h"
end

View File

@ -1,7 +0,0 @@
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

View File

@ -1,7 +0,0 @@
configure do
check_cfg program: "my-config"
end
env(echo: :command) do |env|
env.Program("myconfigtest", "simple.c")
end

View File

@ -1,7 +0,0 @@
configure do
check_cfg package: "mypackage"
end
env(echo: :command) do |env|
env.Program("myconfigtest", "simple.c")
end

View File

@ -1,13 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_cxx_compiler
end

View File

@ -1,3 +0,0 @@
configure do
check_cxx_compiler "mycompiler"
end

View File

@ -1,3 +0,0 @@
configure do
check_cxx_compiler "g++", "clang++"
end

View File

@ -1,12 +0,0 @@
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

View File

@ -1,8 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_cxx_header "not___found.h"
end

View File

@ -1,3 +0,0 @@
configure do
check_cxx_header "not___found.h", fail: false
end

View File

@ -1,3 +0,0 @@
configure do
check_cxx_header "string.h"
end

View File

@ -1,3 +0,0 @@
configure do
check_d_compiler
end

View File

@ -1,3 +0,0 @@
configure do
check_d_compiler "mycompiler"
end

View File

@ -1,3 +0,0 @@
configure do
check_d_compiler "gdc", "ldc2"
end

View File

@ -1,12 +0,0 @@
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

View File

@ -1,9 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_d_import "not.found"
end

View File

@ -1,3 +0,0 @@
configure do
check_d_import "not.found", fail: false
end

View File

@ -1,4 +0,0 @@
configure do
check_d_compiler
check_d_import "std.stdio"
end

View File

@ -1,3 +0,0 @@
configure do
check_lib "mfoofoo"
end

View File

@ -1,3 +0,0 @@
env(echo: :command) do |env|
env.Library("usr2/libfrobulous.a", "two.c")
end

View File

@ -1,8 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_lib "mfoofoo", fail: false
end

View File

@ -1,7 +0,0 @@
configure do
check_lib "m"
end
env(echo: :command) do |env|
env.Program("simple.exe", "simple.c")
end

View File

@ -1,13 +0,0 @@
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

View File

@ -1,8 +0,0 @@
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

View File

@ -1,3 +0,0 @@
configure do
check_program "program-that-is-not-found"
end

View File

@ -1,3 +0,0 @@
configure do
check_program "program-that-is-not-found", fail: false
end

View File

@ -1,3 +0,0 @@
configure do
check_program "find"
end

View File

@ -1,6 +0,0 @@
configure do
check_c_compiler
end
env do |env|
puts "Prefix is #{Task["configure"]["prefix"]}"
end

View File

@ -1,28 +0,0 @@
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

View File

@ -1,13 +0,0 @@
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

View File

@ -1,8 +0,0 @@
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

View File

@ -1,3 +0,0 @@
default do
puts "default"
end

View File

@ -1,5 +0,0 @@
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

View File

@ -1 +0,0 @@
check_c_compiler "gcc"

View File

@ -1,6 +0,0 @@
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("This is a simple C program\n");
}

View File

@ -1,6 +0,0 @@
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hi" << std::endl;
}

View File

@ -1,7 +0,0 @@
import std.stdio;
int main()
{
writeln("Hello");
return 0;
}

View File

@ -1,4 +0,0 @@
int two(void)
{
return 42;
}

View File

@ -1,16 +0,0 @@
class MySource < Rscons::Builder
def run(options)
File.open(@target, 'w') do |fh|
fh.puts <<EOF
#define THE_VALUE 5678
EOF
end
true
end
end
env do |env|
env.add_builder(MySource)
env.MySource('inc.h', [])
env.Program('program.exe', Dir['*.c'])
end

View File

@ -1,11 +0,0 @@
env do |env|
env.Command("inc.c",
[],
"CMD" => %w[ruby gen.rb ${_TARGET}],
"CMD_DESC" => "Generating")
env["build_root"] = env.build_root
env["inc_c"] = "inc.c"
env.Object("program.o", "program.c")
env.build_after("program.o", "${inc_c}")
env.Program("program.exe", ["program.o", "inc.c"])
end

View File

@ -1,18 +0,0 @@
class MySource < Rscons::Builder
def run(options)
File.open(@target, 'w') do |fh|
fh.puts <<EOF
#define THE_VALUE 678
EOF
end
true
end
end
env = env do |env|
env["hdr"] = "inc.h"
env["src"] = "program.c"
env.add_builder(MySource)
env.MySource('${hdr}')
env.Program('program.exe', "${src}")
end

View File

@ -1,28 +0,0 @@
class MySource < Rscons::Builder
def run(options)
File.open(@target, 'w') do |fh|
fh.puts <<EOF
#define THE_VALUE #{@env.expand_varref("${the_value}")}
EOF
end
true
end
end
e1 = env do |env|
env.add_builder(MySource)
env["one"] = "5"
env[:cfg] = {val: "9"}
env["two"] = lambda do |args|
args[:env][:cfg][:val]
end
env["the_value"] = lambda do |args|
"${one}${two}78"
end
end
e1.clone do |env|
env[:cfg][:val] = "6"
env.MySource('inc.h', [])
env.Program('program.exe', Dir['*.c'])
end

View File

@ -1,6 +0,0 @@
env do |env|
env.add_builder(:MyBuilder) do |options|
"hi"
end
env.MyBuilder("foo")
end

View File

@ -1,6 +0,0 @@
env do |env|
env.add_builder(:MyBuilder) do |options|
wait_for(1)
end
env.MyBuilder("foo")
end

View File

@ -1,9 +0,0 @@
sleep 1.0
c_file = ARGV.first
h_file = File.basename(c_file, ".c") + ".h"
File.open(c_file, "w") do |fh|
fh.puts
end
File.open(h_file, "w") do |fh|
fh.puts("#define THE_VALUE 191")
end

View File

@ -1,19 +0,0 @@
class CHGen < Rscons::Builder
def run(options)
c_fname = @target
h_fname = @target.sub(/\.c$/, ".h")
unless @cache.up_to_date?([c_fname, h_fname], "", @sources, @env)
puts "CHGen #{c_fname}"
File.open(c_fname, "w") {|fh| fh.puts "int THE_VALUE = 42;"}
File.open(h_fname, "w") {|fh| fh.puts "extern int THE_VALUE;"}
@cache.register_build([c_fname, h_fname], "", @sources, @env)
end
true
end
end
env do |env|
env.add_builder(CHGen)
env.CHGen("inc.c", ["program.c"])
env.Program("program.exe", %w[program.c inc.c])
end

View File

@ -1,15 +0,0 @@
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"])
inc_c = env.Command("inc.c",
[],
"CMD" => %w[ruby gen.rb ${_TARGET}],
"CMD_DESC" => "Generating")
inc_c.produces("inc.h")
end

View File

@ -1,15 +0,0 @@
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

View File

@ -1,19 +0,0 @@
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

View File

@ -1,7 +0,0 @@
configure do
check_d_compiler "gdc"
end
env(echo: :command) do |env|
env.Program("hello-d.exe", glob("*.d"))
end

View File

@ -1,7 +0,0 @@
configure do
check_d_compiler "ldc2"
end
env(echo: :command) do |env|
env.Program("hello-d.exe", glob("*.d"))
end

View File

@ -1,5 +0,0 @@
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

View File

@ -1,7 +1,6 @@
import std.stdio; import std.stdio;
import mod;
void main() void main()
{ {
writeln("Hello from D, value is ", Klass.VAL, "!"); writeln("Hello from D!");
} }

View File

@ -1,4 +0,0 @@
class Klass
{
enum VAL = 42;
};

View File

@ -1,3 +0,0 @@
env do |env|
env.Program("test.exe", glob("*.c"), direct: true)
end

View File

@ -1,5 +0,0 @@
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

View File

@ -1,7 +0,0 @@
#include "two.h"
int main(int argc, char * argv[])
{
two();
return 0;
}

View File

@ -1,7 +0,0 @@
#include "three.h"
#include <stdio.h>
void three(void)
{
printf("three\n");
}

View File

@ -1 +0,0 @@
void three(void);

View File

@ -1,7 +0,0 @@
#include "two.h"
#include "three.h"
void two(void)
{
three();
}

View File

@ -1 +0,0 @@
void two(void);

View File

@ -1,3 +0,0 @@
env do |env|
env.Program('header.exe', Dir['*.c'])
end

View File

@ -1,16 +0,0 @@
env do |env|
require 'json'
require 'yaml'
env.add_builder(:JsonToYaml) do |params|
unless @cache.up_to_date?(@target, :JsonToYaml, @sources, @env)
print_run_message("JsonToYaml #{@target}", nil)
@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
true
end
env.JsonToYaml('foo.yml', 'foo.json')
end

View File

@ -1 +0,0 @@
{ "key": "value" }

View File

@ -1,7 +0,0 @@
env(echo: :command) do |env|
env["LIBS"] << "mylib"
env["LIBPATH"] << "."
env.Program("library.exe", "one.c")
env.depends("library.exe", "libmylib.a")
env.Library("libmylib.a", ["two.c", "three.c"], "CPPFLAGS" => ["-Dmake_lib"])
end

View File

@ -1,5 +0,0 @@
env do |env|
env.Program("library.exe", ["lib.a", "three.c"])
env.Object("two.o", "two.c")
env.Library("lib.a", ["one.c", "two.o"], 'CPPFLAGS' => ['-Dmake_lib'])
end

Some files were not shown because too many files have changed in this diff Show More