diff --git a/build_tests/build_dir/Rsconsfile b/build_tests/build_dir/Rsconsfile index 03459b3..6fcc487 100644 --- a/build_tests/build_dir/Rsconsfile +++ b/build_tests/build_dir/Rsconsfile @@ -1,5 +1,5 @@ Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.append('CPPPATH' => Rscons.glob('src/**')) env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') - env.Program('build_dir.exe', Dir['src/**/*.c']) + env.Program('build_dir.exe', Rscons.glob('src/**/*.c')) end diff --git a/build_tests/build_dir/backward_compatible_build_hooks.rb b/build_tests/build_dir/backward_compatible_build_hooks.rb index bbf0c95..a5e2150 100644 --- a/build_tests/build_dir/backward_compatible_build_hooks.rb +++ b/build_tests/build_dir/backward_compatible_build_hooks.rb @@ -6,7 +6,7 @@ end Rscons::Environment.new(echo: :command) do |env| env.add_builder(MyObject.new) - env.append('CPPPATH' => Dir['src/**/*/'].sort) + 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" diff --git a/build_tests/build_dir/build_dirs_and_root.rb b/build_tests/build_dir/build_dirs_and_root.rb index e70df71..f703ee2 100644 --- a/build_tests/build_dir/build_dirs_and_root.rb +++ b/build_tests/build_dir/build_dirs_and_root.rb @@ -1,6 +1,6 @@ env = Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.append('CPPPATH' => Rscons.glob('src/**/*/')) env.build_dir("src", "build") env.build_root = "build_root" - env.Program('build_dir.exe', Dir['src/**/*.c']) + env.Program('build_dir.exe', Rscons.glob('src/**/*.c')) end diff --git a/build_tests/build_dir/build_hooks.rb b/build_tests/build_dir/build_hooks.rb index 3646b2c..c9f36e6 100644 --- a/build_tests/build_dir/build_hooks.rb +++ b/build_tests/build_dir/build_hooks.rb @@ -1,5 +1,5 @@ Rscons::Environment.new(echo: :command) do |env| - env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.append('CPPPATH' => Rscons.glob('src/**/*/')) env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') env.add_build_hook do |build_op| if build_op[:target] =~ %r{build_one/.*\.o} @@ -8,5 +8,5 @@ Rscons::Environment.new(echo: :command) do |env| build_op[:vars]["CFLAGS"] << "-O2" end end - env.Program('build_hook.exe', Dir['src/**/*.c'].sort) + env.Program('build_hook.exe', Rscons.glob('src/**/*.c')) end diff --git a/build_tests/build_dir/carat.rb b/build_tests/build_dir/carat.rb index 8f74526..e0a3579 100644 --- a/build_tests/build_dir/carat.rb +++ b/build_tests/build_dir/carat.rb @@ -1,8 +1,8 @@ Rscons::Environment.new(echo: :command) do |env| - env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.append('CPPPATH' => Rscons.glob('src/**').sort) env.build_root = "build_root" FileUtils.mkdir_p(env.build_root) FileUtils.mv("src/one/one.c", "build_root") env.Object("^/one.o", "^/one.c") - env.Program("build_dir.exe", Dir['src/**/*.c'] + ["^/one.o"]) + env.Program("build_dir.exe", Rscons.glob('src/**/*.c') + ["^/one.o"]) end diff --git a/build_tests/build_dir/csuffix.rb b/build_tests/build_dir/csuffix.rb index 9b25719..99e37aa 100644 --- a/build_tests/build_dir/csuffix.rb +++ b/build_tests/build_dir/csuffix.rb @@ -1,6 +1,6 @@ Rscons::Environment.new do |env| env["CSUFFIX"] = %w[.yargh .c] env["CFLAGS"] += %w[-x c] - env["CPPPATH"] += Dir["src/**/"] - env.Program("build_dir.exe", Dir["src/**/*.{c,yargh}"]) + env["CPPPATH"] += Rscons.glob("src/**") + env.Program("build_dir.exe", Rscons.glob("src/**/*.{c,yargh}")) end diff --git a/build_tests/build_dir/no_match_build_dir.rb b/build_tests/build_dir/no_match_build_dir.rb index 42c6e48..27c2271 100644 --- a/build_tests/build_dir/no_match_build_dir.rb +++ b/build_tests/build_dir/no_match_build_dir.rb @@ -1,6 +1,6 @@ Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.append('CPPPATH' => Rscons.glob('src/**')) env.build_dir("src2", "build") env.build_root = "build_root" - env.Program('build_dir.exe', Dir['src/**/*.c']) + env.Program('build_dir.exe', Rscons.glob('src/**/*.c')) end diff --git a/build_tests/build_dir/slashes.rb b/build_tests/build_dir/slashes.rb index 4b619ff..b17936c 100644 --- a/build_tests/build_dir/slashes.rb +++ b/build_tests/build_dir/slashes.rb @@ -1,6 +1,6 @@ Rscons::Environment.new do |env| - env.append("CPPPATH" => Dir["src/**/*/"].sort) + 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", Dir["src/**/*.c"]) + env.Program("build_dir.exe", Rscons.glob("src/**/*.c")) end diff --git a/build_tests/d/Rsconsfile b/build_tests/d/Rsconsfile index e564612..9e45872 100644 --- a/build_tests/d/Rsconsfile +++ b/build_tests/d/Rsconsfile @@ -1,3 +1,3 @@ Rscons::Environment.new(echo: :command) do |env| - env.Program("hello-d.exe", Dir["*.d"].sort) + env.Program("hello-d.exe", Rscons.glob("*.d")) end diff --git a/build_tests/library/override_arcmd.rb b/build_tests/library/override_arcmd.rb index 29e39d3..0fdd9f8 100644 --- a/build_tests/library/override_arcmd.rb +++ b/build_tests/library/override_arcmd.rb @@ -1,4 +1,4 @@ Rscons::Environment.new(echo: :command) do |env| env["ARCMD"] = %w[ar rcf ${_TARGET} ${_SOURCES}] - env.Library("lib.a", Dir["*.c"].sort) + env.Library("lib.a", Rscons.glob("*.c")) end diff --git a/build_tests/shared_library/Rsconsfile b/build_tests/shared_library/Rsconsfile index bc6bacd..19ca2bb 100644 --- a/build_tests/shared_library/Rsconsfile +++ b/build_tests/shared_library/Rsconsfile @@ -1,11 +1,11 @@ Rscons::Environment.new do |env| env["CPPPATH"] << "src/lib" - libmine = env.SharedLibrary("mine", Dir["src/lib/*.c"]) + libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.c")) env.Program("test-shared.exe", - Dir["src/*.c"], + Rscons.glob("src/*.c"), "LIBPATH" => %w[.], "LIBS" => %w[mine]) env.build_after("test-shared.exe", libmine.to_s) env.Program("test-static.exe", - Dir["src/**/*.c"]) + Rscons.glob("src/**/*.c")) end diff --git a/build_tests/shared_library/shared_library_cxx.rb b/build_tests/shared_library/shared_library_cxx.rb index c83a25f..12b4aa4 100644 --- a/build_tests/shared_library/shared_library_cxx.rb +++ b/build_tests/shared_library/shared_library_cxx.rb @@ -1,11 +1,11 @@ Rscons::Environment.new do |env| env["CPPPATH"] << "src/lib" - libmine = env.SharedLibrary("mine", Dir["src/lib/*.cc"]) + libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.cc")) env.Program("test-shared.exe", - Dir["src/*.cc"], + Rscons.glob("src/*.cc"), "LIBPATH" => %w[.], "LIBS" => %w[mine]) env.build_after("test-shared.exe", libmine.to_s) env.Program("test-static.exe", - Dir["src/**/*.cc"]) + Rscons.glob("src/**/*.cc")) end diff --git a/build_tests/shared_library/shared_library_d.rb b/build_tests/shared_library/shared_library_d.rb index e64279c..e85fc7f 100644 --- a/build_tests/shared_library/shared_library_d.rb +++ b/build_tests/shared_library/shared_library_d.rb @@ -1,8 +1,8 @@ Rscons::Environment.new do |env| env["CPPPATH"] << "src/lib" - libmine = env.SharedLibrary("mine", Dir["src/lib/*.d"]) + libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.d")) env.Program("test-shared.exe", - Dir["src/*.c"], + Rscons.glob("src/*.c"), "LIBPATH" => %w[.], "LIBS" => %w[mine]) env.build_after("test-shared.exe", libmine.to_s) diff --git a/build_tests/shared_library/shared_library_set_shld.rb b/build_tests/shared_library/shared_library_set_shld.rb index 01ac9a8..117ea7e 100644 --- a/build_tests/shared_library/shared_library_set_shld.rb +++ b/build_tests/shared_library/shared_library_set_shld.rb @@ -1,12 +1,12 @@ Rscons::Environment.new do |env| env["CPPPATH"] << "src/lib" env["SHLD"] = "gcc" - libmine = env.SharedLibrary("mine", Dir["src/lib/*.c"]) + libmine = env.SharedLibrary("mine", Rscons.glob("src/lib/*.c")) env.Program("test-shared.exe", - Dir["src/*.c"], + Rscons.glob("src/*.c"), "LIBPATH" => %w[.], "LIBS" => %w[mine]) env.build_after("test-shared.exe", libmine.to_s) env.Program("test-static.exe", - Dir["src/**/*.c"]) + Rscons.glob("src/**/*.c")) end diff --git a/build_tests/simple/cvar_array.rb b/build_tests/simple/cvar_array.rb index f5de90e..e7a4062 100644 --- a/build_tests/simple/cvar_array.rb +++ b/build_tests/simple/cvar_array.rb @@ -1,4 +1,4 @@ Rscons::Environment.new do |env| - env["sources"] = Dir["*.c"].sort + env["sources"] = Rscons.glob("*.c") env.Program("simple.exe", "${sources}") end diff --git a/lib/rscons.rb b/lib/rscons.rb index fc84d21..294b3fb 100644 --- a/lib/rscons.rb +++ b/lib/rscons.rb @@ -165,6 +165,35 @@ module Rscons @command_executer = val end + # Return a list of paths matching the specified pattern(s). + # + # @since 1.16.0 + # + # A pattern can contain a "/**" component to recurse through directories. + # If the pattern ends with "/**" then only the recursive list of + # directories will be returned. + # + # Examples: + # - "src/**": return all directories under "src", recursively (including + # "src" itself). + # - "src/**/*": return all files and directories recursively under the src + # directory. + # - "src/**/*.c": return all .c files recursively under the src directory. + # - "dir/*/": return all directories in dir, but no files. + # + # @return [Array] Paths matching the specified pattern(s). + def glob(*patterns) + require "pathname" + patterns.reduce([]) do |result, pattern| + if pattern.end_with?("/**") + pattern += "/" + end + result += Dir.glob(pattern).map do |path| + Pathname.new(path.gsub("\\", "/")).cleanpath.to_s + end + end.sort + end + private # Determine the number of threads to use by default. diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 9d85cd6..10e3a2a 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -250,8 +250,8 @@ EOF result = run_test(rsconsfile: "carat.rb") expect(result.stderr).to eq "" expect(Set[*lines(result.stdout)]).to eq Set[ - %q{gcc -c -o build_root/one.o -MMD -MF build_root/one.mf -MT TARGET -Isrc/one/ -Isrc/two/ build_root/one.c}, - %q{gcc -c -o build_root/src/two/two.o -MMD -MF build_root/src/two/two.mf -MT TARGET -Isrc/one/ -Isrc/two/ src/two/two.c}, + %q{gcc -c -o build_root/one.o -MMD -MF build_root/one.mf -MT TARGET -Isrc -Isrc/one -Isrc/two build_root/one.c}, + %q{gcc -c -o build_root/src/two/two.o -MMD -MF build_root/src/two/two.mf -MT TARGET -Isrc -Isrc/one -Isrc/two src/two/two.c}, %Q{gcc -o build_dir.exe build_root/src/two/two.o build_root/one.o}, ] end @@ -393,8 +393,8 @@ EOF result = run_test(rsconsfile: "build_hooks.rb") expect(result.stderr).to eq "" expect(Set[*lines(result.stdout)]).to eq Set[ - 'gcc -c -o build_one/one.o -MMD -MF build_one/one.mf -MT TARGET -Isrc/one/ -Isrc/two/ -O1 src/one/one.c', - 'gcc -c -o build_two/two.o -MMD -MF build_two/two.mf -MT TARGET -Isrc/one/ -Isrc/two/ -O2 src/two/two.c', + 'gcc -c -o build_one/one.o -MMD -MF build_one/one.mf -MT TARGET -Isrc/one -Isrc/two -O1 src/one/one.c', + 'gcc -c -o build_two/two.o -MMD -MF build_two/two.mf -MT TARGET -Isrc/one -Isrc/two -O2 src/two/two.c', 'gcc -o build_hook.exe build_one/one.o build_two/two.o', ] expect(`./build_hook.exe`).to eq "Hello from two()\n" @@ -894,8 +894,8 @@ EOF result = run_test(rsconsfile: "backward_compatible_build_hooks.rb") expect(result.stderr).to eq "" expect(Set[*lines(result.stdout)]).to eq Set[ - 'gcc -c -o one.o -MMD -MF one.mf -MT TARGET -Isrc/one/ -Isrc/two/ -O1 src/two/two.c', - 'gcc -c -o two.o -MMD -MF two.mf -MT TARGET -Isrc/one/ -Isrc/two/ -O2 src/two/two.c' + 'gcc -c -o one.o -MMD -MF one.mf -MT TARGET -Isrc -Isrc/one -Isrc/two -O1 src/two/two.c', + 'gcc -c -o two.o -MMD -MF two.mf -MT TARGET -Isrc -Isrc/one -Isrc/two -O2 src/two/two.c' ] expect(File.exists?('one.o')).to be_truthy expect(File.exists?('two.o')).to be_truthy