implement ConfigureOp#check_cxx_compiler
This commit is contained in:
parent
697db2a987
commit
d54d363a25
3
build_tests/configure/check_cxx_compiler.rb
Normal file
3
build_tests/configure/check_cxx_compiler.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_compiler
|
||||||
|
end
|
3
build_tests/configure/check_cxx_compiler_find_first.rb
Normal file
3
build_tests/configure/check_cxx_compiler_find_first.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
configure do
|
||||||
|
check_cxx_compiler "g++", "clang++"
|
||||||
|
end
|
@ -88,6 +88,9 @@ module Rscons
|
|||||||
if ccc = @script.check_c_compiler
|
if ccc = @script.check_c_compiler
|
||||||
co.check_c_compiler(ccc)
|
co.check_c_compiler(ccc)
|
||||||
end
|
end
|
||||||
|
if ccc = @script.check_cxx_compiler
|
||||||
|
co.check_cxx_compiler(ccc)
|
||||||
|
end
|
||||||
rescue ConfigureOp::ConfigureFailure
|
rescue ConfigureOp::ConfigureFailure
|
||||||
rv = 1
|
rv = 1
|
||||||
end
|
end
|
||||||
|
@ -49,6 +49,29 @@ module Rscons
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check for a working C++ compiler.
|
||||||
|
#
|
||||||
|
# @param ccc [Array<String>]
|
||||||
|
# C++ compiler(s) to check for.
|
||||||
|
#
|
||||||
|
# @return [void]
|
||||||
|
def check_cxx_compiler(ccc)
|
||||||
|
$stdout.write("Checking for C++ compiler... ")
|
||||||
|
if ccc.empty?
|
||||||
|
# Default C++ compiler search array.
|
||||||
|
ccc = %w[g++ clang++]
|
||||||
|
end
|
||||||
|
cc = ccc.find do |cc|
|
||||||
|
test_cxx_compiler(cc)
|
||||||
|
end
|
||||||
|
if cc
|
||||||
|
Ansi.write($stdout, :green, cc, "\n")
|
||||||
|
else
|
||||||
|
Ansi.write($stdout, :red, "not found\n")
|
||||||
|
raise ConfigureFailure.new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Test a C compiler.
|
# Test a C compiler.
|
||||||
@ -81,6 +104,37 @@ module Rscons
|
|||||||
status == 0
|
status == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Test a C++ compiler.
|
||||||
|
#
|
||||||
|
# @param cc [String]
|
||||||
|
# C++ compiler to test.
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
# Whether the C++ compiler tested successfully.
|
||||||
|
def test_cxx_compiler(cc)
|
||||||
|
File.open("#{@work_dir}/cfgtest.cxx", "wb") do |fh|
|
||||||
|
fh.puts <<-EOF
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
cout << "Hello." << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
case cc
|
||||||
|
when "g++"
|
||||||
|
command = %W[g++ -o #{@work_dir}/cfgtest.exe #{@work_dir}/cfgtest.cxx]
|
||||||
|
when "clang++"
|
||||||
|
command = %W[clang++ -o #{@work_dir}/cfgtest.exe #{@work_dir}/cfgtest.cxx]
|
||||||
|
else
|
||||||
|
$stderr.puts "Unknown C++ compiler (#{cc})"
|
||||||
|
raise ConfigureFailure.new
|
||||||
|
end
|
||||||
|
_, _, status = log_and_test_command(command)
|
||||||
|
status == 0
|
||||||
|
end
|
||||||
|
|
||||||
# Execute a test command and log the result.
|
# Execute a test command and log the result.
|
||||||
def log_and_test_command(command)
|
def log_and_test_command(command)
|
||||||
begin
|
begin
|
||||||
|
@ -1534,6 +1534,40 @@ EOF
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "check_cxx_compiler" do
|
||||||
|
{"check_cxx_compiler.rb" => "when no arguments are given",
|
||||||
|
"check_cxx_compiler_find_first.rb" => "when arguments are given"}.each_pair do |rsconsfile, desc|
|
||||||
|
context desc do
|
||||||
|
it "finds the first listed C++ compiler" do
|
||||||
|
test_dir "configure"
|
||||||
|
result = run_rscons(rsconsfile: rsconsfile, op: "configure")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
expect(result.status).to eq 0
|
||||||
|
expect(result.stdout).to match /Checking for C\+\+ compiler\.\.\. g\+\+/
|
||||||
|
end
|
||||||
|
|
||||||
|
it "finds the second listed C++ compiler" do
|
||||||
|
test_dir "configure"
|
||||||
|
create_exe "g++", "exit 1"
|
||||||
|
result = run_rscons(rsconsfile: rsconsfile, op: "configure")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
expect(result.status).to eq 0
|
||||||
|
expect(result.stdout).to match /Checking for C\+\+ compiler\.\.\. clang\+\+/
|
||||||
|
end
|
||||||
|
|
||||||
|
it "fails to configure when it cannot find a C++ compiler" do
|
||||||
|
test_dir "configure"
|
||||||
|
create_exe "g++", "exit 1"
|
||||||
|
create_exe "clang++", "exit 1"
|
||||||
|
result = run_rscons(rsconsfile: rsconsfile, op: "configure")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
expect(result.status).to_not eq 0
|
||||||
|
expect(result.stdout).to match /Checking for C\+\+ compiler\.\.\. not found/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user