remove build_dir functionality - close #65

This commit is contained in:
Josh Holtrop 2018-12-11 22:06:20 -05:00
parent a1efb1c1b3
commit 432d221be2
22 changed files with 46 additions and 157 deletions

View File

@ -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

View File

@ -1,5 +0,0 @@
env = Rscons::Environment.new do |env|
env.append('CPPPATH' => Rscons.glob('src/**/*/'))
env.build_dir("src", "build")
env.Program('build_dir.exe', Rscons.glob('src/**/*.c'))
end

View File

@ -1,5 +0,0 @@
Rscons::Environment.new do |env|
env.append('CPPPATH' => Rscons.glob('src/**'))
env.build_dir("src2", "build")
env.Program('build_dir.exe', Rscons.glob('src/**/*.c'))
end

View File

@ -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

View File

@ -1,5 +1,4 @@
debug = Rscons::Environment.new(echo: :command) do |env| debug = Rscons::Environment.new(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

View File

@ -1,5 +1,4 @@
env1 = Rscons::Environment.new(echo: :command) do |env| env1 = Rscons::Environment.new(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 |build_op|
build_op[:vars]['CPPFLAGS'] = '-DSTRING="Hello"' build_op[:vars]['CPPFLAGS'] = '-DSTRING="Hello"'

View File

@ -1,10 +1,9 @@
Rscons::Environment.new(echo: :command) do |env| Rscons::Environment.new(echo: :command) do |env|
env.append('CPPPATH' => Rscons.glob('src/**/*/')) env.append('CPPPATH' => Rscons.glob('src/**/*/'))
env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/')
env.add_build_hook do |build_op| env.add_build_hook do |build_op|
if build_op[:target] =~ %r{build_one/.*\.o} if File.basename(build_op[:target]) == "one.o"
build_op[:vars]["CFLAGS"] << "-O1" build_op[:vars]["CFLAGS"] << "-O1"
elsif build_op[:target] =~ %r{build_two/.*\.o} elsif File.basename(build_op[:target]) == "two.o"
build_op[:vars]["CFLAGS"] << "-O2" build_op[:vars]["CFLAGS"] << "-O2"
end end
end end

View File

@ -3,5 +3,5 @@ Rscons::Environment.new(echo: :command) do |env|
FileUtils.mkdir_p(env.build_root) FileUtils.mkdir_p(env.build_root)
FileUtils.mv("src/one/one.c", env.build_root) FileUtils.mv("src/one/one.c", env.build_root)
env.Object("^/one.o", "^/one.c") env.Object("^/one.o", "^/one.c")
env.Program("build_dir.exe", Rscons.glob('src/**/*.c') + ["^/one.o"]) env.Program("program.exe", Rscons.glob('src/**/*.c') + ["^/one.o"])
end end

View File

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

View File

@ -68,7 +68,6 @@ module Rscons
@job_set = JobSet.new(@registered_build_dependencies, @side_effects) @job_set = JobSet.new(@registered_build_dependencies, @side_effects)
@user_deps = {} @user_deps = {}
@builders = {} @builders = {}
@build_dirs = []
@build_hooks = {pre: [], post: []} @build_hooks = {pre: [], post: []}
unless options[:exclude_builders] unless options[:exclude_builders]
DEFAULT_BUILDERS.each do |builder_class_name| DEFAULT_BUILDERS.each do |builder_class_name|
@ -98,7 +97,6 @@ module Rscons
# following: # following:
# - :variables to clone construction variables (on by default) # - :variables to clone construction variables (on by default)
# - :builders to clone the builders (on by default) # - :builders to clone the builders (on by default)
# - :build_dirs to clone the build directories (on by default)
# - :build_hooks to clone the build hooks (on by default) # - :build_hooks to clone the build hooks (on by default)
# #
# If a block is given, the Environment object is yielded to the block and # If a block is given, the Environment object is yielded to the block and
@ -109,7 +107,7 @@ module Rscons
# @return [Environment] The newly created {Environment} object. # @return [Environment] The newly created {Environment} object.
def clone(options = {}) def clone(options = {})
clone = options[:clone] || :all clone = options[:clone] || :all
clone = Set[:variables, :builders, :build_dirs, :build_hooks] if clone == :all clone = Set[:variables, :builders, :build_hooks] if clone == :all
clone = Set[] if clone == :none clone = Set[] if clone == :none
clone = Set.new(clone) if clone.is_a?(Array) clone = Set.new(clone) if clone.is_a?(Array)
clone.delete(:builders) if options[:exclude_builders] clone.delete(:builders) if options[:exclude_builders]
@ -122,11 +120,6 @@ module Rscons
end end
end end
env.append(@varset) if clone.include?(:variables) env.append(@varset) if clone.include?(:variables)
if clone.include?(:build_dirs)
@build_dirs.reverse.each do |src_dir, obj_dir|
env.build_dir(src_dir, obj_dir)
end
end
if clone.include?(:build_hooks) if clone.include?(:build_hooks)
@build_hooks[:pre].each do |build_hook_block| @build_hooks[:pre].each do |build_hook_block|
env.add_build_hook(&build_hook_block) env.add_build_hook(&build_hook_block)
@ -227,26 +220,6 @@ module Rscons
@build_hooks[:post] << block @build_hooks[:post] << block
end end
# Specify a build directory for this Environment.
#
# Source files from src_dir will produce object files under obj_dir.
#
# @param src_dir [String, Regexp]
# Path to the source directory. If a Regexp is given, it will be matched
# to source file names.
# @param obj_dir [String]
# Path to the object directory. If a Regexp is given as src_dir, then
# obj_dir can contain backreferences to groups matched from the source
# file name.
#
# @return [void]
def build_dir(src_dir, obj_dir)
if src_dir.is_a?(String)
src_dir = src_dir.gsub("\\", "/").sub(%r{/*$}, "")
end
@build_dirs.unshift([src_dir, obj_dir])
end
# Return the file name to be built from +source_fname+ with suffix # Return the file name to be built from +source_fname+ with suffix
# +suffix+. # +suffix+.
# #
@ -264,20 +237,9 @@ module Rscons
# @return [String] # @return [String]
# The file name to be built from +source_fname+ with suffix +suffix+. # The file name to be built from +source_fname+ with suffix +suffix+.
def get_build_fname(source_fname, suffix, options = {}) def get_build_fname(source_fname, suffix, options = {})
build_fname = Rscons.set_suffix(source_fname, suffix).gsub('\\', '/')
options[:features] ||= [] options[:features] ||= []
extra_path = options[:features].include?("shared") ? "/_shared" : "" extra_path = options[:features].include?("shared") ? "/_shared" : ""
found_match = @build_dirs.find do |src_dir, obj_dir| "#{@build_root}#{extra_path}/#{Util.make_relative_path(Rscons.set_suffix(source_fname, suffix))}".gsub("\\", "/")
if src_dir.is_a?(Regexp)
build_fname.sub!(src_dir, "#{obj_dir}#{extra_path}")
else
build_fname.sub!(%r{^#{src_dir}/}, "#{obj_dir}#{extra_path}/")
end
end
unless found_match
build_fname = "#{@build_root}#{extra_path}/#{Util.make_relative_path(build_fname)}"
end
build_fname.gsub('\\', '/')
end end
# Get a construction variable's value. # Get a construction variable's value.

View File

@ -257,54 +257,14 @@ EOF
] ]
end end
it 'builds object files in a different build directory' do
test_dir('build_dir')
result = run_rscons
expect(result.stderr).to eq ""
expect(`./build_dir.exe`).to eq "Hello from two()\n"
expect(File.exists?('build_one/one.o')).to be_truthy
expect(File.exists?('build_two/two.o')).to be_truthy
end
it "supports trailing slashes at the end of build_dir sources and destinations" do
test_dir("build_dir")
result = run_rscons(rsconscript: "slashes.rb")
expect(result.stderr).to eq ""
expect(`./build_dir.exe`).to eq "Hello from two()\n"
expect(File.exists?("build_one/one.o")).to be_truthy
expect(File.exists?("build_two/two.o")).to be_truthy
end
it 'uses build directories before build root' do
test_dir('build_dir')
result = run_rscons(rsconscript: "build_dirs_and_root.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[
"CC build/one/one.o",
"CC build/two/two.o",
"LD build_dir.exe",
]
end
it 'uses build_root if no build directories match' do
test_dir('build_dir')
result = run_rscons(rsconscript: "no_match_build_dir.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[
"CC build/e.1/src/one/one.o",
"CC build/e.1/src/two/two.o",
"LD build_dir.exe",
]
end
it "expands target and source paths starting with ^/ to be relative to the build root" do it "expands target and source paths starting with ^/ to be relative to the build root" do
test_dir('build_dir') test_dir("typical")
result = run_rscons(rsconscript: "carat.rb") result = run_rscons(rsconscript: "carat.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[ expect(lines(result.stdout)).to include *[
%q{gcc -c -o build/e.1/one.o -MMD -MF build/e.1/one.mf -Isrc -Isrc/one -Isrc/two build/e.1/one.c}, %q{gcc -c -o build/e.1/one.o -MMD -MF build/e.1/one.mf -Isrc -Isrc/one -Isrc/two build/e.1/one.c},
%q{gcc -c -o build/e.1/src/two/two.o -MMD -MF build/e.1/src/two/two.mf -Isrc -Isrc/one -Isrc/two src/two/two.c}, %q{gcc -c -o build/e.1/src/two/two.o -MMD -MF build/e.1/src/two/two.mf -Isrc -Isrc/one -Isrc/two src/two/two.c},
%Q{gcc -o build_dir.exe build/e.1/src/two/two.o build/e.1/one.o}, %Q{gcc -o program.exe build/e.1/src/two/two.o build/e.1/one.o},
] ]
end end
@ -317,36 +277,28 @@ EOF
end end
it 'cleans built files' do it 'cleans built files' do
test_dir('build_dir') test_dir("simple")
result = run_rscons result = run_rscons
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(`./simple.exe`).to match /This is a simple C program/
expect(File.exists?('build_one/one.o')).to be_truthy expect(File.exists?('build/e.1/simple.o')).to be_truthy
expect(File.exists?('build_two/two.o')).to be_truthy
result = run_rscons(op: %w[clean]) result = run_rscons(op: %w[clean])
expect(File.exists?('build_one/one.o')).to be_falsey expect(File.exists?('build/e.1/simple.o')).to be_falsey
expect(File.exists?('build_two/two.o')).to be_falsey expect(File.exists?('build/e.1')).to be_falsey
expect(File.exists?('build_one')).to be_falsey expect(File.exists?('simple.exe')).to be_falsey
expect(File.exists?('build_two')).to be_falsey expect(File.exists?('simple.c')).to be_truthy
expect(File.exists?('build_dir.exe')).to be_falsey
expect(File.exists?('src/one/one.c')).to be_truthy
end end
it 'does not clean created directories if other non-rscons-generated files reside there' do it 'does not clean created directories if other non-rscons-generated files reside there' do
test_dir('build_dir') test_dir("simple")
result = run_rscons result = run_rscons
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(`./simple.exe`).to match /This is a simple C program/
expect(File.exists?('build_one/one.o')).to be_truthy expect(File.exists?('build/e.1/simple.o')).to be_truthy
expect(File.exists?('build_two/two.o')).to be_truthy File.open('build/e.1/dum', 'w') { |fh| fh.puts "dum" }
File.open('build_two/tmp', 'w') { |fh| fh.puts "dum" }
result = run_rscons(op: %w[clean]) result = run_rscons(op: %w[clean])
expect(File.exists?('build_one/one.o')).to be_falsey expect(File.exists?('build/e.1')).to be_truthy
expect(File.exists?('build_two/two.o')).to be_falsey expect(File.exists?('build/e.1/dum')).to be_truthy
expect(File.exists?('build_one')).to be_falsey
expect(File.exists?('build_two')).to be_truthy
expect(File.exists?('build_dir.exe')).to be_falsey
expect(File.exists?('src/one/one.c')).to be_truthy
end end
it 'allows Ruby classes as custom builders to be used to construct files' do it 'allows Ruby classes as custom builders to be used to construct files' do
@ -380,10 +332,10 @@ EOF
result = run_rscons result = run_rscons
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[ expect(lines(result.stdout)).to include *[
%q{gcc -c -o debug/program.o -MMD -MF debug/program.mf '-DSTRING="Debug Version"' -O2 src/program.c}, %q{gcc -c -o build/e.1/src/program.o -MMD -MF build/e.1/src/program.mf '-DSTRING="Debug Version"' -O2 src/program.c},
%Q{gcc -o program-debug.exe debug/program.o}, %Q{gcc -o program-debug.exe build/e.1/src/program.o},
%q{gcc -c -o release/program.o -MMD -MF release/program.mf '-DSTRING="Release Version"' -O2 src/program.c}, %q{gcc -c -o build/e.2/src/program.o -MMD -MF build/e.2/src/program.mf '-DSTRING="Release Version"' -O2 src/program.c},
%Q{gcc -o program-release.exe release/program.o}, %Q{gcc -o program-release.exe build/e.2/src/program.o},
] ]
end end
@ -392,12 +344,12 @@ EOF
result = run_rscons(rsconscript: "clone_all.rb") result = run_rscons(rsconscript: "clone_all.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[ expect(lines(result.stdout)).to include *[
%q{gcc -c -o build/program.o -MMD -MF build/program.mf -DSTRING="Hello" -O2 src/program.c}, %q{gcc -c -o build/e.1/src/program.o -MMD -MF build/e.1/src/program.mf -DSTRING="Hello" -O2 src/program.c},
%q{post build/program.o}, %q{post build/e.1/src/program.o},
%Q{gcc -o program.exe build/program.o}, %Q{gcc -o program.exe build/e.1/src/program.o},
%q{post program.exe}, %q{post program.exe},
%q{post build/program.o}, %q{post build/e.2/src/program.o},
%Q{gcc -o program2.exe build/program.o}, %Q{gcc -o program2.exe build/e.2/src/program.o},
%q{post program2.exe}, %q{post program2.exe},
] ]
end end
@ -439,13 +391,13 @@ EOF
end end
it 'supports build hooks to override construction variables' do it 'supports build hooks to override construction variables' do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "build_hooks.rb") result = run_rscons(rsconscript: "build_hooks.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[ expect(lines(result.stdout)).to include *[
'gcc -c -o build_one/one.o -MMD -MF build_one/one.mf -Isrc/one -Isrc/two -O1 src/one/one.c', 'gcc -c -o build/e.1/src/one/one.o -MMD -MF build/e.1/src/one/one.mf -Isrc/one -Isrc/two -O1 src/one/one.c',
'gcc -c -o build_two/two.o -MMD -MF build_two/two.mf -Isrc/one -Isrc/two -O2 src/two/two.c', 'gcc -c -o build/e.1/src/two/two.o -MMD -MF build/e.1/src/two/two.mf -Isrc/one -Isrc/two -O2 src/two/two.c',
'gcc -o build_hook.exe build_one/one.o build_two/two.o', 'gcc -o build_hook.exe build/e.1/src/one/one.o build/e.1/src/two/two.o',
] ]
expect(`./build_hook.exe`).to eq "Hello from two()\n" expect(`./build_hook.exe`).to eq "Hello from two()\n"
end end
@ -596,13 +548,13 @@ EOF
end end
it "supports multiple values for CSUFFIX" do it "supports multiple values for CSUFFIX" do
test_dir("build_dir") test_dir("typical")
FileUtils.mv("src/one/one.c", "src/one/one.yargh") FileUtils.mv("src/one/one.c", "src/one/one.yargh")
result = run_rscons(rsconscript: "csuffix.rb") result = run_rscons(rsconscript: "csuffix.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(File.exists?("build/e.1/src/one/one.o")).to be_truthy expect(File.exists?("build/e.1/src/one/one.o")).to be_truthy
expect(File.exists?("build/e.1/src/two/two.o")).to be_truthy expect(File.exists?("build/e.1/src/two/two.o")).to be_truthy
expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(`./program.exe`).to eq "Hello from two()\n"
end end
it "supports multiple values for OBJSUFFIX" do it "supports multiple values for OBJSUFFIX" do
@ -678,7 +630,7 @@ EOF
end end
it "supports registering multiple build targets with the same target path" do it "supports registering multiple build targets with the same target path" do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "multiple_targets_same_name.rb") result = run_rscons(rsconscript: "multiple_targets_same_name.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(File.exists?("one.o")).to be_truthy expect(File.exists?("one.o")).to be_truthy
@ -689,7 +641,7 @@ EOF
end end
it "expands target and source paths when builders are registered in build hooks" do it "expands target and source paths when builders are registered in build hooks" do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "post_build_hook_expansion.rb") result = run_rscons(rsconscript: "post_build_hook_expansion.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(File.exists?("one.o")).to be_truthy expect(File.exists?("one.o")).to be_truthy
@ -841,7 +793,7 @@ EOF
end end
it "prints a builder's short description with 'command' echo mode if there is no command" do it "prints a builder's short description with 'command' echo mode if there is no command" do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "echo_command_ruby_builder.rb") result = run_rscons(rsconscript: "echo_command_ruby_builder.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
@ -849,7 +801,7 @@ EOF
end end
it "supports a string for a builder's echoed 'command' with Environment#print_builder_run_message" do it "supports a string for a builder's echoed 'command' with Environment#print_builder_run_message" do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "echo_command_string.rb") result = run_rscons(rsconscript: "echo_command_string.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
@ -940,7 +892,7 @@ EOF
end end
it 'supports build hooks to override construction variables' do it 'supports build hooks to override construction variables' do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "backward_compatible_build_hooks.rb") result = run_rscons(rsconscript: "backward_compatible_build_hooks.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include *[ expect(lines(result.stdout)).to include *[
@ -1031,7 +983,7 @@ EOF
context "Install buildler" do context "Install buildler" do
it "copies a file to the target file name" do it "copies a file to the target file name" do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "install.rb") result = run_rscons(rsconscript: "install.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
@ -1051,7 +1003,7 @@ EOF
end end
it "operates the same as a Copy builder" do it "operates the same as a Copy builder" do
test_dir("build_dir") test_dir("typical")
result = run_rscons(rsconscript: "copy.rb") result = run_rscons(rsconscript: "copy.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
@ -1071,7 +1023,7 @@ EOF
end end
it "copies a file to the target directory name" do it "copies a file to the target directory name" do
test_dir "build_dir" test_dir("typical")
result = run_rscons(rsconscript: "install_directory.rb") result = run_rscons(rsconscript: "install_directory.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
@ -1085,7 +1037,7 @@ EOF
end end
it "copies a directory to the non-existent target directory name" do it "copies a directory to the non-existent target directory name" do
test_dir "build_dir" test_dir("typical")
result = run_rscons(rsconscript: "install_directory.rb") result = run_rscons(rsconscript: "install_directory.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include("Install noexist/src") expect(lines(result.stdout)).to include("Install noexist/src")
@ -1096,7 +1048,7 @@ EOF
end end
it "copies a directory to the existent target directory name" do it "copies a directory to the existent target directory name" do
test_dir "build_dir" test_dir("typical")
result = run_rscons(rsconscript: "install_directory.rb") result = run_rscons(rsconscript: "install_directory.rb")
expect(result.stderr).to eq "" expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include("Install exist/src") expect(lines(result.stdout)).to include("Install exist/src")