Compare commits

...

12 Commits

16 changed files with 223 additions and 34 deletions

View File

@ -1,3 +1,18 @@
## 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 ## v3.0.0
- #136 - Move rsconscache into build directory - #136 - Move rsconscache into build directory

View File

@ -35,7 +35,7 @@ task :dspec, [:example_string] => :build_dist do |task, args|
FileUtils.mkdir_p("test") FileUtils.mkdir_p("test")
FileUtils.cp("dist/rscons", "test/rscons.rb") FileUtils.cp("dist/rscons", "test/rscons.rb")
ENV["dist_specs"] = "1" ENV["dist_specs"] = "1"
Rake::Task["spec"].execute(args.example_string) Rake::Task["spec"].execute(args)
ENV.delete("dist_specs") ENV.delete("dist_specs")
FileUtils.rm_f(Dir.glob(".rscons-*")) FileUtils.rm_f(Dir.glob(".rscons-*"))
end end

View File

@ -0,0 +1,12 @@
configure do
check_c_compiler "clang", use: "clang"
check_c_compiler
end
env "t1" do |env|
env.Program("test_gcc.exe", "simple.c")
end
env "t2", use: "clang" do |env|
env.Program("test_clang.exe", "simple.c")
end

View File

@ -0,0 +1,12 @@
configure do
check_cxx_compiler "clang++", use: "clang"
check_cxx_compiler
end
env "t1" do |env|
env.Program("test_gcc.exe", "simple.cc")
end
env "t2", use: "clang" do |env|
env.Program("test_clang.exe", "simple.cc")
end

View File

@ -0,0 +1,12 @@
configure do
check_d_compiler "ldc2", use: "ldc2"
check_d_compiler
end
env "t1" do |env|
env.Program("test_gcc.exe", "simple.d")
end
env "t2", use: "ldc2" do |env|
env.Program("test_ldc2.exe", "simple.d")
end

View File

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

View File

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

View File

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

View File

@ -0,0 +1,7 @@
env do |env|
env.Program('simple.exe', Dir['*.c'])
end
clean do
puts "custom clean action"
end

View File

@ -446,6 +446,9 @@ end
See ${#Configuring the Project} for more details on how to make use of the See ${#Configuring the Project} for more details on how to make use of the
configuration functionality that Rscons provides. configuration functionality that Rscons provides.
Configure blocks must be defined in the Rsconscript file before any
environments are created.
####> Default Task ####> Default Task
The `default` task is special in that Rscons will execute it if no other task The `default` task is special in that Rscons will execute it if no other task

View File

@ -73,6 +73,7 @@ module Rscons
# Process exit code (0 on success). # Process exit code (0 on success).
def run(rsconscript, tasks_and_params, show_tasks, all_tasks, enabled_variants) def run(rsconscript, tasks_and_params, show_tasks, all_tasks, enabled_variants)
Cache.instance["failed_commands"] = [] Cache.instance["failed_commands"] = []
@tasks_and_params = tasks_and_params
@enabled_variants = enabled_variants @enabled_variants = enabled_variants
if enabled_variants == "" && !tasks_and_params.include?("configure") if enabled_variants == "" && !tasks_and_params.include?("configure")
if cache_enabled_variants = Cache.instance["configuration_data"]["enabled_variants"] if cache_enabled_variants = Cache.instance["configuration_data"]["enabled_variants"]
@ -80,13 +81,15 @@ module Rscons
end end
end end
@script = Script.new @script = Script.new
if should_load_script
@script.load(rsconscript) @script.load(rsconscript)
enable_variants enable_variants
end
if show_tasks if show_tasks
show_script_tasks(all_tasks) show_script_tasks(all_tasks)
return 0 return 0
end end
apply_task_params(tasks_and_params) apply_task_params(false)
@task_execution_phase = true @task_execution_phase = true
if tasks_and_params.empty? if tasks_and_params.empty?
check_process_environments check_process_environments
@ -169,8 +172,8 @@ module Rscons
def distclean def distclean
cache = Cache.instance cache = Cache.instance
clean clean
FileUtils.rm_rf(@build_dir)
cache.clear cache.clear
FileUtils.rm_rf(@build_dir)
end end
# Check if the project needs to be configured. # Check if the project needs to be configured.
@ -179,6 +182,7 @@ module Rscons
# #
# @return [void] # @return [void]
def check_configure def check_configure
apply_task_params(true)
enable_variants enable_variants
unless Cache.instance["configuration_data"]["configured"] unless Cache.instance["configuration_data"]["configured"]
if @script.autoconf if @script.autoconf
@ -207,6 +211,8 @@ module Rscons
# #
# @return [void] # @return [void]
def configure def configure
unless @_configured
@_configured = true
co = ConfigureOp.new(@script) co = ConfigureOp.new(@script)
begin begin
@script.configure(co) @script.configure(co)
@ -217,6 +223,7 @@ module Rscons
Cache.instance["configuration_data"]["enabled_variants"] = @enabled_variants Cache.instance["configuration_data"]["enabled_variants"] = @enabled_variants
co.close(true) co.close(true)
end end
end
# Remove installed files. # Remove installed files.
# #
@ -375,8 +382,9 @@ module Rscons
end end
end end
def apply_task_params(tasks_and_params) def apply_task_params(only_configure)
tasks_and_params.each do |task_name, task_params| @tasks_and_params.each do |task_name, task_params|
unless only_configure && task_name != "configure"
task_params.each do |param_name, param_value| task_params.each do |param_name, param_value|
if param = Task[task_name].params[param_name] if param = Task[task_name].params[param_name]
Task[task_name].set_param_value(param_name, param_value) Task[task_name].set_param_value(param_name, param_value)
@ -386,6 +394,14 @@ module Rscons
end end
end end
end end
end
def should_load_script
return true if @tasks_and_params.empty?
return true if Cache.instance["configuration_data"]["configured"]
return false if (@tasks_and_params.keys - %w[distclean clean uninstall]).empty?
true
end
end end

View File

@ -101,6 +101,7 @@ module Rscons
# #
# @return [void] # @return [void]
def write def write
return unless Dir.exist?(File.dirname(cache_file))
@cache["version"] = VERSION @cache["version"] = VERSION
File.open(cache_file, "w") do |fh| File.open(cache_file, "w") do |fh|
fh.puts(JSON.dump(@cache)) fh.puts(JSON.dump(@cache))

View File

@ -23,14 +23,11 @@ module Rscons
$stdout.puts "Configuring project..." $stdout.puts "Configuring project..."
end end
end end
vars = {}
Task["configure"].params.each do |name, param| Task["configure"].params.each do |name, param|
unless Rscons.application.silent_configure unless Rscons.application.silent_configure
Ansi.write($stdout, "Setting #{name}... ", :green, param.value, :reset, "\n") Ansi.write($stdout, "Setting #{name}... ", :green, param.value, :reset, "\n")
end end
vars[name] = param.value
end end
store_merge(vars)
end end
# Close the log file handle. # Close the log file handle.
@ -65,7 +62,7 @@ module Rscons
ccc = %w[gcc clang] ccc = %w[gcc clang]
end end
cc = ccc.find do |cc| cc = ccc.find do |cc|
test_c_compiler(cc) test_c_compiler(cc, options)
end end
complete(cc ? 0 : 1, options.merge(success_message: cc)) complete(cc ? 0 : 1, options.merge(success_message: cc))
end end
@ -87,7 +84,7 @@ module Rscons
ccc = %w[g++ clang++] ccc = %w[g++ clang++]
end end
cc = ccc.find do |cc| cc = ccc.find do |cc|
test_cxx_compiler(cc) test_cxx_compiler(cc, options)
end end
complete(cc ? 0 : 1, options.merge(success_message: cc)) complete(cc ? 0 : 1, options.merge(success_message: cc))
end end
@ -109,7 +106,7 @@ module Rscons
cdc = %w[gdc ldc2] cdc = %w[gdc ldc2]
end end
dc = cdc.find do |dc| dc = cdc.find do |dc|
test_d_compiler(dc) test_d_compiler(dc, options)
end end
complete(dc ? 0 : 1, options.merge(success_message: dc)) complete(dc ? 0 : 1, options.merge(success_message: dc))
end end
@ -415,7 +412,7 @@ module Rscons
# #
# @return [Boolean] # @return [Boolean]
# Whether the C compiler tested successfully. # Whether the C compiler tested successfully.
def test_c_compiler(cc) def test_c_compiler(cc, options)
File.open("#{@work_dir}/cfgtest.c", "wb") do |fh| File.open("#{@work_dir}/cfgtest.c", "wb") do |fh|
fh.puts <<-EOF fh.puts <<-EOF
int fun(int val) { int fun(int val) {
@ -427,7 +424,7 @@ module Rscons
merge = {"CC" => cc} merge = {"CC" => cc}
_, _, status = log_and_test_command(command) _, _, status = log_and_test_command(command)
if status == 0 if status == 0
store_merge(merge) store_merge(merge, options)
true true
end end
end end
@ -439,7 +436,7 @@ module Rscons
# #
# @return [Boolean] # @return [Boolean]
# Whether the C++ compiler tested successfully. # Whether the C++ compiler tested successfully.
def test_cxx_compiler(cc) def test_cxx_compiler(cc, options)
File.open("#{@work_dir}/cfgtest.cxx", "wb") do |fh| File.open("#{@work_dir}/cfgtest.cxx", "wb") do |fh|
fh.puts <<-EOF fh.puts <<-EOF
template<typename T> template<typename T>
@ -452,7 +449,7 @@ module Rscons
merge = {"CXX" => cc} merge = {"CXX" => cc}
_, _, status = log_and_test_command(command) _, _, status = log_and_test_command(command)
if status == 0 if status == 0
store_merge(merge) store_merge(merge, options)
true true
end end
end end
@ -464,7 +461,7 @@ module Rscons
# #
# @return [Boolean] # @return [Boolean]
# Whether the D compiler tested successfully. # Whether the D compiler tested successfully.
def test_d_compiler(dc) def test_d_compiler(dc, options)
File.open("#{@work_dir}/cfgtest.d", "wb") do |fh| File.open("#{@work_dir}/cfgtest.d", "wb") do |fh|
fh.puts <<-EOF fh.puts <<-EOF
import core.math; import core.math;
@ -493,7 +490,7 @@ module Rscons
end end
_, _, status = log_and_test_command(command) _, _, status = log_and_test_command(command)
if status == 0 if status == 0
store_merge(merge) store_merge(merge, options)
true true
end end
end end

View File

@ -1,4 +1,4 @@
module Rscons module Rscons
# Project version. # Project version.
VERSION = "3.0.0" VERSION = "3.0.2"
end end

View File

@ -60,7 +60,13 @@ combined_file.each do |line|
end end
end end
license = File.read("LICENSE.txt").gsub(/^/, "# ") license = File.read("LICENSE.txt").gsub(/^(.*?)$/) do |line|
if line.size > 0
"# #{line}"
else
"#"
end
end
require "zlib" require "zlib"
require "base64" require "base64"

View File

@ -372,6 +372,17 @@ EOF
expect(File.exists?('simple.c')).to be_truthy expect(File.exists?('simple.c')).to be_truthy
end end
it "executes custom clean action blocks" do
test_dir("simple")
result = run_rscons(args: %w[-f clean.rb])
expect(result.stderr).to eq ""
expect(File.exists?("build/e.1/simple.c.o")).to be_truthy
result = run_rscons(args: %w[-f clean.rb clean])
expect(result.stderr).to eq ""
expect(result.stdout).to match %r{custom clean action}
expect(File.exists?("build/e.1/simple.c.o")).to be_falsey
end
it "does not process environments" do it "does not process environments" do
test_dir("simple") test_dir("simple")
result = run_rscons(args: %w[clean]) result = run_rscons(args: %w[clean])
@ -1825,6 +1836,51 @@ EOF
expect(result.status).to_not eq 0 expect(result.status).to_not eq 0
end end
it "only runs the configure operation once" do
test_dir "configure"
result = run_rscons(args: %w[-f configure_with_top_level_env.rb configure])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to_not match %r{Configuring project.*Configuring project}m
end
it "loads configure parameters before invoking configure" do
test_dir "configure"
result = run_rscons(args: %w[-f configure_with_top_level_env.rb configure --prefix=/yodabob])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to match "Prefix is /yodabob"
end
it "does not configure for distclean operation" do
test_dir "configure"
result = run_rscons(args: %w[-f configure_with_top_level_env.rb distclean])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to_not match %r{Configuring project}
end
it "does not configure for clean operation" do
test_dir "configure"
result = run_rscons(args: %w[-f configure_with_top_level_env.rb clean])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to_not match %r{Configuring project}
end
it "does not configure for uninstall operation" do
test_dir "configure"
result = run_rscons(args: %w[-f configure_with_top_level_env.rb uninstall])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to_not match %r{Configuring project}
end
it "automatically runs the configure task if the project is not yet configured in the given build directory" do it "automatically runs the configure task if the project is not yet configured in the given build directory" do
test_dir "configure" test_dir "configure"
@ -1884,6 +1940,17 @@ EOF
end end
end end
it "respects use flag" do
test_dir "configure"
result = run_rscons(args: %w[-f check_c_compiler_use.rb -v])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to match %r{\bgcc .*/t1/}
expect(result.stdout).to_not match %r{\bclang .*/t1/}
expect(result.stdout).to match %r{\bclang .*/t2/}
expect(result.stdout).to_not match %r{\bgcc .*/t2/}
end
it "successfully tests a compiler with an unknown name" do it "successfully tests a compiler with an unknown name" do
test_dir "configure" test_dir "configure"
create_exe "mycompiler", %[exec gcc "$@"] create_exe "mycompiler", %[exec gcc "$@"]
@ -1927,6 +1994,17 @@ EOF
end end
end end
it "respects use flag" do
test_dir "configure"
result = run_rscons(args: %w[-f check_cxx_compiler_use.rb -v])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to match %r{\bg\+\+ .*/t1/}
expect(result.stdout).to_not match %r{\bclang\+\+ .*/t1/}
expect(result.stdout).to match %r{\bclang\+\+ .*/t2/}
expect(result.stdout).to_not match %r{\bg\+\+ .*/t2/}
end
it "successfully tests a compiler with an unknown name" do it "successfully tests a compiler with an unknown name" do
test_dir "configure" test_dir "configure"
create_exe "mycompiler", %[exec clang++ "$@"] create_exe "mycompiler", %[exec clang++ "$@"]
@ -1972,6 +2050,17 @@ EOF
end end
end end
it "respects use flag" do
test_dir "configure"
result = run_rscons(args: %w[-f check_d_compiler_use.rb -v])
expect(result.stderr).to eq ""
expect(result.status).to eq 0
expect(result.stdout).to match %r{\bgdc .*/t1/}
expect(result.stdout).to_not match %r{\bldc2 .*/t1/}
expect(result.stdout).to match %r{\bldc2 .*/t2/}
expect(result.stdout).to_not match %r{\bgdc .*/t2/}
end
unless RUBY_PLATFORM =~ /mingw|msys/ unless RUBY_PLATFORM =~ /mingw|msys/
it "successfully tests a compiler with an unknown name that uses gdc-compatible options" do it "successfully tests a compiler with an unknown name that uses gdc-compatible options" do
test_dir "configure" test_dir "configure"