summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-07-08 16:56:32 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-07-08 18:18:35 +0900
commit524513be399e81bb170ec88aa0d501f33cbde8c3 (patch)
tree3fc823c15917e56fd3e568423368635ccbc7fd43
parentd6cf4c0c997752c9e23876a8d5c205737317a6e3 (diff)
mkmf.rb: try linking at try_var
To check for variables accessible but not declared.
-rw-r--r--lib/mkmf.rb10
-rw-r--r--test/mkmf/test_have_var.rb17
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index 3a84aba370..04b5f26a5e 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -812,13 +812,21 @@ SRC
# You should use +have_var+ rather than +try_var+.
def try_var(var, headers = nil, opt = "", &b)
headers = cpp_include(headers)
- try_compile(<<"SRC", opt, &b)
+ try_compile(<<"SRC", opt, &b) or
#{headers}
/*top*/
extern int t(void);
#{MAIN_DOES_NOTHING 't'}
int t(void) { const volatile void *volatile p; p = &(&#{var})[0]; return !p; }
SRC
+ try_link(<<"SRC", opt, &b)
+#{headers}
+/*top*/
+extern int t(void);
+#{MAIN_DOES_NOTHING 't'}
+extern int #{var};
+int t(void) { const volatile void *volatile p; p = &(&#{var})[0]; return !p; }
+SRC
end
# Returns whether or not the +src+ can be preprocessed with the C
diff --git a/test/mkmf/test_have_var.rb b/test/mkmf/test_have_var.rb
new file mode 100644
index 0000000000..5367ec2248
--- /dev/null
+++ b/test/mkmf/test_have_var.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: false
+require_relative 'base'
+require 'tempfile'
+
+class TestMkmf
+ class TestHaveVar < TestMkmf
+ def test_have_var
+ assert_equal(true, have_var("ruby_version"), MKMFLOG)
+ assert_include($defs, '-DHAVE_RUBY_VERSION')
+ end
+
+ def test_not_have_var
+ assert_equal(false, have_var("rb_vm_something_flag"), MKMFLOG)
+ assert_not_include($defs, '-DHAVE_RB_VM_SOMETHING_FLAG')
+ end
+ end
+end