зеркало из https://github.com/github/ruby.git
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7901 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
983de47edc
Коммит
7a07ffe479
26
ChangeLog
26
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
|
||||
|
|
96
ext/extmk.rb
96
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
|
||||
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)
|
||||
ok = File.exist?(makefile)
|
||||
end
|
||||
rescue SystemExit
|
||||
# ignore
|
||||
ensure
|
||||
rm_f "conftest*"
|
||||
config = $0
|
||||
$0 = $PROGRAM_NAME
|
||||
Config::CONFIG["srcdir"] = $top_srcdir
|
||||
Config::CONFIG["topdir"] = topdir
|
||||
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)]
|
||||
end
|
||||
true
|
||||
end
|
||||
else
|
||||
File.exist?(makefile)
|
||||
end or open(makefile, "w") do |f|
|
||||
ok = yield(ok) if block_given?
|
||||
unless ok
|
||||
open(makefile, "w") do |f|
|
||||
f.print dummy_makefile($srcdir)
|
||||
end
|
||||
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
|
||||
end
|
||||
begin
|
||||
opts.parse!
|
||||
$optparser.parse!(ARGV)
|
||||
rescue OptionParser::InvalidOption => e
|
||||
retry if /^--/ =~ e.args[0]
|
||||
raise
|
||||
$optparser.warn(e)
|
||||
abort opts.to_s
|
||||
end
|
||||
end or abort opts.to_s
|
||||
|
||||
$destdir ||= ''
|
||||
|
||||
|
|
|
@ -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
|
||||
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
|
||||
end
|
||||
|
||||
if have_getaddrinfo
|
||||
$CPPFLAGS="-DHAVE_GETADDRINFO "+$CPPFLAGS
|
||||
else
|
||||
$CFLAGS="-I. "+$CFLAGS
|
||||
$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")
|
||||
|
|
|
@ -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
|
||||
|
|
195
lib/mkmf.rb
195
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,17 +904,19 @@ 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
|
||||
elsif !(srcs = $srcs)
|
||||
srcs = $objs.collect {|obj| obj.sub(/\.o\z/, '.c')}
|
||||
end
|
||||
for i in $objs
|
||||
i.sub!(/\.o\z/, ".#{$OBJEXT}")
|
||||
end
|
||||
end
|
||||
$objs = $objs.join(" ")
|
||||
|
||||
target = nil if $objs == ""
|
||||
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче