aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog26
-rw-r--r--ext/extmk.rb124
-rw-r--r--ext/socket/extconf.rb221
-rw-r--r--ext/tk/extconf.rb40
-rw-r--r--lib/mkmf.rb199
5 files changed, 301 insertions, 309 deletions
diff --git a/ChangeLog b/ChangeLog
index a306382875..a1b20d5bda 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+Sun Feb 6 23:51:30 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/extmk.rb (extract_makefile): extract previously collected
+ informations from existing Makefile.
+
+ * ext/socket/extconf.rb: check if getaddrinfo() works fine only when
+ wide-getaddrinfo option is not given. fixed: [ruby-dev:25422]
+
+ * ext/tk/extconf.rb: separate tkutil configuration.
+
+ * lib/mkmf.rb ($extmk): check if under ext directory.
+
+ * lib/mkmf.rb (Logging.postpone): allow recursive operation.
+
+ * lib/mkmf.rb (try_constant): make sure if really a constant, reduce
+ the number of times of compile.
+
+ * lib/mkmf.rb (have_macro, have_var, byte_order): new functions.
+
+ * lib/mkmf.rb (find_library): allow directory list with separators.
+
+ * lib/mkmf.rb (arg_config): manage provided configuration options.
+
+ * lib/mkmf.rb (dir_config): accept arrays of directory names as
+ default values.
+
Sun Feb 6 19:20:05 2005 NAKAMURA Usaku <usa@ruby-lang.org>
* eval.c (stack_extend): add prototype because VC++8 doesn't
diff --git a/ext/extmk.rb b/ext/extmk.rb
index 67fedc67d7..4e692209ee 100644
--- a/ext/extmk.rb
+++ b/ext/extmk.rb
@@ -17,6 +17,7 @@ alias $0 $progname
$extlist = []
$extupdate = false
+$compiled = {}
$:.replace ["."]
require 'rbconfig'
@@ -44,6 +45,36 @@ def relative_from(path, base)
end
end
+def extract_makefile(makefile, force = false)
+ m = File.read(makefile)
+ if !(target = m[/^TARGET[ \t]*=[ \t]*(\S*)/, 1])
+ return force
+ end
+ installrb = {}
+ m.scan(/^install-rb-default:[ \t]*(\S+)\n\1:[ \t]*(\S+)/) {installrb[$2] = $1}
+ oldrb = installrb.keys.sort
+ newrb = install_rb(nil, "").collect {|d, *f| f}.flatten.sort
+ unless (oldrb -= newrb).empty?
+ FileUtils.rm_f(oldrb.collect {|old| Config.expand(installrb[old])}, :verbose => true)
+ return false
+ end
+ if target_prefix = m[/^target_prefix[ \t]*=[ \t]*\/(.*)/, 1]
+ target = "#{target_prefix}/#{target}"
+ end
+ $target = target
+ /^STATIC_LIB[ \t]*=[ \t]*\S+/ =~ m or $static = nil
+ $preload = Shellwords.shellwords(m[/^preload[ \t]*=[ \t]*(.*)/, 1] || "")
+ $DLDFLAGS += " " + (m[/^DLDFLAGS[ \t]*=[ \t]*(.*)/, 1] || "")
+ if s = m[/^LIBS[ \t]*=[ \t]*(.*)/, 1]
+ s.sub!(/^#{Regexp.quote($LIBRUBYARG)} */, "")
+ s.sub!(/ *#{Regexp.quote($LIBS)}$/, "")
+ $libs = s
+ end
+ $LOCAL_LIBS = m[/^LOCAL_LIBS[ \t]*=[ \t]*(.*)/, 1] || ""
+ $LIBPATH = Shellwords.shellwords(m[/^libpath[ \t]*=[ \t]*(.*)/, 1] || "") - %w[$(libdir) $(topdir)]
+ true
+end
+
def extmake(target)
print "#{$message} #{target}\n"
$stdout.flush
@@ -57,8 +88,6 @@ def extmake(target)
return true if $nodynamic and not $static
end
- init_mkmf
-
FileUtils.mkpath target unless File.directory?(target)
begin
dir = Dir.pwd
@@ -73,18 +102,20 @@ def extmake(target)
$mdir = target
$srcdir = File.join($top_srcdir, "ext", $mdir)
$preload = nil
+ $compiled[target] = false
makefile = "./Makefile"
+ ok = File.exist?(makefile)
unless $ignore
- if !(t = modified?(makefile, MTIMES)) ||
- %W<#{$srcdir}/makefile.rb #{$srcdir}/extconf.rb
- #{$srcdir}/depend>.any? {|f| modified?(f, [t])}
- then
- $defs = []
- Logging::logfile 'mkmf.log'
- Config::CONFIG["srcdir"] = $srcdir
- Config::CONFIG["topdir"] = $topdir
- rm_f makefile
- begin
+ Config::CONFIG["srcdir"] = $srcdir
+ Config::CONFIG["topdir"] = $topdir
+ begin
+ if (!(ok &&= extract_makefile(makefile)) ||
+ !(t = modified?(makefile, MTIMES)) ||
+ %W"#{$srcdir}/makefile.rb #{$srcdir}/extconf.rb #{$srcdir}/depend".any? {|f| modified?(f, [t])})
+ then
+ init_mkmf
+ Logging::logfile 'mkmf.log'
+ rm_f makefile
if File.exist?($0 = "#{$srcdir}/makefile.rb")
load $0
elsif File.exist?($0 = "#{$srcdir}/extconf.rb")
@@ -93,40 +124,23 @@ def extmake(target)
create_makefile(target)
end
$extupdate = true
- File.exist?(makefile)
- rescue SystemExit
- # ignore
- ensure
- rm_f "conftest*"
- $0 = $PROGRAM_NAME
- Config::CONFIG["srcdir"] = $top_srcdir
- end
- else
- if $static
- m = File.read(makefile)
- if !($target = m[/^TARGET[ \t]*=[ \t]*(\S*)/, 1])
- $static = nil
- elsif target_prefix = m[/^target_prefix[ \t]*=[ \t]*\/(.*)/, 1]
- $target = "#{target_prefix}/#{$target}"
- end
- /^STATIC_LIB[ \t]*=[ \t]*\S+/ =~ m or $static = nil
- $preload = Shellwords.shellwords(m[/^preload[ \t]*=[ \t]*(.*)/, 1] || "")
- $DLDFLAGS += " " + (m[/^DLDFLAGS[ \t]*=[ \t]*(.*)/, 1] || "")
- if s = m[/^LIBS[ \t]*=[ \t]*(.*)/, 1]
- s.sub!(/^#{Regexp.quote($LIBRUBYARG)} */, "")
- s.sub!(/ *#{Regexp.quote($LIBS)}$/, "")
- $libs = s
- end
- $LOCAL_LIBS = m[/^LOCAL_LIBS[ \t]*=[ \t]*(.*)/, 1] || ""
- $LIBPATH = Shellwords.shellwords(m[/^libpath[ \t]*=[ \t]*(.*)/, 1] || "") -
- %w[$(libdir) $(topdir)]
+ ok = File.exist?(makefile)
end
- true
+ rescue SystemExit
+ # ignore
+ ensure
+ rm_f "conftest*"
+ config = $0
+ $0 = $PROGRAM_NAME
+ Config::CONFIG["srcdir"] = $top_srcdir
+ Config::CONFIG["topdir"] = topdir
+ end
+ end
+ ok = yield(ok) if block_given?
+ unless ok
+ open(makefile, "w") do |f|
+ f.print dummy_makefile($srcdir)
end
- else
- File.exist?(makefile)
- end or open(makefile, "w") do |f|
- f.print dummy_makefile($srcdir)
return true
end
args = sysquote($mflags)
@@ -137,6 +151,7 @@ def extmake(target)
unless system($make, *args)
$ignore or $continue or return false
end
+ $compiled[target] = true
if $clean and $clean != true
File.unlink(makefile) rescue nil
end
@@ -164,11 +179,15 @@ def extmake(target)
true
end
+def compiled?(target)
+ $compiled[target]
+end
+
def parse_args()
$mflags = []
opts = nil
- ARGV.options do |opts|
+ $optparser ||= OptionParser.new do |opts|
opts.on('-n') {$dryrun = true}
opts.on('--[no-]extension [EXTS]', Array) do |v|
$extension = (v == false ? [] : v)
@@ -200,13 +219,14 @@ def parse_args()
opts.on('--message [MESSAGE]', String) do |v|
$message = v
end
- begin
- opts.parse!
- rescue OptionParser::InvalidOption => e
- retry if /^--/ =~ e.args[0]
- raise
- end
- end or abort opts.to_s
+ end
+ begin
+ $optparser.parse!(ARGV)
+ rescue OptionParser::InvalidOption => e
+ retry if /^--/ =~ e.args[0]
+ $optparser.warn(e)
+ abort opts.to_s
+ end
$destdir ||= ''
diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb
index acbff10a16..7842899520 100644
--- a/ext/socket/extconf.rb
+++ b/ext/socket/extconf.rb
@@ -24,10 +24,18 @@ else
have_library("socket", "socket")
end
+unless $mswin or $bccwin or $mingw
+ headers = %w<sys/types.h netdb.h string.h sys/socket.h netinet/in.h>
+end
+if /solaris/ =~ RUBY_PLATFORM and !try_compile("")
+ # bug of gcc 3.0 on Solaris 8 ?
+ headers << "sys/feature_tests.h"
+end
+
$ipv6 = false
default_ipv6 = /cygwin/ !~ RUBY_PLATFORM
if enable_config("ipv6", default_ipv6)
- if try_link(<<EOF)
+ if checking_for("ipv6") {try_link(<<EOF)}
#include <sys/types.h>
#include <sys/socket.h>
main()
@@ -45,14 +53,10 @@ $ipv6lib = nil
$ipv6libdir = nil
$ipv6trylibc = nil
if $ipv6
- if macro_defined?("IPV6_INRIA_VERSION", <<EOF)
-#include <netinet/in.h>
-EOF
+ if have_macro("IPV6_INRIA_VERSION", "netinet/in.h")
$ipv6type = "inria"
$CPPFLAGS="-DINET6 "+$CPPFLAGS
- elsif macro_defined?("__KAME__", <<EOF)
-#include <netinet/in.h>
-EOF
+ elsif have_macro("__KAME__", "netinet/in.h")
$ipv6type = "kame"
$ipv6lib="inet6"
$ipv6libdir="/usr/local/v6/lib"
@@ -63,24 +67,18 @@ EOF
$ipv6lib="inet6"
$ipv6libdir="/usr/inet6/lib"
$CPPFLAGS="-DINET6 -I/usr/inet6/include "+$CPPFLAGS
- elsif macro_defined?("_TOSHIBA_INET6", <<EOF)
-#include <sys/param.h>
-EOF
+ elsif have_macro("_TOSHIBA_INET6", "sys/param.h")
$ipv6type = "toshiba"
$ipv6lib="inet6"
$ipv6libdir="/usr/local/v6/lib"
$CPPFLAGS="-DINET6 "+$CPPFLAGS
- elsif macro_defined?("__V6D__", <<EOF)
-#include </usr/local/v6/include/sys/v6config.h>
-EOF
+ elsif have_macro("__V6D__", "/usr/local/v6/include/sys/v6config.h")
$ipv6type = "v6d"
$ipv6lib="v6"
$ipv6libdir="/usr/local/v6/lib"
$CFLAGS="-I/usr/local/v6/include "+$CFLAGS
$CPPFLAGS="-DINET6 "+$CPPFLAGS
- elsif macro_defined?("_ZETA_MINAMI_INET6", <<EOF)
-#include <sys/param.h>
-EOF
+ elsif have_macro("_ZETA_MINAMI_INET6", "sys/param.h")
$ipv6type = "zeta"
$ipv6lib="inet6"
$ipv6libdir="/usr/local/v6/lib"
@@ -95,101 +93,28 @@ EOF
if File.directory? $ipv6libdir and File.exist? "#{$ipv6libdir}/lib#{$ipv6lib}.a"
$LOCAL_LIBS = " -L#$ipv6libdir -l#$ipv6lib"
elsif !$ipv6trylibc
- print <<EOS
-
+ abort <<EOS
Fatal: no #$ipv6lib library found. cannot continue.
You need to fetch lib#{$ipv6lib}.a from appropriate
ipv6 kit and compile beforehand.
EOS
- exit
end
end
end
- if try_link(<<EOF)
-#ifdef _WIN32
-# include <windows.h>
-# include <winsock.h>
-#else
-# include <sys/types.h>
-# include <netdb.h>
-# include <string.h>
-# include <sys/socket.h>
-# include <netinet/in.h>
-#endif
-int
-main()
-{
- struct sockaddr_in sin;
-
- sin.sin_len;
- return 0;
-}
-EOF
- $CFLAGS="-DHAVE_SIN_LEN "+$CFLAGS
+if have_struct_member("struct sockaddr_in", "sin_len", headers)
+ $defs[-1] = "-DHAVE_SIN_LEN"
end
- if try_link(<<EOF)
-#ifdef _WIN32
-# include <windows.h>
-# include <winsock.h>
-#else
-# include <sys/types.h>
-# include <netdb.h>
-# include <string.h>
-# include <sys/socket.h>
-#endif
-int
-main()
-{
- struct sockaddr_storage ss;
-
- ss.ss_family;
- return 0;
-}
-EOF
- $CPPFLAGS="-DHAVE_SOCKADDR_STORAGE "+$CPPFLAGS
-else # doug's fix, NOW add -Dss_family... only if required!
-$CPPFLAGS += " -Dss_family=__ss_family -Dss_len=__ss_len"
- if try_link(<<EOF)
-#ifdef _WIN32
-# include <windows.h>
-# include <winsock.h>
-#else
-# include <sys/types.h>
-# include <netdb.h>
-# include <string.h>
-# include <sys/socket.h>
-#endif
-int
-main()
-{
- struct sockaddr_storage ss;
-
- ss.ss_family;
- return 0;
-}
-EOF
- $CFLAGS="-DHAVE_SOCKADDR_STORAGE "+$CFLAGS
-end
+# doug's fix, NOW add -Dss_family... only if required!
+doug = proc {have_struct_member("struct sockaddr_storage", "ss_family", headers)}
+if doug[] or
+ with_cppflags($CPPFLAGS + " -Dss_family=__ss_family -Dss_len=__ss_len", &doug)
+ $defs[-1] = "-DHAVE_SOCKADDR_STORAGE"
end
- if try_link(<<EOF)
-#include <sys/types.h>
-#include <netdb.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-int
-main()
-{
- struct sockaddr sa;
-
- sa.sa_len;
- return 0;
-}
-EOF
- $CFLAGS="-DHAVE_SA_LEN "+$CFLAGS
+if have_struct_member("struct sockaddr", "sa_len", headers)
+ $defs[-1] = "-DHAVE_SA_LEN "
end
have_header("netinet/tcp.h") if not /cygwin/ =~ RUBY_PLATFORM # for cygwin 1.1.5
@@ -200,13 +125,17 @@ if have_func("sendmsg") | have_func("recvmsg")
have_struct_member('struct msghdr', 'msg_accrights', ['sys/types.h', 'sys/socket.h'])
end
-$getaddr_info_ok = false
-if !enable_config("wide-getaddrinfo", false) and try_run(<<EOF)
-#include <sys/types.h>
-#include <netdb.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
+getaddr_info_ok = enable_config("wide-getaddrinfo") do
+ checking_for("wide getaddrinfo") {try_run(<<EOF)}
+#{cpp_include(headers)}
+#include <stdlib.h>
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
@@ -282,79 +211,46 @@ main()
if (aitop)
freeaddrinfo(aitop);
- exit(0);
+ exit(EXIT_SUCCESS);
bad:
if (aitop)
freeaddrinfo(aitop);
- exit(1);
+ exit(EXIT_FAILURE);
}
EOF
- $getaddr_info_ok = true
end
-if $ipv6 and not $getaddr_info_ok
- print <<EOS
+if $ipv6 and not getaddr_info_ok
+ abort <<EOS
Fatal: --enable-ipv6 is specified, and your OS seems to support IPv6 feature.
But your getaddrinfo() and getnameinfo() are appeared to be broken. Sorry,
you cannot compile IPv6 socket classes with broken these functions.
You can try --enable-wide-getaddrinfo.
EOS
- exit
end
-
+
case with_config("lookup-order-hack", "UNSPEC")
when "INET"
- $CPPFLAGS="-DLOOKUP_ORDER_HACK_INET "+$CPPFLAGS
+ $defs << "-DLOOKUP_ORDER_HACK_INET"
when "INET6"
- $CPPFLAGS="-DLOOKUP_ORDER_HACK_INET6 "+$CPPFLAGS
+ $defs << "-DLOOKUP_ORDER_HACK_INET6"
when "UNSPEC"
# nothing special
else
- print <<EOS
+ abort <<EOS
Fatal: invalid value for --with-lookup-order-hack (expected INET, INET6 or UNSPEC)
EOS
- exit
end
$objs = ["socket.#{$OBJEXT}"]
-
-if $getaddr_info_ok and have_func("getaddrinfo", "netdb.h") and have_func("getnameinfo", "netdb.h")
- have_getaddrinfo = true
-else
- if try_link(<<EOF)
-#ifndef _WIN32
-# include <sys/types.h>
-# include <netdb.h>
-# include <string.h>
-# include <sys/socket.h>
-# include <netinet/in.h>
-#else
-# include <windows.h>
-# ifdef _WIN32_WCE
-# include <winsock.h>
-# else
-# include <winsock.h>
-# endif
-#endif
-int
-main()
-{
- struct in6_addr addr;
- unsigned char c;
- c = addr.s6_addr8;
- return 0;
-}
-EOF
- $CFLAGS="-DHAVE_ADDR8 "+$CFLAGS
- end
-end
-if have_getaddrinfo
- $CPPFLAGS="-DHAVE_GETADDRINFO "+$CPPFLAGS
-else
- $CFLAGS="-I. "+$CFLAGS
+unless getaddr_info_ok and have_func("getnameinfo", "netdb.h") and have_func("getaddrinfo", "netdb.h")
+ if have_struct_member("struct in6_addr", "s6_addr8", headers)
+ $defs[-1] = "-DHAVE_ADDR8"
+ end
+ $CPPFLAGS="-I. "+$CPPFLAGS
$objs += ["getaddrinfo.#{$OBJEXT}"]
$objs += ["getnameinfo.#{$OBJEXT}"]
have_func("inet_ntop") or have_func("inet_ntoa")
@@ -365,20 +261,8 @@ else
have_header("resolv.h")
end
-if !try_link(<<EOF)
-#include <sys/types.h>
-#include <netdb.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-int
-main()
-{
- socklen_t len;
- return 0;
-}
-EOF
- $CFLAGS="-Dsocklen_t=int "+$CFLAGS
+unless have_type("socklen_t", headers)
+ $defs << "-Dsocklen_t=int"
end
have_header("sys/un.h")
@@ -387,14 +271,15 @@ have_header("sys/uio.h")
if have_func(test_func)
have_func("hsterror")
have_func("getipnodebyname") or have_func("gethostbyname2")
+ have_func("socketpair")
unless have_func("gethostname")
have_func("uname")
end
if enable_config("socks", ENV["SOCKS_SERVER"])
if have_library("socks5", "SOCKSinit")
- $CFLAGS+=" -DSOCKS5 -DSOCKS"
+ $defs << "-DSOCKS5" << "-DSOCKS"
elsif have_library("socks", "Rconnect")
- $CFLAGS+=" -DSOCKS"
+ $defs << "-DSOCKS"
end
end
create_makefile("socket")
diff --git a/ext/tk/extconf.rb b/ext/tk/extconf.rb
index a677ea3a7c..30dd11ab86 100644
--- a/ext/tk/extconf.rb
+++ b/ext/tk/extconf.rb
@@ -265,52 +265,14 @@ if mac_need_framework ||
$LDFLAGS += ' -framework Tk -framework Tcl'
end
-
if stubs or pthread_check
# create Makefile
- # backup
- if $INSTALLFILES
- installfiles_bup = $INSTALLFILES.dup
- else
- installfiles_bup = nil
- $INSTALLFILES = []
- end
-
# for SUPPORT_STATUS
+ $INSTALLFILES ||= []
$INSTALLFILES << ["lib/tkextlib/SUPPORT_STATUS", "$(RUBYLIBDIR)", "lib"]
# create
create_makefile("tcltklib")
-
- # reset
- $INSTALLFILES = installfiles_bup
-
- # add rules for tkutil
- File::open('Makefile', 'a'){|mfile|
- File::open('make-tkutil', 'r'){|dfile|
- mfile.print "\n###\n"
- while line = dfile.gets()
- mfile.print line
- end
- }
- }
-
- # create tkutil/Makefile
- Dir.chdir 'tkutil'
- if $extout || $extmk
- $srcdir = '../' << $srcdir << '/tkutil'
- $topdir = '../' << $topdir
- $hdrdir = '../' << $hdrdir
- $objs = nil
- $defs = []
- Config::CONFIG["srcdir"] = $srcdir
- else
- puts "entering directory `tkutil'"
- end
- rm_f './Makefile'
- init_mkmf
- load 'subconf.rb'
- Dir.chdir '..'
end
end
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index 2c364a0161..ce88760230 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -79,11 +79,12 @@ def map_dir(dir, map = nil)
map.inject(dir) {|dir, (orig, new)| dir.gsub(orig, new)}
end
-libdir = File.dirname(__FILE__)
-$extmk = libdir != Config::CONFIG["rubylibdir"]
+topdir = File.dirname(libdir = File.dirname(__FILE__))
+extdir = File.expand_path("ext", topdir)
+$extmk = File.expand_path($0)[0, extdir.size+1] == extdir+"/"
if not $extmk and File.exist?(Config::CONFIG["archdir"] + "/ruby.h")
$hdrdir = $topdir = Config::CONFIG["archdir"]
-elsif File.exist?(($top_srcdir ||= File.dirname(libdir)) + "/ruby.h") and
+elsif File.exist?(($top_srcdir ||= topdir) + "/ruby.h") and
File.exist?(($topdir ||= Config::CONFIG["topdir"]) + "/config.h")
$hdrdir = $top_srcdir
else
@@ -137,6 +138,7 @@ module Logging
@logfile = 'mkmf.log'
@orgerr = $stderr.dup
@orgout = $stdout.dup
+ @postpone = 0
def self::open
@log ||= File::open(@logfile, 'w')
@@ -165,7 +167,7 @@ module Logging
end
def self::postpone
- tmplog = "mkmftmp.log"
+ tmplog = "mkmftmp#{@postpone += 1}.log"
open do
log, *save = @log, @logfile, @orgout, @orgerr
@log, @logfile, @orgout, @orgerr = nil, tmplog, log, log
@@ -175,6 +177,7 @@ module Logging
File::open(tmplog) {|t| FileUtils.copy_stream(t, log)}
ensure
@log, @logfile, @orgout, @orgerr = log, *save
+ @postpone -= 1
rm_f tmplog
end
end
@@ -288,54 +291,82 @@ def cpp_include(header)
end
end
+def with_cppflags(flags)
+ cppflags = $CPPFLAGS
+ $CPPFLAGS = flags
+ return yield
+ensure
+ $CPPFLAGS = cppflags
+end
+
+def with_cflags(flags)
+ cflags = $CFLAGS
+ $CFLAGS = flags
+ return yield
+ensure
+ $CFLAGS = cflags
+end
+
+def with_ldflags(flags)
+ ldflags = $LDFLAGS
+ $LDFLAGS = flags
+ return yield
+ensure
+ $LDFLAGS = ldflags
+end
+
def try_static_assert(expr, headers = nil, opt = "", &b)
headers = cpp_include(headers)
try_compile(<<SRC, opt, &b)
#{COMMON_HEADERS}
#{headers}
/*top*/
-int tmp[(#{expr}) ? 1 : -1];
+int conftest_const[(#{expr}) ? 1 : -1];
SRC
end
def try_constant(const, headers = nil, opt = "", &b)
- headers = cpp_include(headers)
+ includes = cpp_include(headers)
if CROSS_COMPILING
- unless try_compile(<<"SRC", opt, &b)
-#{COMMON_HEADERS}
-#{headers}
-/*top*/
-int tmp = #{const};
-SRC
- return nil
- end
- if try_static_assert("#{const} < 0", headers, opt)
+ if try_static_assert("#{const} > 0", headers, opt)
+ # positive constant
+ elsif try_static_assert("#{const} < 0", headers, opt)
neg = true
const = "-(#{const})"
elsif try_static_assert("#{const} == 0", headers, opt)
return 0
+ else
+ # not a constant
+ return nil
end
upper = 1
- until try_static_assert("#{const} < #{upper}", headers, opt)
+ until try_static_assert("#{const} <= #{upper}", headers, opt)
lower = upper
upper <<= 1
end
return nil unless lower
- until try_static_assert("#{const} == #{upper}", headers, opt)
- if try_static_assert("#{const} > #{(upper+lower)/2}", headers, opt)
- lower = (upper+lower)/2
+ while upper > lower + 1
+ mid = (upper + lower) / 2
+ if try_static_assert("#{const} > #{mid}", headers, opt)
+ lower = mid
else
- upper = (upper+lower)/2
+ upper = mid
+ end
+ end
+ unless upper == lower
+ if try_static_assert("#{const} == #{lower}", headers, opt)
+ upper = lower
end
end
upper = -upper if neg
return upper
else
src = %{#{COMMON_HEADERS}
-#{headers}
+#{includes}
#include <stdio.h>
/*top*/
-int main() {printf("%d\\n", (int)(#{const})); return 0;}
+int conftest_const = (int)(#{const});
+int main() {printf("%d\\n", conftest_const); return 0;}
}
if try_link0(src, opt, &b)
xpopen("./conftest") do |f|
@@ -362,6 +393,17 @@ int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; }
SRC
end
+def try_var(var, headers = nil, &b)
+ headers = cpp_include(headers)
+ try_compile(<<"SRC", &b)
+#{COMMON_HEADERS}
+#{headers}
+/*top*/
+int main() { return 0; }
+int t() { void *volatile p; p = (void *)&#{var}; return 0; }
+SRC
+end
+
def egrep_cpp(pat, src, opt = "", &b)
src = create_tmpsrc(src, &b)
xpopen(cpp_command('', opt)) do |f|
@@ -460,14 +502,14 @@ def message(*s)
end
end
-def checking_for(m)
+def checking_for(m, fmt = nil)
f = caller[0][/in `(.*)'$/, 1] and f << ": " #` for vim
m = "checking for #{m}... "
message "%s", m
a = r = nil
Logging::postpone do
r = yield
- a = r ? "yes\n" : "no\n"
+ a = (fmt ? fmt % r : r ? "yes" : "no") << "\n"
"#{f}#{m}-------------------- #{a}\n"
end
message(a)
@@ -475,6 +517,14 @@ def checking_for(m)
r
end
+def have_macro(macro, headers = nil, opt = "", &b)
+ m = "#{macro}"
+ m << " in #{headers.inspect}" if headers
+ checking_for m do
+ macro_defined?(macro, cpp_include(headers), opt, &b)
+ end
+end
+
def have_library(lib, func = nil, header=nil, &b)
func = "main" if !func or func.empty?
lib = with_config(lib+'lib', lib)
@@ -496,6 +546,7 @@ end
def find_library(lib, func, *paths, &b)
func = "main" if !func or func.empty?
lib = with_config(lib+'lib', lib)
+ paths = paths.collect {|path| path.split(File::PATH_SEPARATOR)}.flatten
checking_for "#{func}() in #{LIBARG%lib}" do
libpath = $LIBPATH
libs = append_library($libs, lib)
@@ -525,6 +576,19 @@ def have_func(func, headers = nil, &b)
end
end
+def have_var(var, headers = nil, &b)
+ checking_for "#{var}" do
+ libs = append_library($libs, libs)
+ if try_var(var, headers, &b)
+ $libs = libs
+ $defs.push(format("-DHAVE_%s", var.upcase))
+ true
+ else
+ false
+ end
+ end
+end
+
def have_header(header, &b)
checking_for header do
if try_cpp(cpp_include(header), &b)
@@ -624,24 +688,28 @@ def find_executable(bin, path = nil)
end
end
-def arg_config(config, default=nil)
- $configure_args.fetch(config.tr('_', '-'), default)
+def arg_config(config, *defaults, &block)
+ $arg_config << [config, *defaults]
+ defaults << nil if !block and defaults.empty?
+ $configure_args.fetch(config.tr('_', '-'), *defaults, &block)
end
-def with_config(config, default=nil)
+def with_config(config, *defaults, &block)
unless /^--with[-_]/ =~ config
config = '--with-' + config
end
- arg_config(config, default)
+ arg_config(config, *defaults, &block)
end
-def enable_config(config, default=nil)
+def enable_config(config, *defaults)
if arg_config("--enable-"+config)
true
elsif arg_config("--disable-"+config)
false
+ elsif block_given?
+ yield(config, *defaults)
else
- default
+ return *defaults
end
end
@@ -666,15 +734,16 @@ end
def dir_config(target, idefault=nil, ldefault=nil)
if dir = with_config(target + "-dir", (idefault unless ldefault))
- defaults = dir.split(File::PATH_SEPARATOR)
+ defaults = Array === dir ? dir : dir.split(File::PATH_SEPARATOR)
idefault = ldefault = nil
end
idir = with_config(target + "-include", idefault)
+ $arg_config.last[1] ||= "${#{target}-dir}/include"
ldir = with_config(target + "-lib", ldefault)
+ $arg_config.last[1] ||= "${#{target}-dir}/lib"
-# idirs = idir ? idir.split(File::PATH_SEPARATOR) : []
- idirs = idir.split(File::PATH_SEPARATOR) rescue []
+ idirs = idir ? Array === idir ? idir : idir.split(File::PATH_SEPARATOR) : []
if defaults
idirs.concat(defaults.collect {|dir| dir + "/include"})
idir = ([idir] + idirs).compact.join(File::PATH_SEPARATOR)
@@ -687,7 +756,7 @@ def dir_config(target, idefault=nil, ldefault=nil)
end
end
- ldirs = ldir ? ldir.split(File::PATH_SEPARATOR) : []
+ ldirs = ldir ? Array === ldir ? ldir : ldir.split(File::PATH_SEPARATOR) : []
if defaults
ldirs.concat(defaults.collect {|dir| dir + "/lib"})
ldir = ([ldir] + ldirs).compact.join(File::PATH_SEPARATOR)
@@ -789,6 +858,7 @@ COPY = $(RUBY) -run -e cp -- -v
#### End of system configuration section. ####
+preload = #{$preload.join(" ") if $preload}
}
if $nmake == ?b
mk.each do |x|
@@ -834,16 +904,18 @@ def create_makefile(target, srcprefix = nil)
srcprefix ||= '$(srcdir)'
Config::expand(srcdir = srcprefix.dup)
- unless $objs then
+ if not $objs
$objs = []
- for f in Dir[File.join(srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
- obj = File.basename(f, ".*") << "." << $OBJEXT
+ srcs = Dir[File.join(srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
+ for f in srcs
+ obj = File.basename(f, ".*") << ".o"
$objs.push(obj) unless $objs.index(obj)
end
- else
- for i in $objs
- i.sub!(/\.o\z/, ".#{$OBJEXT}")
- end
+ elsif !(srcs = $srcs)
+ srcs = $objs.collect {|obj| obj.sub(/\.o\z/, '.c')}
+ end
+ for i in $objs
+ i.sub!(/\.o\z/, ".#{$OBJEXT}")
end
$objs = $objs.join(" ")
@@ -872,7 +944,6 @@ def create_makefile(target, srcprefix = nil)
mfile = open("Makefile", "wb")
mfile.print configuration(srcdir)
mfile.print %{
-preload = #{$preload.join(" ") if $preload}
libpath = #{$LIBPATH.join(" ")}
LIBPATH = #{libpath}
DEFFILE = #{deffile}
@@ -885,6 +956,7 @@ extout_prefix = #{$extout_prefix}
target_prefix = #{target_prefix}
LOCAL_LIBS = #{$LOCAL_LIBS}
LIBS = #{$LIBRUBYARG} #{$libs} #{$LIBS}
+SRCS = #{srcs.collect(&File.method(:basename)).join(' ')}
OBJS = #{$objs}
TARGET = #{target}
DLLIB = #{dllib}
@@ -911,6 +983,7 @@ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
end
n = ($extout ? '$(RUBYARCHDIR)/' : '') + '$(TARGET).'
mfile.print %{
+TARGET_SO = #{($extout ? '$(RUBYARCHDIR)/' : '')}$(DLLIB)
CLEANLIBS = #{n}#{CONFIG['DLEXT']} #{n}il? #{n}tds #{n}map
CLEANOBJS = *.#{$OBJEXT} *.#{$LIBEXT} *.s[ol] *.pdb *.exp *.bak
@@ -931,17 +1004,18 @@ static: $(STATIC_LIB)#{$extout ? " install-rb" : ""}
end
end
dirs << (dir = "$(RUBYLIBDIR)")
- mfile.print("install-rb: #{dir}\n")
- for i in [[["lib/**/*.rb", "$(RUBYLIBDIR)", "lib"]], $INSTALLFILES]
+ mfile.print("install-rb: install-rb-default\n")
+ mfile.print("install-rb-default: #{dir}\n")
+ for sfx, i in [["-default", [["lib/**/*.rb", "$(RUBYLIBDIR)", "lib"]]], ["", $INSTALLFILES]]
files = install_files(mfile, i, nil, srcprefix) or next
for dir, *files in files
unless dirs.include?(dir)
dirs << dir
- mfile.print "install-rb: #{dir}\n"
+ mfile.print "install-rb#{sfx}: #{dir}\n"
end
files.each do |f|
dest = "#{dir}/#{File.basename(f)}"
- mfile.print("install-rb: #{dest}\n")
+ mfile.print("install-rb#{sfx}: #{dest}\n")
mfile.print("#{dest}: #{f}\n\t@$(#{$extout ? 'COPY' : 'INSTALL_DATA'}) #{f} #{dir}\n")
end
end
@@ -978,7 +1052,7 @@ site-install-rb: install-rb
mfile.print "$(RUBYARCHDIR)/" if $extout
mfile.print "$(DLLIB): ", (makedef ? "$(DEFFILE) " : ""), "$(OBJS)\n\t"
mfile.print "@-$(RM) $@\n\t"
- mfile.print "@-$(MAKEDIRS) $(@D)\n\t"
+ mfile.print "@-$(MAKEDIRS) $(@D)\n\t" if $extout
mfile.print LINK_SO, "\n\n"
unless $static.nil?
mfile.print "$(STATIC_LIB): $(OBJS)\n\t"
@@ -1008,11 +1082,15 @@ site-install-rb: install-rb
vpath = ($nmake ? "{$(hdrdir)}" : "")
mfile.print "$(OBJS): #{vpath}ruby.h #{vpath}defines.h #{$config_h}\n"
end
+
+ $makefile_created = true
ensure
mfile.close if mfile
end
def init_mkmf(config = CONFIG)
+ $makefile_created = false
+ $arg_config = []
$enable_shared = config['ENABLE_SHARED'] == 'yes'
$defs = []
$CFLAGS = with_config("cflags", arg_config("CFLAGS", config["CFLAGS"])).dup
@@ -1044,9 +1122,25 @@ def init_mkmf(config = CONFIG)
$extout ||= nil
$extout_prefix ||= nil
+ $arg_config.clear
dir_config("opt")
end
+FailedMassage = <<MESSAGE
+Could not create Makefile due to some reason, probably lack of
+necessary libraries and/or headers. Check the mkmf.log file for more
+details. You may need configuration options.
+
+Provided configuration options:
+MESSAGE
+
+def mkmf_failed(path)
+ unless $makefile_created
+ opts = $arg_config.collect {|t, n| "\t#{t}#{"=#{n}" if n}\n"}
+ abort "*** #{path} failed ***\n" + FailedMassage + opts.join
+ end
+end
+
init_mkmf
$make = with_config("make-prog", ENV["MAKE"] || "make")
@@ -1105,13 +1199,18 @@ LIBPATHFLAG = config_string('LIBPATHFLAG') || ' -L"%s"'
RPATHFLAG = config_string('RPATHFLAG') || ''
LIBARG = config_string('LIBARG') || '-l%s'
+sep = File::ALT_SEPARATOR ? ":/=#{File::ALT_SEPARATOR}" : ''
CLEANINGS = "
clean:
- @$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
+ @-$(RM) $(CLEANLIBS#{sep}) $(CLEANOBJS#{sep}) $(CLEANFILES#{sep})
distclean: clean
- @$(RM) Makefile extconf.h conftest.* mkmf.log
- @$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
+ @-$(RM) Makefile extconf.h conftest.* mkmf.log
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES#{sep})
realclean: distclean
"
+
+if not $extmk and /\A(extconf|makefile).rb\z/ =~ File.basename($0)
+ END {mkmf_failed($0)}
+end