stdlib_libraries/configure_checks_no_parens.rb

tests/_examples/stdlib_libraries/configure_checks_no_parens.rb in the metorex repository.

# mkmf's checks compile a small program to learn whether a header, library,
# function, variable, type, macro or constant is there, print what they
# checked for, and record what they found for the Makefile to carry.
# `ruby -run -e mkmf` runs them from the command line.
require "mkmf"
require "tmpdir"
require "rbconfig"

Dir.mktmpdir do |root|
  Dir.chdir root do
    p have_header("stdio.h")
    p have_header("no_such_header.h")
    p have_library("m", "sqrt")
    p have_library("no_such_library_xyz", "nothing")
    p have_func("printf", "stdio.h")
    p have_func("no_such_function_xyz")
    p have_func("strlen", ["stdio.h", "string.h"])
    p have_var("errno", "errno.h")
    p have_var("no_such_variable_xyz", "stdio.h")
    p have_type("size_t", "stddef.h")
    p have_type("struct no_such_type", "stdio.h")
    p have_macro("EOF", "stdio.h")
    p have_macro("NO_SUCH_MACRO_XYZ", "stdio.h")
    p have_const("EOF", "stdio.h")
    p have_const("NO_SUCH_CONST_XYZ", "stdio.h")
    p dir_config("probe_lib")
    p dir_config("other", "/def/inc", "/def/lib")
    p $defs
    p $libs
    p $CPPFLAGS.split.grep(/\A-I/), $LIBPATH
    p "my-lib.h".tr_cpp, "foo".funcall_style, "foo(1)".sans_arguments
    File.write "probe.c", "#include \"ruby.h\"\nvoid Init_probe(void) {}\n"
    create_makefile "probe"
    p File.read("Makefile").scan(/-DHAVE_\w+|-lm\b/).uniq.sort

    File.delete "Makefile"
    read, write = IO.pipe
    child = spawn RbConfig.ruby, "-run", "-e", "mkmf", "--", "-h", "stdio.h:no_such.h", "-l", "m,sqrt",
                  "-f", "printf,stdio.h", "-t", "size_t,stddef.h", "-c", "EOF,stdio.h", "probe",
                  out: write, err: write
    write.close
    puts read.read
    Process.wait child
    p File.read("Makefile").scan(/-DHAVE_\w+|-lm\b/).uniq.sort
  end
end

Output:

checking for stdio.h... yes
true
checking for no_such_header.h... no
false
checking for sqrt() in -lm... yes
true
checking for nothing() in -lno_such_library_xyz... no
false
checking for printf() in stdio.h... yes
true
checking for no_such_function_xyz()... no
false
checking for strlen() in stdio.h,string.h... yes
true
checking for errno in errno.h... yes
true
checking for no_such_variable_xyz in stdio.h... no
false
checking for size_t in stddef.h... yes
true
checking for struct no_such_type in stdio.h... no
false
checking for EOF in stdio.h... yes
true
checking for NO_SUCH_MACRO_XYZ in stdio.h... no
false
checking for EOF in stdio.h... yes
true
checking for NO_SUCH_CONST_XYZ in stdio.h... no
false
[nil, nil]
["/def/inc", "/def/lib"]
["-DHAVE_STDIO_H", "-DHAVE_PRINTF", "-DHAVE_STRLEN", "-DHAVE_ERRNO", "-DHAVE_TYPE_SIZE_T", "-DHAVE_CONST_EOF"]
"-lm "
["-I/def/inc"]
["/def/lib"]
"MY_LIB_H"
"foo()"
"foo"
creating Makefile
["-DHAVE_CONST_EOF", "-DHAVE_ERRNO", "-DHAVE_PRINTF", "-DHAVE_STDIO_H", "-DHAVE_STRLEN", "-DHAVE_TYPE_SIZE_T", "-lm"]
checking for stdio.h... yes
checking for no_such.h... no
checking for sqrt() in -lm... yes
checking for printf() in stdio.h... yes
checking for size_t in stddef.h... yes
checking for EOF in stdio.h... yes
creating Makefile
["-DHAVE_CONST_EOF", "-DHAVE_PRINTF", "-DHAVE_STDIO_H", "-DHAVE_TYPE_SIZE_T", "-lm"]