diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/mruby/build/command.rb | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 39981cc32..80c01b38f 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -1,4 +1,5 @@ require 'forwardable' +require 'tempfile' module MRuby class Command @@ -126,6 +127,31 @@ module MRuby end end + def compiles?(source_text) + infile = Tempfile.new ['', '.c'] + infile.write source_text + infile.close + cwd = Dir.pwd + is_success = false + # Change to a tmp dir when compiling so we don't litter compiler artifacts + Dir.mktmpdir do |tmpdir| + Dir.chdir tmpdir + sh(command, infile.path, verbose: false) { |retval, _| is_success = retval } + end + infile.delete + Dir.chdir cwd + + return is_success + end + + def has_header?(header_name) + compiles? test_code_template header: header_name + end + + def has_function?(function_name, with_header: nil) + compiles? test_code_template function: function_name, header: with_header + end + private # @@ -165,6 +191,46 @@ module MRuby end.flatten.uniq deps << MRUBY_CONFIG end + + def test_code_template(function: nil, header: nil) + preamble = '' + body = '' + + if header + preamble += <<-TEMPLATE +#if defined __has_include +#if !__has_include("#{header}") +#error "Header #{header} not found" +#endif +#endif +#include <#{header}> + TEMPLATE + end + + if function + preamble += <<-TEMPLATE +#if defined __stub_#{function} || defined __stub___#{function} +#{function} unavailable +#endif + TEMPLATE + + # This is how autoconf works when using a function prototype. + body += <<-TEMPLATE + void *a = (void*) &#{function}; + long long b = (long long) a; + return (int) b; + TEMPLATE + else + body = 'return 0;' + end + + <<-TEMPLATE +#{preamble} +int main(void) {{ +#{body} +}} + TEMPLATE + end end class Command::Linker < Command |
