From cfe8b0c81ddf1d221e4e1c6bb41d7e4c50d59fad Mon Sep 17 00:00:00 2001 From: Rory OConnell <19547+RoryO@users.noreply.github.com> Date: Sat, 29 Aug 2020 17:19:32 -0700 Subject: Add methods for asking about compiler features --- lib/mruby/build/command.rb | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) 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 -- cgit v1.2.3