Add 'build' DSL method.

Disallow processing Environments until configuration is performed.
This commit is contained in:
Josh Holtrop 2018-12-17 22:07:50 -05:00
parent 5720662b7c
commit f8e6666a2c
90 changed files with 637 additions and 434 deletions

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env.CFile("lexer.c", "lexer.l")
env.CFile("parser.c", "parser.y")
build do
Rscons::Environment.new do |env|
env.CFile("lexer.c", "lexer.l")
env.CFile("parser.c", "parser.y")
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.CFile("file.c", "foo.bar")
build do
Rscons::Environment.new do |env|
env.CFile("file.c", "foo.bar")
end
end

View File

@ -1,10 +1,12 @@
debug = Rscons::Environment.new(echo: :command) do |env|
env['CFLAGS'] = '-O2'
env['CPPFLAGS'] = '-DSTRING="Debug Version"'
env.Program('program-debug.exe', Dir['src/*.c'])
end
build do
debug = Rscons::Environment.new(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'])
release = debug.clone do |env|
env["CPPFLAGS"] = '-DSTRING="Release Version"'
env.Program('program-release.exe', Dir['src/*.c'])
end
end

View File

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

View File

@ -2,6 +2,8 @@ configure do
check_c_header "not___found.h", fail: false, set_define: "HAVE_NOT___FOUND_H"
end
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c")
build do
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c")
end
end

View File

@ -2,6 +2,8 @@ configure do
check_c_header "string.h", set_define: "HAVE_STRING_H"
end
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c")
build do
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c")
end
end

View File

@ -2,6 +2,8 @@ configure do
check_cfg program: "my-config"
end
Rscons::Environment.new(echo: :command) do |env|
env.Program("myconfigtest", "simple.c")
build do
Rscons::Environment.new(echo: :command) do |env|
env.Program("myconfigtest", "simple.c")
end
end

View File

@ -2,6 +2,8 @@ configure do
check_cfg package: "mypackage"
end
Rscons::Environment.new(echo: :command) do |env|
env.Program("myconfigtest", "simple.c")
build do
Rscons::Environment.new(echo: :command) do |env|
env.Program("myconfigtest", "simple.c")
end
end

View File

@ -0,0 +1,4 @@
Environment.new do |env|
env.Object("simple.o", "simple.cc")
env.process
end

View File

@ -3,6 +3,8 @@ configure do
check_c_header "stdio.h", set_define: "HAVE_STDIO_H"
end
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c")
build do
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c")
end
end

View File

@ -9,8 +9,10 @@ EOF
end
end
Rscons::Environment.new do |env|
env.add_builder(MySource.new)
env.MySource('inc.h', [])
env.Program('program.exe', Dir['*.c'])
build do
Rscons::Environment.new do |env|
env.add_builder(MySource.new)
env.MySource('inc.h', [])
env.Program('program.exe', Dir['*.c'])
end
end

View File

@ -1,10 +1,12 @@
Rscons::Environment.new 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.build_after("${build_root}/program.o", "${inc_c}")
env.Program("program.exe", ["program.c", "inc.c"])
build do
Rscons::Environment.new 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.build_after("${build_root}/program.o", "${inc_c}")
env.Program("program.exe", ["program.c", "inc.c"])
end
end

View File

@ -9,10 +9,12 @@ EOF
end
end
env = Rscons::Environment.new do |env|
env["hdr"] = "inc.h"
env["src"] = "program.c"
env.add_builder(MySource.new)
env.MySource('${hdr}')
env.Program('program.exe', "${src}")
build do
env = Rscons::Environment.new do |env|
env["hdr"] = "inc.h"
env["src"] = "program.c"
env.add_builder(MySource.new)
env.MySource('${hdr}')
env.Program('program.exe', "${src}")
end
end

View File

@ -9,20 +9,22 @@ EOF
end
end
e1 = Rscons::Environment.new do |env|
env.add_builder(MySource.new)
env["one"] = "5"
env[:cfg] = {val: "9"}
env["two"] = lambda do |args|
args[:env][:cfg][:val]
build do
e1 = Rscons::Environment.new do |env|
env.add_builder(MySource.new)
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
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'])
e1.clone do |env|
env[:cfg][:val] = "6"
env.MySource('inc.h', [])
env.Program('program.exe', Dir['*.c'])
end
end

View File

@ -12,8 +12,10 @@ class CHGen < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(CHGen.new)
env.CHGen("inc.c", ["program.c"])
env.Program("program.exe", %w[program.c inc.c])
build do
Rscons::Environment.new do |env|
env.add_builder(CHGen.new)
env.CHGen("inc.c", ["program.c"])
env.Program("program.exe", %w[program.c inc.c])
end
end

View File

@ -1,14 +1,16 @@
Rscons::Environment.new do |env|
env["build_root"] = env.build_root
env["inc_h"] = "inc.h"
build do
Rscons::Environment.new do |env|
env["build_root"] = env.build_root
env["inc_h"] = "inc.h"
env.Copy("copy_inc.h", "${inc_h}")
env.depends("${build_root}/program.o", "${inc_h}")
env.Program("program.exe", ["program.c", "inc.c"])
env.Copy("copy_inc.h", "${inc_h}")
env.depends("${build_root}/program.o", "${inc_h}")
env.Program("program.exe", ["program.c", "inc.c"])
env.Command("inc.c",
[],
"CMD" => %w[ruby gen.rb ${_TARGET}],
"CMD_DESC" => "Generating")
env.produces("inc.c", "inc.h")
env.Command("inc.c",
[],
"CMD" => %w[ruby gen.rb ${_TARGET}],
"CMD_DESC" => "Generating")
env.produces("inc.c", "inc.h")
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new(echo: :command) do |env|
env.Program("hello-d.exe", Rscons.glob("*.d"))
build do
Rscons::Environment.new(echo: :command) do |env|
env.Program("hello-d.exe", Rscons.glob("*.d"))
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Program('header.exe', Dir['*.c'])
build do
Rscons::Environment.new do |env|
env.Program('header.exe', Dir['*.c'])
end
end

View File

@ -1,15 +1,17 @@
Rscons::Environment.new do |env|
require 'json'
require 'yaml'
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))))
build do
Rscons::Environment.new do |env|
require 'json'
require 'yaml'
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
cache.register_build(target, :JsonToYaml, sources, env)
target
end
target
env.JsonToYaml('foo.yml', 'foo.json')
end
env.JsonToYaml('foo.yml', 'foo.json')
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new(echo: :command) do |env|
env.Program('library.exe', ['lib.a', 'three.c'])
env.Library("lib.a", ['one.c', 'two.c'], 'CPPFLAGS' => ['-Dmake_lib'])
build do
Rscons::Environment.new(echo: :command) do |env|
env.Program('library.exe', ['lib.a', 'three.c'])
env.Library("lib.a", ['one.c', 'two.c'], 'CPPFLAGS' => ['-Dmake_lib'])
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new(echo: :command) do |env|
env["ARCMD"] = %w[ar rcf ${_TARGET} ${_SOURCES}]
env.Library("lib.a", Rscons.glob("*.c"))
build do
Rscons::Environment.new(echo: :command) do |env|
env["ARCMD"] = %w[ar rcf ${_TARGET} ${_SOURCES}]
env.Library("lib.a", Rscons.glob("*.c"))
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Preprocess("pp", "foo.h")
build do
Rscons::Environment.new do |env|
env.Preprocess("pp", "foo.h")
end
end

View File

@ -1,11 +1,13 @@
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.c"))
env.Program("test-shared.exe",
Rscons.glob("src/*.c"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
env.Program("test-static.exe",
Rscons.glob("src/**/*.c"))
build do
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.c"))
env.Program("test-shared.exe",
Rscons.glob("src/*.c"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
env.Program("test-static.exe",
Rscons.glob("src/**/*.c"))
end
end

View File

@ -1,6 +1,8 @@
Rscons::Environment.new do |env|
File.open("foo.xyz", "wb") do |fh|
fh.puts("hi")
build do
Rscons::Environment.new do |env|
File.open("foo.xyz", "wb") do |fh|
fh.puts("hi")
end
env.SharedObject("foo.o", "foo.xyz")
end
env.SharedObject("foo.o", "foo.xyz")
end

View File

@ -1,11 +1,13 @@
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.cc"))
env.Program("test-shared.exe",
Rscons.glob("src/*.cc"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
env.Program("test-static.exe",
Rscons.glob("src/**/*.cc"))
build do
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.cc"))
env.Program("test-shared.exe",
Rscons.glob("src/*.cc"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
env.Program("test-static.exe",
Rscons.glob("src/**/*.cc"))
end
end

View File

@ -1,9 +1,11 @@
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.d"))
env.Program("test-shared.exe",
Rscons.glob("src/*.c"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
build do
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.d"))
env.Program("test-shared.exe",
Rscons.glob("src/*.c"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
end
end

View File

@ -1,12 +1,14 @@
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
env["SHLD"] = "gcc"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.c"))
env.Program("test-shared.exe",
Rscons.glob("src/*.c"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
env.Program("test-static.exe",
Rscons.glob("src/**/*.c"))
build do
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/lib"
env["SHLD"] = "gcc"
libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.c"))
env.Program("test-shared.exe",
Rscons.glob("src/*.c"),
"LIBPATH" => %w[.],
"LIBS" => %w[mine])
env.build_after("test-shared.exe", libmine.to_s)
env.Program("test-static.exe",
Rscons.glob("src/**/*.c"))
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Program('simple.exe', Dir['*.c'])
build do
Rscons::Environment.new do |env|
env.Program('simple.exe', Dir['*.c'])
end
end

View File

@ -1,13 +1,15 @@
Rscons::Environment.new do |env|
tempdir = ENV["TEMP"] || ENV["TMP"] || "/tmp"
source_file = File.join(tempdir, "abs.c")
File.open(source_file, "w") do |fh|
fh.puts(<<-EOF)
int main()
{
return 29;
}
EOF
build do
Rscons::Environment.new do |env|
tempdir = ENV["TEMP"] || ENV["TMP"] || "/tmp"
source_file = File.join(tempdir, "abs.c")
File.open(source_file, "w") do |fh|
fh.puts(<<-EOF)
int main()
{
return 29;
}
EOF
end
env.Program("abs.exe", source_file)
end
env.Program("abs.exe", source_file)
end

View File

@ -12,10 +12,11 @@ class MyObject < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(MyObject.new)
File.open("test.xyz", "w") do |fh|
fh.puts <<EOF
build do
Rscons::Environment.new do |env|
env.add_builder(MyObject.new)
File.open("test.xyz", "w") do |fh|
fh.puts <<EOF
#include <stdio.h>
int main(int argc, char * argv[])
{
@ -23,6 +24,7 @@ int main(int argc, char * argv[])
return 0;
}
EOF
env.Program("test", "test.xyz")
env.Program("test", "test.xyz")
end
end
end

View File

@ -8,15 +8,17 @@ class MyProgram < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(MyProgram.new)
env.Object("simple.o", "simple.c")
File.open("two.c", "wb") do |fh|
fh.puts <<-EOF
void two(void)
{
}
EOF
build do
Rscons::Environment.new do |env|
env.add_builder(MyProgram.new)
env.Object("simple.o", "simple.c")
File.open("two.c", "wb") do |fh|
fh.puts <<-EOF
void two(void)
{
}
EOF
end
env.MyProgram("simple.exe", ["simple.o", "two.c"])
end
env.MyProgram("simple.exe", ["simple.o", "two.c"])
end

View File

@ -3,7 +3,9 @@ class TestBuilder < Rscons::Builder
target
end
end
Rscons::Environment.new do |env|
env.add_builder(TestBuilder.new)
env.TestBuilder("file")
build do
Rscons::Environment.new do |env|
env.add_builder(TestBuilder.new)
env.TestBuilder("file")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env["LIBS"] += ["c"]
env.Program('simple.exe', Dir['*.c'])
build do
Rscons::Environment.new do |env|
env["LIBS"] += ["c"]
env.Program('simple.exe', Dir['*.c'])
end
end

View File

@ -25,10 +25,12 @@ class DebugBuilder < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(DebugBuilder.new)
if Rscons.vars["new_user_dep"]
env.depends("foo.o", "new_dep")
build do
Rscons::Environment.new do |env|
env.add_builder(DebugBuilder.new)
if Rscons.vars["new_user_dep"]
env.depends("foo.o", "new_dep")
end
env.DebugBuilder("foo.o", "simple.c")
end
env.DebugBuilder("foo.o", "simple.c")
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Copy("simple.copy", "simple.c")
build do
Rscons::Environment.new do |env|
env.Copy("simple.copy", "simple.c")
end
end

View File

@ -1,6 +1,8 @@
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.process
env["LDCMD"] = %w[gcc -o ${_TARGET} simple.o]
env.Program('simple.exe', [])
build do
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.process
env["LDCMD"] = %w[gcc -o ${_TARGET} simple.o]
env.Program('simple.exe', [])
end
end

View File

@ -1,5 +1,7 @@
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env["LDCMD"] = %w[gcc -o ${_TARGET} simple.o]
env.Program('simple.exe', ["simple.o"])
build do
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env["LDCMD"] = %w[gcc -o ${_TARGET} simple.o]
env.Program('simple.exe', ["simple.o"])
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.Object("two.o", "two.c")
build do
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.Object("two.o", "two.c")
end
end

View File

@ -1,5 +1,7 @@
Rscons::Environment.new do |env|
target = env.Program("simple.exe", "simple.c")
user_deps = File.read("user_deps", mode: "rb").split(" ")
target.depends(*user_deps)
build do
Rscons::Environment.new do |env|
target = env.Program("simple.exe", "simple.c")
user_deps = File.read("user_deps", mode: "rb").split(" ")
target.depends(*user_deps)
end
end

View File

@ -14,7 +14,9 @@ class TestBuilder < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(TestBuilder.new)
env.TestBuilder("foo")
build do
Rscons::Environment.new do |env|
env.add_builder(TestBuilder.new)
env.TestBuilder("foo")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env.Program("simple.exe", "simple.c")
env.clear_targets
build do
Rscons::Environment.new do |env|
env.Program("simple.exe", "simple.c")
env.clear_targets
end
end

View File

@ -1,7 +1,9 @@
base_env = Rscons::Environment.new do |env|
env.n_threads = 165
build do
base_env = Rscons::Environment.new do |env|
env.n_threads = 165
end
my_env = base_env.clone
puts my_env.n_threads
end
my_env = base_env.clone
puts my_env.n_threads

View File

@ -1,4 +1,6 @@
Rscons::Environment.new(echo: :command) do |env|
env["LD"] = "gcc"
env.Program('simple.exe', Dir['*.c'])
build do
Rscons::Environment.new(echo: :command) do |env|
env["LD"] = "gcc"
env.Program('simple.exe', Dir['*.c'])
end
end

View File

@ -1,7 +1,9 @@
Rscons::Environment.new do |env|
command = %W[gcc -o ${_TARGET} ${_SOURCES}]
env.Command("simple.exe",
"simple.c",
"CMD" => command,
"CMD_DESC" => "BuildIt")
build do
Rscons::Environment.new do |env|
command = %W[gcc -o ${_TARGET} ${_SOURCES}]
env.Command("simple.exe",
"simple.c",
"CMD" => command,
"CMD_DESC" => "BuildIt")
end
end

View File

@ -1,8 +1,10 @@
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.Command("simple.txt",
"simple.o",
"CMD" => %w[objdump --disassemble --source ${_SOURCES}],
"CMD_STDOUT" => "${_TARGET}",
"CMD_DESC" => "My Disassemble")
build do
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.Command("simple.txt",
"simple.o",
"CMD" => %w[objdump --disassemble --source ${_SOURCES}],
"CMD_STDOUT" => "${_TARGET}",
"CMD_DESC" => "My Disassemble")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env["sources"] = Rscons.glob("*.c")
env.Program("simple.exe", "${sources}")
build do
Rscons::Environment.new do |env|
env["sources"] = Rscons.glob("*.c")
env.Program("simple.exe", "${sources}")
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Directory("teh_dir")
build do
Rscons::Environment.new do |env|
env.Directory("teh_dir")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.Disassemble("simple.txt", "simple.o")
build do
Rscons::Environment.new do |env|
env.Object("simple.o", "simple.c")
env.Disassemble("simple.txt", "simple.o")
end
end

View File

@ -1,5 +1,7 @@
env = Rscons::Environment.new do |env|
env["CFLAGS"] += %w[-O2 -fomit-frame-pointer]
env[:foo] = :bar
build do
env = Rscons::Environment.new do |env|
env["CFLAGS"] += %w[-O2 -fomit-frame-pointer]
env[:foo] = :bar
end
env.dump
end
env.dump

View File

@ -1,5 +1,7 @@
Rscons::Environment.new do |env|
env.Command("foo", "bar")
env.Command("bar", "baz")
env.Command("baz", "foo")
build do
Rscons::Environment.new do |env|
env.Command("foo", "bar")
env.Command("bar", "baz")
env.Command("baz", "foo")
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Command("foo", "foo")
build do
Rscons::Environment.new do |env|
env.Command("foo", "foo")
end
end

View File

@ -1,6 +1,8 @@
Rscons::Environment.new do |env|
File.open("foo.xyz", "wb") do |fh|
fh.puts("hi")
build do
Rscons::Environment.new do |env|
File.open("foo.xyz", "wb") do |fh|
fh.puts("hi")
end
env.Object("foo.o", "foo.xyz")
end
env.Object("foo.o", "foo.xyz")
end

View File

@ -1,5 +1,7 @@
Rscons::Environment.new(echo: :command) do |env|
env["LD"] = "gcc"
env["LIBPATH"] += ["libdir"]
env.Program('simple.exe', Dir['*.c'])
build do
Rscons::Environment.new(echo: :command) do |env|
env["LD"] = "gcc"
env["LIBPATH"] += ["libdir"]
env.Program('simple.exe', Dir['*.c'])
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c",
"CCCMD" => %w[${CC} -c -o ${_TARGET} -Dfoobar ${_SOURCES}])
build do
Rscons::Environment.new(echo: :command) do |env|
env.Object("simple.o", "simple.c",
"CCCMD" => %w[${CC} -c -o ${_TARGET} -Dfoobar ${_SOURCES}])
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new(echo: :command) do |env|
env["DEPFILESUFFIX"] = ".deppy"
env.Object("simple.o", "simple.c")
build do
Rscons::Environment.new(echo: :command) do |env|
env["DEPFILESUFFIX"] = ".deppy"
env.Object("simple.o", "simple.c")
end
end

View File

@ -1,11 +1,13 @@
Rscons::Environment.new do |env|
env.add_builder(:Checker) do |target, sources, cache, env, vars|
unless cache.up_to_date?(target, :Checker, sources, env)
puts "Checker #{sources.first}" if env.echo != :off
cache.register_build(target, :Checker, sources, env)
build do
Rscons::Environment.new do |env|
env.add_builder(:Checker) do |target, sources, cache, env, vars|
unless cache.up_to_date?(target, :Checker, sources, env)
puts "Checker #{sources.first}" if env.echo != :off
cache.register_build(target, :Checker, sources, env)
end
target
end
target
env.Program("simple.exe", "simple.c")
env.Checker(:checker, "simple.exe")
end
env.Program("simple.exe", "simple.c")
env.Checker(:checker, "simple.exe")
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env.Preprocess("simplepp.c", "simple.c")
env.Program("simple.exe", "simplepp.c")
build do
Rscons::Environment.new do |env|
env.Preprocess("simplepp.c", "simple.c")
env.Program("simple.exe", "simplepp.c")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env["PROGSUFFIX"] = ".out"
env.Program("simple", Dir["*.c"])
build do
Rscons::Environment.new do |env|
env["PROGSUFFIX"] = ".out"
env.Program("simple", Dir["*.c"])
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env["MYSUFFIX"] = ".out"
env.Program("simple${MYSUFFIX}", Dir["*.c"])
build do
Rscons::Environment.new do |env|
env["MYSUFFIX"] = ".out"
env.Program("simple${MYSUFFIX}", Dir["*.c"])
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Program("simple", Dir["*.c"], "PROGSUFFIX" => ".xyz")
build do
Rscons::Environment.new do |env|
env.Program("simple", Dir["*.c"], "PROGSUFFIX" => ".xyz")
end
end

View File

@ -1,8 +1,10 @@
Rscons::Environment.new do |env|
env.Program("simple.exe", Dir["*.c"])
env.add_build_hook do |build_op|
if build_op[:target].end_with?(".o")
env.Disassemble("#{build_op[:target]}.txt", build_op[:target])
build do
Rscons::Environment.new do |env|
env.Program("simple.exe", Dir["*.c"])
env.add_build_hook do |build_op|
if build_op[:target].end_with?(".o")
env.Disassemble("#{build_op[:target]}.txt", build_op[:target])
end
end
end
end

View File

@ -5,8 +5,10 @@ class MyObject < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(MyObject.new)
env.MyObject("simple.o", "simple.c")
env.Program("simple.exe", "simple.o")
build do
Rscons::Environment.new do |env|
env.add_builder(MyObject.new)
env.MyObject("simple.o", "simple.c")
env.Program("simple.exe", "simple.o")
end
end

View File

@ -1,17 +1,19 @@
class MyCommand < Rscons::Builder
def run(target, sources, cache, env, vars)
vars = vars.merge({
"_TARGET" => target,
"_SOURCES" => sources,
})
command = env.build_command("${CMD}", vars)
cmd_desc = vars["CMD_DESC"] || "MyCommand"
standard_build("#{cmd_desc} #{target}", target, command, sources, env, cache)
build do
class MyCommand < Rscons::Builder
def run(target, sources, cache, env, vars)
vars = vars.merge({
"_TARGET" => target,
"_SOURCES" => sources,
})
command = env.build_command("${CMD}", vars)
cmd_desc = vars["CMD_DESC"] || "MyCommand"
standard_build("#{cmd_desc} #{target}", target, command, sources, env, cache)
end
end
Rscons::Environment.new do |env|
env.add_builder(MyCommand.new)
command = %w[gcc -c -o ${_TARGET} ${_SOURCES}]
env.MyCommand("simple.o", "simple.c", "CMD" => command)
end
end
Rscons::Environment.new do |env|
env.add_builder(MyCommand.new)
command = %w[gcc -c -o ${_TARGET} ${_SOURCES}]
env.MyCommand("simple.o", "simple.c", "CMD" => command)
end

View File

@ -18,11 +18,13 @@ class NonThreadedTestBuilder < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(ThreadedTestBuilder.new)
env.add_builder(NonThreadedTestBuilder.new)
env.ThreadedTestBuilder("a")
env.ThreadedTestBuilder("b")
env.ThreadedTestBuilder("c")
env.NonThreadedTestBuilder("d")
build do
Rscons::Environment.new do |env|
env.add_builder(ThreadedTestBuilder.new)
env.add_builder(NonThreadedTestBuilder.new)
env.ThreadedTestBuilder("a")
env.ThreadedTestBuilder("b")
env.ThreadedTestBuilder("c")
env.NonThreadedTestBuilder("d")
end
end

View File

@ -14,9 +14,11 @@ class TestBuilder < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(TestBuilder.new)
env.TestBuilder("one", [], "wait_time" => "3")
env.TestBuilder("two", [], "wait_time" => "0")
env.depends("two", "one")
build do
Rscons::Environment.new do |env|
env.add_builder(TestBuilder.new)
env.TestBuilder("one", [], "wait_time" => "3")
env.TestBuilder("two", [], "wait_time" => "0")
env.depends("two", "one")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
program = env.Program("simple.exe", Dir["*.c"])
env.depends(program, "program.ld")
build do
Rscons::Environment.new do |env|
program = env.Program("simple.exe", Dir["*.c"])
env.depends(program, "program.ld")
end
end

View File

@ -11,10 +11,12 @@ class Fail < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.add_builder(Fail.new)
4.times do |i|
wait_time = i + 1
env.Fail("foo_#{wait_time}", [], "wait_time" => wait_time.to_s)
build do
Rscons::Environment.new do |env|
env.add_builder(Fail.new)
4.times do |i|
wait_time = i + 1
env.Fail("foo_#{wait_time}", [], "wait_time" => wait_time.to_s)
end
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Program('simple.exe', Dir['*.cc'])
build do
Rscons::Environment.new do |env|
env.Program('simple.exe', Dir['*.cc'])
end
end

View File

@ -1,5 +1,7 @@
Rscons::Environment.new do |env|
env["CXXSUFFIX"] = %w[.cccc .cc]
env["CXXFLAGS"] += %w[-x c++]
env.Program("simple.exe", Dir["*.cc"] + Dir["*.cccc"])
build do
Rscons::Environment.new do |env|
env["CXXSUFFIX"] = %w[.cccc .cc]
env["CXXFLAGS"] += %w[-x c++]
env.Program("simple.exe", Dir["*.cc"] + Dir["*.cccc"])
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new do |env|
env.Preprocess("simplepp.cc", "simple.cc")
env.Program("simple.exe", "simplepp.cc")
build do
Rscons::Environment.new do |env|
env.Preprocess("simplepp.cc", "simple.cc")
env.Program("simple.exe", "simplepp.cc")
end
end

View File

@ -1,4 +1,6 @@
Rscons::Environment.new(echo: :command) do |env|
env.Object("one.o", "one.c", 'CPPFLAGS' => ['-DONE'])
env.Program('two_sources.exe', ['one.o', 'two.c'])
build do
Rscons::Environment.new(echo: :command) do |env|
env.Object("one.o", "one.c", 'CPPFLAGS' => ['-DONE'])
env.Program('two_sources.exe', ['one.o', 'two.c'])
end
end

View File

@ -1,7 +1,9 @@
Rscons::Environment.new do |env|
env["ASSUFFIX"] = %w[.ssss .sss]
env["CFLAGS"] += %w[-S]
env.Object("one.ssss", "one.c", "CPPFLAGS" => ["-DONE"])
env.Object("two.sss", "two.c")
env.Program("two_sources.exe", %w[one.ssss two.sss], "ASFLAGS" => env["ASFLAGS"] + %w[-x assembler])
build do
Rscons::Environment.new do |env|
env["ASSUFFIX"] = %w[.ssss .sss]
env["CFLAGS"] += %w[-S]
env.Object("one.ssss", "one.c", "CPPFLAGS" => ["-DONE"])
env.Object("two.sss", "two.c")
env.Program("two_sources.exe", %w[one.ssss two.sss], "ASFLAGS" => env["ASFLAGS"] + %w[-x assembler])
end
end

View File

@ -10,10 +10,12 @@ class StrictBuilder < Rscons::Builder
end
end
Rscons::Environment.new(echo: :command) do |env|
env.add_builder(StrictBuilder.new)
env.Object("one.o", "one.c", "CCFLAGS" => %w[-DONE])
env.Object("two.o", "two.c")
sources = File.read("sources", mode: "rb").split(" ")
env.StrictBuilder("program.exe", sources)
build do
Rscons::Environment.new(echo: :command) do |env|
env.add_builder(StrictBuilder.new)
env.Object("one.o", "one.c", "CCFLAGS" => %w[-DONE])
env.Object("two.o", "two.c")
sources = File.read("sources", mode: "rb").split(" ")
env.StrictBuilder("program.exe", sources)
end
end

View File

@ -1,6 +1,8 @@
Rscons::Environment.new() do |env|
env["LIBSUFFIX"] = %w[.aaaa .aaa]
env.Library("one.aaaa", "one.c", "CPPFLAGS" => ["-DONE"])
env.Library("two.aaa", "two.c")
env.Program("two_sources.exe", %w[one.aaaa two.aaa])
build do
Rscons::Environment.new() do |env|
env["LIBSUFFIX"] = %w[.aaaa .aaa]
env.Library("one.aaaa", "one.c", "CPPFLAGS" => ["-DONE"])
env.Library("two.aaa", "two.c")
env.Program("two_sources.exe", %w[one.aaaa two.aaa])
end
end

View File

@ -1,6 +1,8 @@
Rscons::Environment.new do |env|
env["OBJSUFFIX"] = %w[.oooo .ooo]
env.Object("one.oooo", "one.c", "CPPFLAGS" => ["-DONE"])
env.Object("two.ooo", "two.c")
env.Program("two_sources.exe", %w[one.oooo two.ooo])
build do
Rscons::Environment.new do |env|
env["OBJSUFFIX"] = %w[.oooo .ooo]
env.Object("one.oooo", "one.c", "CPPFLAGS" => ["-DONE"])
env.Object("two.ooo", "two.c")
env.Program("two_sources.exe", %w[one.oooo two.ooo])
end
end

View File

@ -1,22 +1,24 @@
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
class MyObject < Rscons::Builder
def run(target, sources, cache, env, vars)
env.run_builder(env.builders["Object"], target, sources, cache, vars)
end
end
build do
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
end

View File

@ -1,11 +1,13 @@
Rscons::Environment.new(echo: :command) do |env|
env.append('CPPPATH' => Rscons.glob('src/**/*/'))
env.add_build_hook do |build_op|
if File.basename(build_op[:target]) == "one.o"
build_op[:vars]["CFLAGS"] << "-O1"
elsif File.basename(build_op[:target]) == "two.o"
build_op[:vars]["CFLAGS"] << "-O2"
build do
Rscons::Environment.new(echo: :command) do |env|
env.append('CPPPATH' => Rscons.glob('src/**/*/'))
env.add_build_hook do |build_op|
if File.basename(build_op[:target]) == "one.o"
build_op[:vars]["CFLAGS"] << "-O1"
elsif File.basename(build_op[:target]) == "two.o"
build_op[:vars]["CFLAGS"] << "-O2"
end
end
env.Program('build_hook.exe', Rscons.glob('src/**/*.c'))
end
env.Program('build_hook.exe', Rscons.glob('src/**/*.c'))
end

View File

@ -1,7 +1,9 @@
Rscons::Environment.new(echo: :command) do |env|
env.append('CPPPATH' => Rscons.glob('src/**').sort)
FileUtils.mkdir_p(env.build_root)
FileUtils.mv("src/one/one.c", env.build_root)
env.Object("^/one.o", "^/one.c")
env.Program("program.exe", Rscons.glob('src/**/*.c') + ["^/one.o"])
build do
Rscons::Environment.new(echo: :command) do |env|
env.append('CPPPATH' => Rscons.glob('src/**').sort)
FileUtils.mkdir_p(env.build_root)
FileUtils.mv("src/one/one.c", env.build_root)
env.Object("^/one.o", "^/one.c")
env.Program("program.exe", Rscons.glob('src/**/*.c') + ["^/one.o"])
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Copy("inst.exe", "copy.rb")
build do
Rscons::Environment.new do |env|
env.Copy("inst.exe", "copy.rb")
end
end

View File

@ -1,6 +1,8 @@
Rscons::Environment.new do |env|
env["CSUFFIX"] = %w[.yargh .c]
env["CFLAGS"] += %w[-x c]
env["CPPPATH"] += Rscons.glob("src/**")
env.Program("program.exe", Rscons.glob("src/**/*.{c,yargh}"))
build do
Rscons::Environment.new do |env|
env["CSUFFIX"] = %w[.yargh .c]
env["CFLAGS"] += %w[-x c]
env["CPPPATH"] += Rscons.glob("src/**")
env.Program("program.exe", Rscons.glob("src/**/*.{c,yargh}"))
end
end

View File

@ -1,5 +1,7 @@
Rscons::Environment.new do |env|
env.echo = :command
env.Install("inst.exe", "install.rb")
end
build do
Rscons::Environment.new do |env|
env.echo = :command
env.Install("inst.exe", "install.rb")
end
end

View File

@ -6,8 +6,10 @@ class MyBuilder < Rscons::Builder
end
end
Rscons::Environment.new do |env|
env.echo = :command
env.add_builder(MyBuilder.new)
env.MyBuilder("foo")
build do
Rscons::Environment.new do |env|
env.echo = :command
env.add_builder(MyBuilder.new)
env.MyBuilder("foo")
end
end

View File

@ -1,3 +1,5 @@
Rscons::Environment.new do |env|
env.Install("inst.exe", "install.rb")
build do
Rscons::Environment.new do |env|
env.Install("inst.exe", "install.rb")
end
end

View File

@ -1,9 +1,11 @@
Rscons::Environment.new do |env|
env.Directory("inst")
env.Install("inst", "install_directory.rb")
build do
Rscons::Environment.new do |env|
env.Directory("inst")
env.Install("inst", "install_directory.rb")
env.Install("noexist/src", "src")
env.Install("noexist/src", "src")
env.Directory("exist/src")
env.Install("exist/src", "src")
env.Directory("exist/src")
env.Install("exist/src", "src")
end
end

View File

@ -1,5 +1,7 @@
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/two"
env.Object("one.o", "src/one/one.c")
env.Object("one.o", "src/two/two.c")
build do
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/two"
env.Object("one.o", "src/one/one.c")
env.Object("one.o", "src/two/two.c")
end
end

View File

@ -1,10 +1,12 @@
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/two"
env.Object("one.o", "src/one/one.c")
env.add_post_build_hook do |build_op|
if build_op[:target] == "one.o"
env["MODULE"] = "two"
env.Object("${MODULE}.o", "src/${MODULE}/${MODULE}.c")
build do
Rscons::Environment.new do |env|
env["CPPPATH"] << "src/two"
env.Object("one.o", "src/one/one.c")
env.add_post_build_hook do |build_op|
if build_op[:target] == "one.o"
env["MODULE"] = "two"
env.Object("${MODULE}.o", "src/${MODULE}/${MODULE}.c")
end
end
end
end

View File

@ -68,6 +68,7 @@ module Rscons
# Exit code.
def build(options)
begin
@script.build
Environment.environments.each do |env|
env.process
end

View File

@ -15,6 +15,11 @@ module Rscons
# All Environments.
attr_reader :environments
# Initialize class instance variables.
def class_init
@environments = []
end
# Get an ID for a new Environment. This is a monotonically increasing
# integer.
#
@ -77,8 +82,7 @@ module Rscons
end
end
@echo = options[:echo] || :short
# TODO: remove the || "build" below when autoconf is turned on for build test specs
@build_root = "#{Cache.instance.configuration_data["build_dir"] || "build"}/e.#{@id}"
@build_root = "#{Cache.instance.configuration_data["build_dir"]}/e.#{@id}"
load_configuration_data!
if block_given?
@ -273,6 +277,9 @@ module Rscons
# @return [void]
def process
cache = Cache.instance
unless cache.configuration_data["configured"]
raise "Project must be configured before processing an Environment"
end
failure = nil
begin
while @job_set.size > 0 or @threaded_commands.size > 0
@ -1083,4 +1090,6 @@ module Rscons
end
end
Environment.class_init
end

View File

@ -19,6 +19,11 @@ module Rscons
@script.autoconf = autoconf
end
# Enter build block.
def build(&block)
@script.operations["build"] = block
end
# Enter configuration block.
def configure(&block)
@script.operations["configure"] = block
@ -81,6 +86,13 @@ module Rscons
Dsl.new(self).instance_eval(script_contents, path, 1)
end
# Perform build operation.
def build
if build_proc = @operations["build"]
build_proc.call
end
end
# Perform configure operation.
def configure(configure_op)
if operation_lambda = @operations["configure"]

View File

@ -1886,6 +1886,13 @@ EOF
expect(result.stdout).to match /Checking for C compiler\.\.\. not found/
expect(result.status).to_not eq 0
end
it "exits with an error if configuration has not been performed before attempting to process an environment" do
test_dir "configure"
result = run_rscons(rsconscript: "error_env_process_before_configure.rb")
expect(result.stderr).to match /Project must be configured before processing an Environment/
expect(result.status).to_not eq 0
end
end
end