Compare commits
22
Commits
v2.0.0beta2
...
v2.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf52c3fc6f | ||
|
|
5378afb6f8 | ||
|
|
48d9273cc6 | ||
|
|
efea4f1181 | ||
|
|
b4fa6d965c | ||
|
|
ac56ad34f6 | ||
|
|
2fd533a32a | ||
|
|
c938ed71d1 | ||
|
|
ec60201a62 | ||
|
|
0cafb8c5b3 | ||
|
|
004810386b | ||
|
|
a15ee9daaf | ||
|
|
cd33405697 | ||
|
|
efa77066bf | ||
|
|
a1bb9d81fd | ||
|
|
0344f02cb1 | ||
|
|
d52bdaf046 | ||
|
|
ad7ccb771d | ||
|
|
044ee343ca | ||
|
|
eb54a2b64a | ||
|
|
2dd1ce9f1d | ||
|
|
1e157c79ec |
No files matched your search
@@ -32,6 +32,7 @@
|
|||||||
- various performance improvements
|
- various performance improvements
|
||||||
- wrote a new user guide
|
- wrote a new user guide
|
||||||
- added new website ([https://holtrop.github.io/rscons/](https://holtrop.github.io/rscons/))
|
- added new website ([https://holtrop.github.io/rscons/](https://holtrop.github.io/rscons/))
|
||||||
|
- added new logo
|
||||||
|
|
||||||
## v1.17.0
|
## v1.17.0
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
# Rscons
|
# Rscons
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
Rscons (https://github.com/holtrop/rscons) is an open-source build system
|
Rscons (https://github.com/holtrop/rscons) is an open-source build system
|
||||||
for developers.
|
for developers.
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -11,7 +11,7 @@ require "rake/clean"
|
|||||||
require "fileutils"
|
require "fileutils"
|
||||||
|
|
||||||
CLEAN.include %w[build_test_run .yardoc yard coverage test]
|
CLEAN.include %w[build_test_run .yardoc yard coverage test]
|
||||||
CLOBBER.include %w[dist pkg]
|
CLOBBER.include %w[dist gen large_project pkg]
|
||||||
|
|
||||||
task :build_dist do
|
task :build_dist do
|
||||||
sh "ruby rb/build_dist.rb"
|
sh "ruby rb/build_dist.rb"
|
||||||
@@ -93,3 +93,10 @@ task :user_guide do
|
|||||||
end
|
end
|
||||||
|
|
||||||
task :default => :spec
|
task :default => :spec
|
||||||
|
|
||||||
|
task :all => [
|
||||||
|
:build_dist,
|
||||||
|
:spec,
|
||||||
|
:yard,
|
||||||
|
:user_guide,
|
||||||
|
]
|
||||||
@@ -17,6 +17,10 @@ configure do
|
|||||||
end
|
end
|
||||||
op.complete(status, success_message: "good!", fail_message: fail_message, fail: should_fail)
|
op.complete(status, success_message: "good!", fail_message: fail_message, fail: should_fail)
|
||||||
end
|
end
|
||||||
|
custom_check("Checking sed -E flag") do |op|
|
||||||
|
stdout, stderr, status = op.log_and_test_command(%w[sed -E -e s/ab+/rep/], stdin: "abbbc")
|
||||||
|
op.complete(stdout =~ /repc/ ? 0 : 1, success_message: "good", fail_message: "fail")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
build do
|
build do
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "gdc"
|
||||||
|
end
|
||||||
|
|
||||||
build do
|
build do
|
||||||
Environment.new(echo: :command) do |env|
|
Environment.new(echo: :command) do |env|
|
||||||
env.Program("hello-d.exe", glob("*.d"))
|
env.Program("hello-d.exe", glob("*.d"))
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
configure do
|
||||||
|
check_d_compiler "ldc2"
|
||||||
|
end
|
||||||
|
|
||||||
|
build do
|
||||||
|
Environment.new(echo: :command) do |env|
|
||||||
|
env.Program("hello-d.exe", glob("*.d"))
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
build do
|
||||||
|
Environment.new do |env|
|
||||||
|
env.Program("program.exe", "program.c")
|
||||||
|
env.Install("install/program.exe", "program.exe")
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
sleep(2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
build do
|
build do
|
||||||
Environment.new do |env|
|
Environment.new do |env|
|
||||||
env["LIBS"] += ["c"]
|
env["LIBS"] += ["m"]
|
||||||
env.Program('simple.exe', Dir['*.c'])
|
env.Program('simple.exe', Dir['*.c'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
+3
-2
@@ -8,7 +8,7 @@ It supports the following features:
|
|||||||
* built-in builders for several common operations
|
* built-in builders for several common operations
|
||||||
* out-of-the-box support for C, C++, and D languages
|
* out-of-the-box support for C, C++, and D languages
|
||||||
* extensibility for other languages or custom builders
|
* extensibility for other languages or custom builders
|
||||||
* compatible with Windows, Linux, and OS X
|
* compatible with Windows, Linux, OS X, and FreeBSD
|
||||||
* colorized output with build progress
|
* colorized output with build progress
|
||||||
* build hooks
|
* build hooks
|
||||||
|
|
||||||
@@ -98,7 +98,8 @@ The only dependency required to run Rscons is to have a Ruby interpreter
|
|||||||
installed.
|
installed.
|
||||||
The latest release can be downloaded from [https://github.com/holtrop/rscons/releases](https://github.com/holtrop/rscons/releases).
|
The latest release can be downloaded from [https://github.com/holtrop/rscons/releases](https://github.com/holtrop/rscons/releases).
|
||||||
Simply copy the `rscons` executable script into the desired location within
|
Simply copy the `rscons` executable script into the desired location within
|
||||||
the project to be built (typically the root of the repository).
|
the project to be built (typically the root of the repository) and mark it
|
||||||
|
executable.
|
||||||
|
|
||||||
## Version Control Setup
|
## Version Control Setup
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 242 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
@@ -57,6 +57,7 @@ module Rscons
|
|||||||
printed_message = true
|
printed_message = true
|
||||||
end
|
end
|
||||||
@cache.mkdir_p(File.dirname(dest), install: @install_builder)
|
@cache.mkdir_p(File.dirname(dest), install: @install_builder)
|
||||||
|
FileUtils.rm_f(dest)
|
||||||
FileUtils.cp(src, dest, :preserve => true)
|
FileUtils.cp(src, dest, :preserve => true)
|
||||||
end
|
end
|
||||||
@cache.register_build(dest, :Copy, [src], @env, install: @install_builder)
|
@cache.register_build(dest, :Copy, [src], @env, install: @install_builder)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ module Rscons
|
|||||||
def finalize_command_with_depfile
|
def finalize_command_with_depfile
|
||||||
deps = @sources
|
deps = @sources
|
||||||
if File.exists?(@vars["_DEPFILE"])
|
if File.exists?(@vars["_DEPFILE"])
|
||||||
deps += Util.parse_makefile_deps(@vars["_DEPFILE"])
|
deps += Util.parse_dependency_file(@vars["_DEPFILE"])
|
||||||
end
|
end
|
||||||
@cache.register_build(@target, @command, deps.uniq, @env)
|
@cache.register_build(@target, @command, deps.uniq, @env)
|
||||||
true
|
true
|
||||||
|
|||||||
@@ -280,12 +280,19 @@ module Rscons
|
|||||||
|
|
||||||
# Execute a test command and log the result.
|
# Execute a test command and log the result.
|
||||||
#
|
#
|
||||||
|
# @param command [Array<String>]
|
||||||
|
# Command to execute.
|
||||||
|
# @param options [Hash]
|
||||||
|
# Optional arguments.
|
||||||
|
# @option options [String] :stdin
|
||||||
|
# Data to send to standard input stream of the executed command.
|
||||||
|
#
|
||||||
# @return [String, String, Process::Status]
|
# @return [String, String, Process::Status]
|
||||||
# stdout, stderr, status
|
# stdout, stderr, status
|
||||||
def log_and_test_command(command)
|
def log_and_test_command(command, options = {})
|
||||||
begin
|
begin
|
||||||
@log_fh.puts("Command: #{command.join(" ")}")
|
@log_fh.puts("Command: #{command.join(" ")}")
|
||||||
stdout, stderr, status = Open3.capture3(*command)
|
stdout, stderr, status = Open3.capture3(*command, stdin_data: options[:stdin])
|
||||||
@log_fh.puts("Exit status: #{status.to_i}")
|
@log_fh.puts("Exit status: #{status.to_i}")
|
||||||
@log_fh.write(stdout)
|
@log_fh.write(stdout)
|
||||||
@log_fh.write(stderr)
|
@log_fh.write(stderr)
|
||||||
@@ -479,7 +486,12 @@ module Rscons
|
|||||||
"DC" => dc,
|
"DC" => dc,
|
||||||
"DCCMD" => env["DCCMD"].map {|e| if e == "-o"; "-of"; else; e; end},
|
"DCCMD" => env["DCCMD"].map {|e| if e == "-o"; "-of"; else; e; end},
|
||||||
"LDCMD" => env["LDCMD"].map {|e| if e == "-o"; "-of"; else; e; end},
|
"LDCMD" => env["LDCMD"].map {|e| if e == "-o"; "-of"; else; e; end},
|
||||||
|
"DDEPGEN" => ["-deps=${_DEPFILE}"],
|
||||||
}
|
}
|
||||||
|
if RUBY_PLATFORM =~ /mingw/
|
||||||
|
# ldc2 on Windows expect an object file suffix of .obj.
|
||||||
|
merge["OBJSUFFIX"] = %w[.obj]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
_, _, status = log_and_test_command(command)
|
_, _, status = log_and_test_command(command)
|
||||||
if status == 0
|
if status == 0
|
||||||
|
|||||||
+9
-3
@@ -160,7 +160,7 @@ module Rscons
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Parse dependencies from a Makefile.
|
# Parse dependencies from a Makefile or ldc2 dependency file.
|
||||||
#
|
#
|
||||||
# This method is used internally by Rscons builders.
|
# This method is used internally by Rscons builders.
|
||||||
#
|
#
|
||||||
@@ -169,7 +169,7 @@ module Rscons
|
|||||||
#
|
#
|
||||||
# @return [Array<String>]
|
# @return [Array<String>]
|
||||||
# Paths of dependency files.
|
# Paths of dependency files.
|
||||||
def parse_makefile_deps(mf_fname)
|
def parse_dependency_file(mf_fname)
|
||||||
deps = []
|
deps = []
|
||||||
buildup = ''
|
buildup = ''
|
||||||
File.read(mf_fname).each_line do |line|
|
File.read(mf_fname).each_line do |line|
|
||||||
@@ -177,7 +177,11 @@ module Rscons
|
|||||||
buildup += ' ' + $1
|
buildup += ' ' + $1
|
||||||
else
|
else
|
||||||
buildup += ' ' + line
|
buildup += ' ' + line
|
||||||
if buildup =~ /^.*: (.*)$/
|
if buildup =~ /^[^:]+\(\S+\)\s*:.*?:[^:]+\((\S+)\)/
|
||||||
|
# ldc2-style dependency line
|
||||||
|
deps << $1
|
||||||
|
elsif buildup =~ /^.*: (.*)$/
|
||||||
|
# Makefile-style dependency line
|
||||||
mf_deps = $1
|
mf_deps = $1
|
||||||
deps += mf_deps.split(' ').map(&:strip)
|
deps += mf_deps.split(' ').map(&:strip)
|
||||||
end
|
end
|
||||||
@@ -200,6 +204,7 @@ module Rscons
|
|||||||
File.file?(path) and File.executable?(path)
|
File.file?(path) and File.executable?(path)
|
||||||
end
|
end
|
||||||
if RbConfig::CONFIG["host_os"] =~ /mswin|windows|mingw/i
|
if RbConfig::CONFIG["host_os"] =~ /mswin|windows|mingw/i
|
||||||
|
if File.directory?(path_entry)
|
||||||
executable = executable.downcase
|
executable = executable.downcase
|
||||||
dir_entries = Dir.entries(path_entry)
|
dir_entries = Dir.entries(path_entry)
|
||||||
dir_entries.find do |entry|
|
dir_entries.find do |entry|
|
||||||
@@ -212,6 +217,7 @@ module Rscons
|
|||||||
return path
|
return path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
path = "#{path_entry}/#{executable}"
|
path = "#{path_entry}/#{executable}"
|
||||||
return path if is_executable[path]
|
return path if is_executable[path]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module Rscons
|
module Rscons
|
||||||
# Project version.
|
# Project version.
|
||||||
VERSION = "2.0.0beta2"
|
VERSION = "2.0.1"
|
||||||
end
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>RScons User Guide<%= subpage_title %> - Version <%= Rscons::VERSION %></title>
|
<title>Rscons User Guide<%= subpage_title %> - Version <%= Rscons::VERSION %></title>
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
background-color: #CCC;
|
background-color: #CCC;
|
||||||
@@ -31,6 +31,11 @@
|
|||||||
.separator {
|
.separator {
|
||||||
height: 2em;
|
height: 2em;
|
||||||
}
|
}
|
||||||
|
.img_block_center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
.page_nav {
|
.page_nav {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
|
|||||||
+7
-5
@@ -59,9 +59,10 @@ combined_file.each do |line|
|
|||||||
end
|
end
|
||||||
|
|
||||||
require "zlib"
|
require "zlib"
|
||||||
|
require "base64"
|
||||||
compressed_script = Zlib::Deflate.deflate(stripped_comments.join)
|
compressed_script = Zlib::Deflate.deflate(stripped_comments.join)
|
||||||
escaped_compressed_script = compressed_script.gsub("#", "#1").gsub("\n", "#2").gsub("\r", "#3").gsub("\0", "#4")
|
encoded_compressed_script = Base64.encode64(compressed_script).gsub("\n", "")
|
||||||
hash = Digest::MD5.hexdigest(escaped_compressed_script)
|
hash = Digest::MD5.hexdigest(encoded_compressed_script)
|
||||||
|
|
||||||
FileUtils.mkdir_p(DIST)
|
FileUtils.mkdir_p(DIST)
|
||||||
File.open("#{DIST}/#{PROG_NAME}", "wb", 0755) do |fh|
|
File.open("#{DIST}/#{PROG_NAME}", "wb", 0755) do |fh|
|
||||||
@@ -70,9 +71,10 @@ File.open("#{DIST}/#{PROG_NAME}", "wb", 0755) do |fh|
|
|||||||
script = File.join(File.dirname(__FILE__), ".rscons-#{VERSION}-#{hash}.rb")
|
script = File.join(File.dirname(__FILE__), ".rscons-#{VERSION}-#{hash}.rb")
|
||||||
unless File.exists?(script)
|
unless File.exists?(script)
|
||||||
if File.read(__FILE__, mode: "rb") =~ /^#==>(.*)/
|
if File.read(__FILE__, mode: "rb") =~ /^#==>(.*)/
|
||||||
escaped_compressed = $1
|
|
||||||
unescaped_compressed = escaped_compressed.gsub("#4", "\\0").gsub("#3", "\\r").gsub("#2", "\\n").gsub("#1", "#")
|
|
||||||
require "zlib"
|
require "zlib"
|
||||||
|
require "base64"
|
||||||
|
encoded_compressed = $1
|
||||||
|
unescaped_compressed = Base64.decode64(encoded_compressed)
|
||||||
inflated = Zlib::Inflate.inflate(unescaped_compressed)
|
inflated = Zlib::Inflate.inflate(unescaped_compressed)
|
||||||
File.open(script, "wb") do |fh|
|
File.open(script, "wb") do |fh|
|
||||||
fh.write(inflated)
|
fh.write(inflated)
|
||||||
@@ -85,6 +87,6 @@ load script
|
|||||||
if __FILE__ == $0
|
if __FILE__ == $0
|
||||||
Rscons::Cli.run(ARGV)
|
Rscons::Cli.run(ARGV)
|
||||||
end
|
end
|
||||||
#==>#{escaped_compressed_script}
|
#==>#{encoded_compressed_script}
|
||||||
EOF
|
EOF
|
||||||
end
|
end
|
||||||
@@ -154,7 +154,8 @@ class Generator
|
|||||||
end
|
end
|
||||||
|
|
||||||
def render_toc
|
def render_toc
|
||||||
toc_content = %[<h1>Table of Contents</h1>\n]
|
toc_content = %[<img class="img_block_center" src="rscons_logo_1000.png" />]
|
||||||
|
toc_content += %[<h1>Table of Contents</h1>\n]
|
||||||
@sections.each do |section|
|
@sections.each do |section|
|
||||||
indent = section.number.split(".").size - 1
|
indent = section.number.split(".").size - 1
|
||||||
toc_content += %[<span style="padding-left: #{4 * indent}ex;">]
|
toc_content += %[<span style="padding-left: #{4 * indent}ex;">]
|
||||||
@@ -223,5 +224,6 @@ end
|
|||||||
input = load_file("doc/user_guide.md")
|
input = load_file("doc/user_guide.md")
|
||||||
FileUtils.rm_rf("gen/user_guide")
|
FileUtils.rm_rf("gen/user_guide")
|
||||||
FileUtils.mkdir_p("gen/user_guide")
|
FileUtils.mkdir_p("gen/user_guide")
|
||||||
|
FileUtils.cp("img/rscons_logo_1000.png", "gen/user_guide")
|
||||||
Generator.new(input, "gen/user_guide/user_guide.html", false)
|
Generator.new(input, "gen/user_guide/user_guide.html", false)
|
||||||
Generator.new(input, "gen/user_guide", true)
|
Generator.new(input, "gen/user_guide", true)
|
||||||
+78
-10
@@ -65,6 +65,9 @@ describe Rscons do
|
|||||||
|
|
||||||
def create_exe(exe_name, contents)
|
def create_exe(exe_name, contents)
|
||||||
exe_file = "#{@build_test_run_dir}/_bin/#{exe_name}"
|
exe_file = "#{@build_test_run_dir}/_bin/#{exe_name}"
|
||||||
|
if RUBY_PLATFORM =~ /mingw/
|
||||||
|
exe_file += ".bat"
|
||||||
|
end
|
||||||
File.open(exe_file, "wb") do |fh|
|
File.open(exe_file, "wb") do |fh|
|
||||||
fh.puts("#!/bin/sh")
|
fh.puts("#!/bin/sh")
|
||||||
fh.puts(contents)
|
fh.puts(contents)
|
||||||
@@ -142,7 +145,11 @@ EOF
|
|||||||
stdout, stderr, status = nil, nil, nil
|
stdout, stderr, status = nil, nil, nil
|
||||||
Bundler.with_clean_env do
|
Bundler.with_clean_env do
|
||||||
env = ENV.to_h
|
env = ENV.to_h
|
||||||
env["PATH"] = "#{@build_test_run_dir}/_bin#{File::PATH_SEPARATOR}#{env["PATH"]}"
|
path = ["#{@build_test_run_dir}/_bin", "#{env["PATH"]}"]
|
||||||
|
if options[:path]
|
||||||
|
path = Array(options[:path]) + path
|
||||||
|
end
|
||||||
|
env["PATH"] = path.join(File::PATH_SEPARATOR)
|
||||||
stdout, stderr, status = Open3.capture3(env, *command)
|
stdout, stderr, status = Open3.capture3(env, *command)
|
||||||
File.open("#{@build_test_run_dir}/.stdout", "wb") do |fh|
|
File.open("#{@build_test_run_dir}/.stdout", "wb") do |fh|
|
||||||
fh.write(stdout)
|
fh.write(stdout)
|
||||||
@@ -330,6 +337,20 @@ EOF
|
|||||||
expect(result.stderr).to match /Could not find a registered build target "foo"/
|
expect(result.stderr).to match /Could not find a registered build target "foo"/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "allows replacing a running executable when performing an 'install' operation" do
|
||||||
|
test_dir("install_running_exe")
|
||||||
|
result = run_rscons(op: "install")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
fcontents = File.read("program.c", mode: "rb")
|
||||||
|
File.open("program.c", "wb") do |fh|
|
||||||
|
fh.write(fcontents.sub(/2/, '3'))
|
||||||
|
end
|
||||||
|
pid = Process.spawn("install/program.exe")
|
||||||
|
result = run_rscons(op: "install")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
Process.wait(pid)
|
||||||
|
end
|
||||||
|
|
||||||
context "clean operation" do
|
context "clean operation" do
|
||||||
it 'cleans built files' do
|
it 'cleans built files' do
|
||||||
test_dir("simple")
|
test_dir("simple")
|
||||||
@@ -588,8 +609,7 @@ EOF
|
|||||||
expect(result.stdout).to eq ""
|
expect(result.stdout).to eq ""
|
||||||
end
|
end
|
||||||
|
|
||||||
unless ENV["omit_gdc_tests"]
|
it "supports building D sources with gdc" do
|
||||||
it "supports building D sources" do
|
|
||||||
test_dir("d")
|
test_dir("d")
|
||||||
result = run_rscons
|
result = run_rscons
|
||||||
expect(result.stderr).to eq ""
|
expect(result.stderr).to eq ""
|
||||||
@@ -600,6 +620,40 @@ EOF
|
|||||||
expect(`./hello-d.exe`.rstrip).to eq "Hello from D, value is 42!"
|
expect(`./hello-d.exe`.rstrip).to eq "Hello from D, value is 42!"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "supports building D sources with ldc2" do
|
||||||
|
test_dir("d")
|
||||||
|
result = run_rscons(rsconscript: "build-ldc2.rb")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
slines = lines(result.stdout)
|
||||||
|
verify_lines(slines, [%r{ldc2 -c -of build/e.1/main.o(bj)? -deps=build/e.1/main.mf main.d}])
|
||||||
|
verify_lines(slines, [%r{ldc2 -c -of build/e.1/mod.o(bj)? -deps=build/e.1/mod.mf mod.d}])
|
||||||
|
verify_lines(slines, [%r{ldc2 -of hello-d.exe build/e.1/main.o(bj)? build/e.1/mod.o(bj)?}])
|
||||||
|
expect(`./hello-d.exe`.rstrip).to eq "Hello from D, value is 42!"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "rebuilds D modules with ldc2 when deep dependencies change" do
|
||||||
|
test_dir("d")
|
||||||
|
result = run_rscons(rsconscript: "build-ldc2.rb")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
slines = lines(result.stdout)
|
||||||
|
verify_lines(slines, [%r{ldc2 -c -of build/e.1/main.o(bj)? -deps=build/e.1/main.mf main.d}])
|
||||||
|
verify_lines(slines, [%r{ldc2 -c -of build/e.1/mod.o(bj)? -deps=build/e.1/mod.mf mod.d}])
|
||||||
|
verify_lines(slines, [%r{ldc2 -of hello-d.exe build/e.1/main.o(bj)? build/e.1/mod.o(bj)?}])
|
||||||
|
expect(`./hello-d.exe`.rstrip).to eq "Hello from D, value is 42!"
|
||||||
|
contents = File.read("mod.d", mode: "rb").sub("42", "33")
|
||||||
|
File.open("mod.d", "wb") do |fh|
|
||||||
|
fh.write(contents)
|
||||||
|
end
|
||||||
|
result = run_rscons(rsconscript: "build-ldc2.rb")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
slines = lines(result.stdout)
|
||||||
|
verify_lines(slines, [%r{ldc2 -c -of build/e.1/main.o(bj)? -deps=build/e.1/main.mf main.d}])
|
||||||
|
verify_lines(slines, [%r{ldc2 -c -of build/e.1/mod.o(bj)? -deps=build/e.1/mod.mf mod.d}])
|
||||||
|
verify_lines(slines, [%r{ldc2 -of hello-d.exe build/e.1/main.o(bj)? build/e.1/mod.o(bj)?}])
|
||||||
|
expect(`./hello-d.exe`.rstrip).to eq "Hello from D, value is 33!"
|
||||||
|
end
|
||||||
|
|
||||||
|
unless ENV["omit_gdc_tests"]
|
||||||
it "links with the D linker when object files were built from D sources" do
|
it "links with the D linker when object files were built from D sources" do
|
||||||
test_dir("d")
|
test_dir("d")
|
||||||
result = run_rscons(rsconscript: "link_objects.rb")
|
result = run_rscons(rsconscript: "link_objects.rb")
|
||||||
@@ -633,11 +687,7 @@ EOF
|
|||||||
test_dir("shared_library")
|
test_dir("shared_library")
|
||||||
|
|
||||||
result = run_rscons(rsconscript: "shared_library_d.rb")
|
result = run_rscons(rsconscript: "shared_library_d.rb")
|
||||||
# Currently gdc produces an error while trying to build the shared
|
expect(result.stderr).to eq ""
|
||||||
# library. Since this isn't really an rscons problem, I'm commenting out
|
|
||||||
# this check. I'm not sure what I want to do about D support at this
|
|
||||||
# point anyway...
|
|
||||||
#expect(result.stderr).to eq ""
|
|
||||||
slines = lines(result.stdout)
|
slines = lines(result.stdout)
|
||||||
if RUBY_PLATFORM =~ /mingw/
|
if RUBY_PLATFORM =~ /mingw/
|
||||||
verify_lines(slines, [%r{Linking mine.dll}])
|
verify_lines(slines, [%r{Linking mine.dll}])
|
||||||
@@ -2014,6 +2064,16 @@ EOF
|
|||||||
expect(result.stdout).to match /Checking for program 'find'... .*find/
|
expect(result.stdout).to match /Checking for program 'find'... .*find/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with non-existent PATH entries" do
|
||||||
|
it "succeeds when the requested program is found" do
|
||||||
|
test_dir "configure"
|
||||||
|
result = run_rscons(rsconscript: "check_program_success.rb", op: "configure", path: "/foo/bar")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
expect(result.status).to eq 0
|
||||||
|
expect(result.stdout).to match /Checking for program 'find'... .*find/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "fails when the requested program is not found" do
|
it "fails when the requested program is not found" do
|
||||||
test_dir "configure"
|
test_dir "configure"
|
||||||
result = run_rscons(rsconscript: "check_program_failure.rb", op: "configure")
|
result = run_rscons(rsconscript: "check_program_failure.rb", op: "configure")
|
||||||
@@ -2143,6 +2203,14 @@ EOF
|
|||||||
expect(result.status).to eq 0
|
expect(result.status).to eq 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "allows passing standard input data to the executed command" do
|
||||||
|
test_dir "configure"
|
||||||
|
result = run_rscons(rsconscript: "custom_config_check.rb", op: "configure")
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
expect(result.stdout).to match /Checking sed -E flag\.\.\. good/
|
||||||
|
expect(result.status).to eq 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2156,8 +2224,8 @@ EOF
|
|||||||
expect(result.stdout).to match /Setting build directory\.\.\. bb/
|
expect(result.stdout).to match /Setting build directory\.\.\. bb/
|
||||||
expect(result.stdout).to match %r{Setting prefix\.\.\. /my/prefix}
|
expect(result.stdout).to match %r{Setting prefix\.\.\. /my/prefix}
|
||||||
expect(result.stdout).to match /Checking for C compiler\.\.\. gcc/
|
expect(result.stdout).to match /Checking for C compiler\.\.\. gcc/
|
||||||
expect(result.stdout).to match /Checking for C\+\+ compiler\.\.\. g++/
|
expect(result.stdout).to match /Checking for C\+\+ compiler\.\.\. g\+\+/
|
||||||
expect(result.stdout).to match /Checking for D compiler\.\.\. gdc/
|
expect(result.stdout).to match /Checking for D compiler\.\.\. (gdc|ldc2)/
|
||||||
expect(result.stdout).to match /Checking for package 'mypackage'\.\.\. found/
|
expect(result.stdout).to match /Checking for package 'mypackage'\.\.\. found/
|
||||||
expect(result.stdout).to match /Checking for C header 'stdio.h'\.\.\. found/
|
expect(result.stdout).to match /Checking for C header 'stdio.h'\.\.\. found/
|
||||||
expect(result.stdout).to match /Checking for C\+\+ header 'iostream'\.\.\. found/
|
expect(result.stdout).to match /Checking for C\+\+ header 'iostream'\.\.\. found/
|
||||||
|
|||||||
@@ -121,7 +121,10 @@ EOF
|
|||||||
before(:each) do
|
before(:each) do
|
||||||
stub_const("File::PATH_SEPARATOR", ";")
|
stub_const("File::PATH_SEPARATOR", ";")
|
||||||
stub_const("RbConfig::CONFIG", "host_os" => "mingw")
|
stub_const("RbConfig::CONFIG", "host_os" => "mingw")
|
||||||
expect(ENV).to receive(:[]).with("PATH").and_return("C:\\bin;C:\\Windows")
|
expect(ENV).to receive(:[]).with("PATH").and_return("C:\\none;C:\\bin;C:\\Windows")
|
||||||
|
allow(File).to receive(:directory?).with("C:\\none").and_return(false)
|
||||||
|
allow(File).to receive(:directory?).with("C:\\bin").and_return(true)
|
||||||
|
allow(File).to receive(:directory?).with("C:\\Windows").and_return(true)
|
||||||
allow(Dir).to receive(:entries).with("C:\\bin").and_return(%w[one.com])
|
allow(Dir).to receive(:entries).with("C:\\bin").and_return(%w[one.com])
|
||||||
allow(Dir).to receive(:entries).with("C:\\Windows").and_return(%w[two.exe Three.bat])
|
allow(Dir).to receive(:entries).with("C:\\Windows").and_return(%w[two.exe Three.bat])
|
||||||
end
|
end
|
||||||
@@ -197,12 +200,12 @@ EOF
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".parse_makefile_deps" do
|
describe ".parse_dependency_file" do
|
||||||
it 'handles dependencies on one line' do
|
it 'handles dependencies on one line' do
|
||||||
expect(File).to receive(:read).with('makefile').and_return(<<EOS)
|
expect(File).to receive(:read).with('makefile').and_return(<<EOS)
|
||||||
module.o: source.cc
|
module.o: source.cc
|
||||||
EOS
|
EOS
|
||||||
expect(Util.parse_makefile_deps('makefile')).to eq ['source.cc']
|
expect(Util.parse_dependency_file('makefile')).to eq ['source.cc']
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'handles dependencies split across many lines' do
|
it 'handles dependencies split across many lines' do
|
||||||
@@ -211,9 +214,22 @@ module.o: module.c \\
|
|||||||
module.h \\
|
module.h \\
|
||||||
other.h
|
other.h
|
||||||
EOS
|
EOS
|
||||||
expect(Util.parse_makefile_deps('makefile')).to eq [
|
expect(Util.parse_dependency_file('makefile')).to eq [
|
||||||
'module.c', 'module.h', 'other.h']
|
'module.c', 'module.h', 'other.h']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "parses ldc2-style dependency lines" do
|
||||||
|
expect(File).to receive(:read).with("deps.out").and_return(<<EOS)
|
||||||
|
std.traits (/usr/lib/ldc/x86_64-linux-gnu/include/d/std/traits.d) : private : std.meta (/usr/lib/ldc/x86_64-linux-gnu/include/d/std/meta.d):staticIndexOf
|
||||||
|
std.conv (/usr/lib/ldc/x86_64-linux-gnu/include/d/std/conv.d) : private : std.array (/usr/lib/ldc/x86_64-linux-gnu/include/d/std/array.d):array
|
||||||
|
std.stdio (/usr/lib/ldc/x86_64-linux-gnu/include/d/std/stdio.d) : private static : core.sys.posix.sys.socket (/usr/lib/ldc/x86_64-linux-gnu/include/d/core/sys/posix/sys/socket.d) -> sock
|
||||||
|
EOS
|
||||||
|
expect(Util.parse_dependency_file("deps.out")).to eq [
|
||||||
|
"/usr/lib/ldc/x86_64-linux-gnu/include/d/std/meta.d",
|
||||||
|
"/usr/lib/ldc/x86_64-linux-gnu/include/d/std/array.d",
|
||||||
|
"/usr/lib/ldc/x86_64-linux-gnu/include/d/core/sys/posix/sys/socket.d",
|
||||||
|
]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in new issue
Block a user