add failure messages for failed configuration checks - close #119
This commit is contained in:
parent
bbe9563ceb
commit
5bac91f92f
5
build_tests/configure/on_fail.rb
Normal file
5
build_tests/configure/on_fail.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
configure do
|
||||||
|
check_c_compiler "foo123c", fail: false, on_fail: "Install the foo123 package"
|
||||||
|
check_d_compiler "foo123d", fail: false
|
||||||
|
check_cxx_compiler "foo123cxx", on_fail: lambda {puts "Install the foo123cxx package"}
|
||||||
|
end
|
@ -246,6 +246,15 @@ configure do
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Global configuration options may be supplied to the compiler checks as well.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
configure do
|
||||||
|
check_c_compiler "x86_64-elf-gcc", on_fail: "Install x86_64-elf cross toolchain first!"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
###> Checking for a Header File
|
###> Checking for a Header File
|
||||||
|
|
||||||
The following methods can be used to check for the presence of a header file:
|
The following methods can be used to check for the presence of a header file:
|
||||||
@ -272,18 +281,6 @@ end
|
|||||||
|
|
||||||
Optionally specifies an array of paths to look for the header file in.
|
Optionally specifies an array of paths to look for the header file in.
|
||||||
|
|
||||||
##### `:fail`
|
|
||||||
|
|
||||||
If the `:fail` option is set to `false`, then the absence of the header file
|
|
||||||
will not result in the configure option failing.
|
|
||||||
The `:fail` option defaults to `true` if the `:set_define` option is not
|
|
||||||
defined, and defaults to `false` if the `:set_define` option is defined.
|
|
||||||
|
|
||||||
##### `:set_define`
|
|
||||||
|
|
||||||
If set, a build define of the specified String will be added to the
|
|
||||||
`CPPDEFINES` construction variable array if the requested header is found.
|
|
||||||
|
|
||||||
###> Checking for a D Import
|
###> Checking for a D Import
|
||||||
|
|
||||||
The `check_d_import` method can be used to check for the presence of D import.
|
The `check_d_import` method can be used to check for the presence of D import.
|
||||||
@ -327,18 +324,6 @@ end
|
|||||||
|
|
||||||
Optionally specifies an array of paths to look for the library in.
|
Optionally specifies an array of paths to look for the library in.
|
||||||
|
|
||||||
##### `:fail`
|
|
||||||
|
|
||||||
If the `:fail` option is set to `false`, then the absence of the library
|
|
||||||
will not result in the configure option failing.
|
|
||||||
The `:fail` option defaults to `true` if the `:set_define` option is not
|
|
||||||
defined, and defaults to `false` if the `:set_define` option is defined.
|
|
||||||
|
|
||||||
##### `:set_define`
|
|
||||||
|
|
||||||
If set, a build define of the specified String will be added to the
|
|
||||||
`CPPDEFINES` construction variable array if the requested library is found.
|
|
||||||
|
|
||||||
##### `:use`
|
##### `:use`
|
||||||
|
|
||||||
If not set, the library will be used by default in all `Environment` objects.
|
If not set, the library will be used by default in all `Environment` objects.
|
||||||
@ -387,18 +372,6 @@ used to look for package configuration flags for the specified package.
|
|||||||
If the `:program` option is given, the program specified will be used to look
|
If the `:program` option is given, the program specified will be used to look
|
||||||
for configuration flags.
|
for configuration flags.
|
||||||
|
|
||||||
##### `:fail`
|
|
||||||
|
|
||||||
If the `:fail` option is set to `false`, then the absence of the package or
|
|
||||||
program requested will not result in the configure option failing.
|
|
||||||
The `:fail` option defaults to `true` if the `:set_define` option is not
|
|
||||||
defined, and defaults to `false` if the `:set_define` option is defined.
|
|
||||||
|
|
||||||
##### `:set_define`
|
|
||||||
|
|
||||||
If set, a build define of the specified String will be added to the
|
|
||||||
`CPPDEFINES` construction variable array if the requested package is found.
|
|
||||||
|
|
||||||
##### `:use`
|
##### `:use`
|
||||||
|
|
||||||
If not set, the library will be used by default in all `Environment` objects.
|
If not set, the library will be used by default in all `Environment` objects.
|
||||||
@ -457,6 +430,46 @@ configure do
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
###> Global Configuration Check Options
|
||||||
|
|
||||||
|
#### `:fail`
|
||||||
|
|
||||||
|
If the `:fail` option is set to `false`, then the absence of the package or
|
||||||
|
program requested will not result in the configure option failing.
|
||||||
|
The `:fail` option defaults to `true` if the `:set_define` option is not
|
||||||
|
defined, and defaults to `false` if the `:set_define` option is defined.
|
||||||
|
|
||||||
|
#### `:on_fail`
|
||||||
|
|
||||||
|
The `:on_fail` option can be set to a String or a Proc object. If the
|
||||||
|
configuration operation fails (or would fail), the given message is printed
|
||||||
|
or the Proc is called.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
configure do
|
||||||
|
check_c_compiler "special-gcc", on_fail: "First install special gcc!"
|
||||||
|
end
|
||||||
|
|
||||||
|
configure do
|
||||||
|
package_hint = lambda do
|
||||||
|
puts "The following packages must be installed to build this project:"
|
||||||
|
puts "- libsdl2-dev"
|
||||||
|
puts "- libsdl2-image-dev"
|
||||||
|
puts "- libsdl2-net-dev"
|
||||||
|
end
|
||||||
|
check_lib "SDL2", on_fail: package_hint
|
||||||
|
check_lib "SDL2_image", on_fail: package_hint
|
||||||
|
check_lib "SDL2_net", on_fail: package_hint
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `:set_define`
|
||||||
|
|
||||||
|
If set, a build define of the specified String will be added to the
|
||||||
|
`CPPDEFINES` construction variable array if the requested package is found.
|
||||||
|
|
||||||
##> Build Operations
|
##> Build Operations
|
||||||
|
|
||||||
The `build` block is used to create Environments and register build targets.
|
The `build` block is used to create Environments and register build targets.
|
||||||
|
@ -62,6 +62,10 @@ module Rscons
|
|||||||
# @return [void]
|
# @return [void]
|
||||||
def check_c_compiler(*ccc)
|
def check_c_compiler(*ccc)
|
||||||
$stdout.write("Checking for C compiler... ")
|
$stdout.write("Checking for C compiler... ")
|
||||||
|
options = {}
|
||||||
|
if ccc.last.is_a?(Hash)
|
||||||
|
options = ccc.slice!(-1)
|
||||||
|
end
|
||||||
if ccc.empty?
|
if ccc.empty?
|
||||||
# Default C compiler search array.
|
# Default C compiler search array.
|
||||||
ccc = %w[gcc clang]
|
ccc = %w[gcc clang]
|
||||||
@ -69,7 +73,7 @@ module Rscons
|
|||||||
cc = ccc.find do |cc|
|
cc = ccc.find do |cc|
|
||||||
test_c_compiler(cc)
|
test_c_compiler(cc)
|
||||||
end
|
end
|
||||||
complete(cc ? 0 : 1, success_message: cc)
|
complete(cc ? 0 : 1, options.merge(success_message: cc))
|
||||||
end
|
end
|
||||||
|
|
||||||
# Check for a working C++ compiler.
|
# Check for a working C++ compiler.
|
||||||
@ -80,6 +84,10 @@ module Rscons
|
|||||||
# @return [void]
|
# @return [void]
|
||||||
def check_cxx_compiler(*ccc)
|
def check_cxx_compiler(*ccc)
|
||||||
$stdout.write("Checking for C++ compiler... ")
|
$stdout.write("Checking for C++ compiler... ")
|
||||||
|
options = {}
|
||||||
|
if ccc.last.is_a?(Hash)
|
||||||
|
options = ccc.slice!(-1)
|
||||||
|
end
|
||||||
if ccc.empty?
|
if ccc.empty?
|
||||||
# Default C++ compiler search array.
|
# Default C++ compiler search array.
|
||||||
ccc = %w[g++ clang++]
|
ccc = %w[g++ clang++]
|
||||||
@ -87,7 +95,7 @@ module Rscons
|
|||||||
cc = ccc.find do |cc|
|
cc = ccc.find do |cc|
|
||||||
test_cxx_compiler(cc)
|
test_cxx_compiler(cc)
|
||||||
end
|
end
|
||||||
complete(cc ? 0 : 1, success_message: cc)
|
complete(cc ? 0 : 1, options.merge(success_message: cc))
|
||||||
end
|
end
|
||||||
|
|
||||||
# Check for a working D compiler.
|
# Check for a working D compiler.
|
||||||
@ -98,6 +106,10 @@ module Rscons
|
|||||||
# @return [void]
|
# @return [void]
|
||||||
def check_d_compiler(*cdc)
|
def check_d_compiler(*cdc)
|
||||||
$stdout.write("Checking for D compiler... ")
|
$stdout.write("Checking for D compiler... ")
|
||||||
|
options = {}
|
||||||
|
if cdc.last.is_a?(Hash)
|
||||||
|
options = cdc.slice!(-1)
|
||||||
|
end
|
||||||
if cdc.empty?
|
if cdc.empty?
|
||||||
# Default D compiler search array.
|
# Default D compiler search array.
|
||||||
cdc = %w[gdc ldc2]
|
cdc = %w[gdc ldc2]
|
||||||
@ -105,7 +117,7 @@ module Rscons
|
|||||||
dc = cdc.find do |dc|
|
dc = cdc.find do |dc|
|
||||||
test_d_compiler(dc)
|
test_d_compiler(dc)
|
||||||
end
|
end
|
||||||
complete(dc ? 0 : 1, success_message: dc)
|
complete(dc ? 0 : 1, options.merge(success_message: dc))
|
||||||
end
|
end
|
||||||
|
|
||||||
# Check for a package or configure program output.
|
# Check for a package or configure program output.
|
||||||
@ -387,11 +399,15 @@ module Rscons
|
|||||||
else
|
else
|
||||||
!options[:set_define]
|
!options[:set_define]
|
||||||
end
|
end
|
||||||
|
color = should_fail ? :red : :yellow
|
||||||
|
Ansi.write($stdout, color, "#{fail_message}\n")
|
||||||
|
if options[:on_fail].is_a?(String)
|
||||||
|
$stdout.puts(options[:on_fail])
|
||||||
|
elsif options[:on_fail].is_a?(Proc)
|
||||||
|
options[:on_fail].call
|
||||||
|
end
|
||||||
if should_fail
|
if should_fail
|
||||||
Ansi.write($stdout, :red, "#{fail_message}\n")
|
|
||||||
raise ConfigureFailure.new
|
raise ConfigureFailure.new
|
||||||
else
|
|
||||||
Ansi.write($stdout, :yellow, "#{fail_message}\n")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -2222,6 +2222,16 @@ EOF
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "on_fail option" do
|
||||||
|
it "prints on_fail messages and calls on_fail procs on failure" do
|
||||||
|
test_dir "configure"
|
||||||
|
result = run_rscons(rsconscript: "on_fail.rb", op: %w[configure])
|
||||||
|
expect(result.status).to_not eq 0
|
||||||
|
expect(result.stdout).to match /Install the foo123 package/
|
||||||
|
expect(result.stdout).to match /Install the foo123cxx package/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "does everything" do
|
it "does everything" do
|
||||||
test_dir "configure"
|
test_dir "configure"
|
||||||
create_exe "pkg-config", "echo '-DMYPACKAGE'"
|
create_exe "pkg-config", "echo '-DMYPACKAGE'"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user