From db2ec82a259a63aa0cc05f4212eb303e231fb75d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 7 Jun 2017 13:02:51 -0400 Subject: [PATCH] Add more integration tests for SharedLibrary and backwards compatibility --- .../shared_library/error_unknown_suffix.rb | 6 +++ .../shared_library/shared_library_cxx.rb | 11 +++++ .../shared_library/shared_library_set_shld.rb | 12 ++++++ build_tests/shared_library/src/lib/one.cc | 6 +++ build_tests/shared_library/src/lib/two.cc | 6 +++ build_tests/shared_library/src/main.cc | 8 ++++ build_tests/simple/bc_produces.rb | 28 +++++++++++++ spec/build_tests_spec.rb | 41 +++++++++++++++++++ 8 files changed, 118 insertions(+) create mode 100644 build_tests/shared_library/error_unknown_suffix.rb create mode 100644 build_tests/shared_library/shared_library_cxx.rb create mode 100644 build_tests/shared_library/shared_library_set_shld.rb create mode 100644 build_tests/shared_library/src/lib/one.cc create mode 100644 build_tests/shared_library/src/lib/two.cc create mode 100644 build_tests/shared_library/src/main.cc create mode 100644 build_tests/simple/bc_produces.rb diff --git a/build_tests/shared_library/error_unknown_suffix.rb b/build_tests/shared_library/error_unknown_suffix.rb new file mode 100644 index 0000000..e3e60bb --- /dev/null +++ b/build_tests/shared_library/error_unknown_suffix.rb @@ -0,0 +1,6 @@ +Rscons::Environment.new do |env| + File.open("foo.xyz", "wb") do |fh| + fh.puts("hi") + end + env.SharedObject("foo.o", "foo.xyz") +end diff --git a/build_tests/shared_library/shared_library_cxx.rb b/build_tests/shared_library/shared_library_cxx.rb new file mode 100644 index 0000000..3cd8746 --- /dev/null +++ b/build_tests/shared_library/shared_library_cxx.rb @@ -0,0 +1,11 @@ +Rscons::Environment.new do |env| + env["CPPPATH"] << "src/lib" + libmine = env.SharedLibrary("libmine", Dir["src/lib/*.cc"]) + env.Program("test-shared.exe", + Dir["src/*.cc"], + "LIBPATH" => %w[.], + "LIBS" => %w[mine]) + env.build_after("test-shared.exe", libmine.to_s) + env.Program("test-static.exe", + Dir["src/**/*.cc"]) +end diff --git a/build_tests/shared_library/shared_library_set_shld.rb b/build_tests/shared_library/shared_library_set_shld.rb new file mode 100644 index 0000000..9be6cee --- /dev/null +++ b/build_tests/shared_library/shared_library_set_shld.rb @@ -0,0 +1,12 @@ +Rscons::Environment.new do |env| + env["CPPPATH"] << "src/lib" + env["SHLD"] = "gcc" + libmine = env.SharedLibrary("libmine", Dir["src/lib/*.c"]) + env.Program("test-shared.exe", + Dir["src/*.c"], + "LIBPATH" => %w[.], + "LIBS" => %w[mine]) + env.build_after("test-shared.exe", libmine.to_s) + env.Program("test-static.exe", + Dir["src/**/*.c"]) +end diff --git a/build_tests/shared_library/src/lib/one.cc b/build_tests/shared_library/src/lib/one.cc new file mode 100644 index 0000000..2e57a33 --- /dev/null +++ b/build_tests/shared_library/src/lib/one.cc @@ -0,0 +1,6 @@ +#include + +void one(void) +{ + printf("Hi from one()\n"); +} diff --git a/build_tests/shared_library/src/lib/two.cc b/build_tests/shared_library/src/lib/two.cc new file mode 100644 index 0000000..17873f8 --- /dev/null +++ b/build_tests/shared_library/src/lib/two.cc @@ -0,0 +1,6 @@ +#include + +void two(void) +{ + printf("Hi from two()\n"); +} diff --git a/build_tests/shared_library/src/main.cc b/build_tests/shared_library/src/main.cc new file mode 100644 index 0000000..600363c --- /dev/null +++ b/build_tests/shared_library/src/main.cc @@ -0,0 +1,8 @@ +#include "one.h" +#include "two.h" + +int main(int argc, char * argv[]) +{ + one(); + two(); +} diff --git a/build_tests/simple/bc_produces.rb b/build_tests/simple/bc_produces.rb new file mode 100644 index 0000000..cd40d14 --- /dev/null +++ b/build_tests/simple/bc_produces.rb @@ -0,0 +1,28 @@ +class MyObject < Rscons::Builder + def produces?(target, source, env) + target.end_with?(".o") and source.end_with?(".xyz") + end + + def run(target, sources, cache, env, vars) + cflags = env.expand_varref("${CFLAGS}", vars) + vars = vars.merge( + "CFLAGS" => cflags + %w[-x c], + "CSUFFIX" => ".xyz") + env.run_builder(env.builders["Object"], target, sources, cache, vars) + end +end + +Rscons::Environment.new do |env| + env.add_builder(MyObject.new) + File.open("test.xyz", "w") do |fh| + fh.puts < +int main(int argc, char * argv[]) +{ + printf("XYZ!\\n"); + return 0; +} +EOF + env.Program("test", "test.xyz") + end +end diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 5cd28b3..b0f9f73 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -687,6 +687,22 @@ EOF expect(`./test-static.exe`).to match /Hi from one/ end + it "creates shared libraries using C++" do + test_dir("shared_library") + + result = run_test(rsconsfile: "shared_library_cxx.rb") + expect(result.stderr).to eq "" + slines = lines(result.stdout) + expect(slines).to include("SHLD libmine.so") + + result = run_test(rsconsfile: "shared_library_cxx.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" + + expect(`LD_LIBRARY_PATH=. ./test-shared.exe`).to match /Hi from one/ + expect(`./test-static.exe`).to match /Hi from one/ + end + context "backward compatibility" do it "allows a builder to call Environment#run_builder in a non-threaded manner" do test_dir("simple") @@ -725,6 +741,12 @@ EOF expect(result.stderr).to eq "" expect(lines(result.stdout)).to eq ["MyCommand simple.o"] end + + it "supports the old 3-parameter signature to Builder#produces?" do + test_dir("simple") + result = run_test(rsconsfile: "bc_produces.rb") + expect(result.stderr).to eq "" + end end context "CFile builder" do @@ -1115,6 +1137,14 @@ EOF end end + context "SharedObject builder" do + it "raises an error when given a source file with an unknown suffix" do + test_dir("shared_library") + result = run_test(rsconsfile: "error_unknown_suffix.rb") + expect(result.stderr).to match /unknown input file type: "foo.xyz"/ + end + end + context "Library builder" do it "allows overriding ARCMD construction variable" do test_dir("library") @@ -1124,6 +1154,17 @@ EOF end end + context "SharedLibrary builder" do + it "allows explicitly specifying SHLD construction variable value" do + test_dir("shared_library") + + result = run_test(rsconsfile: "shared_library_set_shld.rb") + expect(result.stderr).to eq "" + slines = lines(result.stdout) + expect(slines).to include("SHLD libmine.so") + end + end + context "multi-threading" do it "waits for subcommands in threads for builders that support threaded commands" do test_dir("simple")