mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/extconf.rb: check if getaddrinfo() works fine only when
wide-getaddrinfo option is not given. fixed: [ruby-dev:25422] * 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/branches/ruby_1_8@7900 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
840f61ba54
commit
251d1d8bde
3 changed files with 203 additions and 202 deletions
27
ChangeLog
27
ChangeLog
|
@ -1,3 +1,24 @@
|
||||||
|
Sun Feb 6 23:50:36 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/socket/extconf.rb: check if getaddrinfo() works fine only when
|
||||||
|
wide-getaddrinfo option is not given. fixed: [ruby-dev:25422]
|
||||||
|
|
||||||
|
* 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:23:01 2005 NAKAMURA Usaku <usa@ruby-lang.org>
|
Sun Feb 6 19:23:01 2005 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (stack_extend): add prototype because VC++8 doesn't
|
* eval.c (stack_extend): add prototype because VC++8 doesn't
|
||||||
|
@ -21,10 +42,10 @@ Sun Feb 6 12:20:11 2005 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
Sun Feb 6 03:24:20 2005 Tanaka Akira <akr@m17n.org>
|
Sun Feb 6 03:24:20 2005 Tanaka Akira <akr@m17n.org>
|
||||||
|
|
||||||
* lib/resolv.rb (Resolv::DNS::Resource::TXT): multiple strings was not
|
* lib/resolv.rb (Resolv::DNS::Resource::TXT): multiple strings was not
|
||||||
handled.
|
handled.
|
||||||
(Resolv::DNS::Resource::TXT#strings): new method to return all
|
(Resolv::DNS::Resource::TXT#strings): new method to return all
|
||||||
strings.
|
strings.
|
||||||
(Resolv::DNS::Message::MessageEncoder#put_string_list): new method.
|
(Resolv::DNS::Message::MessageEncoder#put_string_list): new method.
|
||||||
(Resolv::DNS::Message::MessageDecoder#get_string_list): ditto.
|
(Resolv::DNS::Message::MessageDecoder#get_string_list): ditto.
|
||||||
based on [ruby-talk:129732] by Sam Roberts.
|
based on [ruby-talk:129732] by Sam Roberts.
|
||||||
|
|
|
@ -24,10 +24,18 @@ else
|
||||||
have_library("socket", "socket")
|
have_library("socket", "socket")
|
||||||
end
|
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
|
$ipv6 = false
|
||||||
default_ipv6 = /cygwin/ !~ RUBY_PLATFORM
|
default_ipv6 = /cygwin/ !~ RUBY_PLATFORM
|
||||||
if enable_config("ipv6", default_ipv6)
|
if enable_config("ipv6", default_ipv6)
|
||||||
if try_link(<<EOF)
|
if checking_for("ipv6") {try_link(<<EOF)}
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
main()
|
main()
|
||||||
|
@ -105,90 +113,26 @@ EOS
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if try_link(<<EOF)
|
if have_struct_member("struct sockaddr_in", "sin_len", headers)
|
||||||
#ifdef _WIN32
|
$defs[-1] = "-DHAVE_SIN_LEN"
|
||||||
# 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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if try_link(<<EOF)
|
# doug's fix, NOW add -Dss_family... only if required!
|
||||||
#ifdef _WIN32
|
[nil, " -Dss_family=__ss_family -Dss_len=__ss_len"].each do |flags|
|
||||||
# include <windows.h>
|
if flags
|
||||||
# include <winsock.h>
|
cppflags = $CPPFLAGS
|
||||||
#else
|
$CPPFLAGS += flags
|
||||||
# include <sys/types.h>
|
end
|
||||||
# include <netdb.h>
|
if have_struct_member("struct sockaddr_storage", "ss_family", headers)
|
||||||
# include <string.h>
|
$defs[-1] = "-DHAVE_SOCKADDR_STORAGE"
|
||||||
# include <sys/socket.h>
|
break
|
||||||
#endif
|
elsif flags
|
||||||
int
|
$CPPFLAGS = cppflags
|
||||||
main()
|
end
|
||||||
{
|
|
||||||
struct sockaddr_storage ss;
|
|
||||||
|
|
||||||
ss.ss_family;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
$CFLAGS="-DHAVE_SOCKADDR_STORAGE "+$CFLAGS
|
|
||||||
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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if try_link(<<EOF)
|
if have_struct_member("struct sockaddr", "sa_len", headers)
|
||||||
#include <sys/types.h>
|
$defs[-1] = "-DHAVE_SA_LEN "
|
||||||
#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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
have_header("netinet/tcp.h") if not /cygwin/ =~ RUBY_PLATFORM # for cygwin 1.1.5
|
have_header("netinet/tcp.h") if not /cygwin/ =~ RUBY_PLATFORM # for cygwin 1.1.5
|
||||||
|
@ -199,13 +143,17 @@ if have_func("sendmsg") | have_func("recvmsg")
|
||||||
have_struct_member('struct msghdr', 'msg_accrights', ['sys/types.h', 'sys/socket.h'])
|
have_struct_member('struct msghdr', 'msg_accrights', ['sys/types.h', 'sys/socket.h'])
|
||||||
end
|
end
|
||||||
|
|
||||||
$getaddr_info_ok = false
|
getaddr_info_ok = enable_config("wide-getaddrinfo") do
|
||||||
if !enable_config("wide-getaddrinfo", false) and try_run(<<EOF)
|
checking_for("wide getaddrinfo") {try_run(<<EOF)}
|
||||||
#include <sys/types.h>
|
#{cpp_include(headers)}
|
||||||
#include <netdb.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
|
||||||
#include <sys/socket.h>
|
#ifndef EXIT_SUCCESS
|
||||||
#include <netinet/in.h>
|
#define EXIT_SUCCESS 0
|
||||||
|
#endif
|
||||||
|
#ifndef EXIT_FAILURE
|
||||||
|
#define EXIT_FAILURE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef AF_LOCAL
|
#ifndef AF_LOCAL
|
||||||
#define AF_LOCAL AF_UNIX
|
#define AF_LOCAL AF_UNIX
|
||||||
|
@ -281,79 +229,46 @@ main()
|
||||||
|
|
||||||
if (aitop)
|
if (aitop)
|
||||||
freeaddrinfo(aitop);
|
freeaddrinfo(aitop);
|
||||||
exit(0);
|
exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
if (aitop)
|
if (aitop)
|
||||||
freeaddrinfo(aitop);
|
freeaddrinfo(aitop);
|
||||||
exit(1);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
$getaddr_info_ok = true
|
|
||||||
end
|
end
|
||||||
if $ipv6 and not $getaddr_info_ok
|
if $ipv6 and not getaddr_info_ok
|
||||||
print <<EOS
|
abort <<EOS
|
||||||
|
|
||||||
Fatal: --enable-ipv6 is specified, and your OS seems to support IPv6 feature.
|
Fatal: --enable-ipv6 is specified, and your OS seems to support IPv6 feature.
|
||||||
But your getaddrinfo() and getnameinfo() are appeared to be broken. Sorry,
|
But your getaddrinfo() and getnameinfo() are appeared to be broken. Sorry,
|
||||||
you cannot compile IPv6 socket classes with broken these functions.
|
you cannot compile IPv6 socket classes with broken these functions.
|
||||||
You can try --enable-wide-getaddrinfo.
|
You can try --enable-wide-getaddrinfo.
|
||||||
EOS
|
EOS
|
||||||
exit
|
|
||||||
end
|
end
|
||||||
|
|
||||||
case with_config("lookup-order-hack", "UNSPEC")
|
case with_config("lookup-order-hack", "UNSPEC")
|
||||||
when "INET"
|
when "INET"
|
||||||
$CFLAGS="-DLOOKUP_ORDER_HACK_INET "+$CFLAGS
|
$defs << "-DLOOKUP_ORDER_HACK_INET"
|
||||||
when "INET6"
|
when "INET6"
|
||||||
$CFLAGS="-DLOOKUP_ORDER_HACK_INET6 "+$CFLAGS
|
$defs << "-DLOOKUP_ORDER_HACK_INET6"
|
||||||
when "UNSPEC"
|
when "UNSPEC"
|
||||||
# nothing special
|
# nothing special
|
||||||
else
|
else
|
||||||
print <<EOS
|
abort <<EOS
|
||||||
|
|
||||||
Fatal: invalid value for --with-lookup-order-hack (expected INET, INET6 or UNSPEC)
|
Fatal: invalid value for --with-lookup-order-hack (expected INET, INET6 or UNSPEC)
|
||||||
EOS
|
EOS
|
||||||
exit
|
|
||||||
end
|
end
|
||||||
|
|
||||||
$objs = ["socket.#{$OBJEXT}"]
|
$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
|
unless getaddr_info_ok and have_func("getnameinfo", "netdb.h") and have_func("getaddrinfo", "netdb.h")
|
||||||
$CFLAGS="-DHAVE_GETADDRINFO "+$CFLAGS
|
if have_struct_member("struct in6_addr", "s6_addr8", headers)
|
||||||
else
|
$defs[-1] = "-DHAVE_ADDR8"
|
||||||
$CFLAGS="-I. "+$CFLAGS
|
end
|
||||||
|
$CPPFLAGS="-I. "+$CPPFLAGS
|
||||||
$objs += ["getaddrinfo.#{$OBJEXT}"]
|
$objs += ["getaddrinfo.#{$OBJEXT}"]
|
||||||
$objs += ["getnameinfo.#{$OBJEXT}"]
|
$objs += ["getnameinfo.#{$OBJEXT}"]
|
||||||
have_func("inet_ntop") or have_func("inet_ntoa")
|
have_func("inet_ntop") or have_func("inet_ntoa")
|
||||||
|
@ -364,20 +279,8 @@ else
|
||||||
have_header("resolv.h")
|
have_header("resolv.h")
|
||||||
end
|
end
|
||||||
|
|
||||||
if !try_link(<<EOF)
|
unless have_type("socklen_t", headers)
|
||||||
#include <sys/types.h>
|
$defs << "-Dsocklen_t=int"
|
||||||
#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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
have_header("sys/un.h")
|
have_header("sys/un.h")
|
||||||
|
@ -386,14 +289,15 @@ have_header("sys/uio.h")
|
||||||
if have_func(test_func)
|
if have_func(test_func)
|
||||||
have_func("hsterror")
|
have_func("hsterror")
|
||||||
have_func("getipnodebyname") or have_func("gethostbyname2")
|
have_func("getipnodebyname") or have_func("gethostbyname2")
|
||||||
|
have_func("socketpair")
|
||||||
unless have_func("gethostname")
|
unless have_func("gethostname")
|
||||||
have_func("uname")
|
have_func("uname")
|
||||||
end
|
end
|
||||||
if enable_config("socks", ENV["SOCKS_SERVER"])
|
if enable_config("socks", ENV["SOCKS_SERVER"])
|
||||||
if have_library("socks5", "SOCKSinit")
|
if have_library("socks5", "SOCKSinit")
|
||||||
$CFLAGS+=" -DSOCKS5 -DSOCKS"
|
$defs << "-DSOCKS5" << "-DSOCKS"
|
||||||
elsif have_library("socks", "Rconnect")
|
elsif have_library("socks", "Rconnect")
|
||||||
$CFLAGS+=" -DSOCKS"
|
$defs << "-DSOCKS"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
create_makefile("socket")
|
create_makefile("socket")
|
||||||
|
|
174
lib/mkmf.rb
174
lib/mkmf.rb
|
@ -40,7 +40,7 @@ unless defined? $configure_args
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
$srcdir = CONFIG["srcdir"]
|
$srcdir = nil
|
||||||
$libdir = CONFIG["libdir"]
|
$libdir = CONFIG["libdir"]
|
||||||
$rubylibdir = CONFIG["rubylibdir"]
|
$rubylibdir = CONFIG["rubylibdir"]
|
||||||
$archdir = CONFIG["archdir"]
|
$archdir = CONFIG["archdir"]
|
||||||
|
@ -78,13 +78,14 @@ def map_dir(dir, map = nil)
|
||||||
map.inject(dir) {|dir, (orig, new)| dir.gsub(orig, new)}
|
map.inject(dir) {|dir, (orig, new)| dir.gsub(orig, new)}
|
||||||
end
|
end
|
||||||
|
|
||||||
libdir = File.dirname(__FILE__)
|
topdir = File.dirname(libdir = File.dirname(__FILE__))
|
||||||
$extmk = libdir != Config::CONFIG["rubylibdir"]
|
extdir = File.expand_path("ext", topdir)
|
||||||
if not $extmk and File.exist? Config::CONFIG["archdir"] + "/ruby.h"
|
$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"]
|
$hdrdir = $topdir = Config::CONFIG["archdir"]
|
||||||
elsif File.exist? $srcdir + "/ruby.h"
|
elsif File.exist?(($top_srcdir ||= topdir) + "/ruby.h") and
|
||||||
$topdir = Config::CONFIG["compile_dir"]
|
File.exist?(($topdir ||= Config::CONFIG["topdir"]) + "/config.h")
|
||||||
$hdrdir = $srcdir
|
$hdrdir = $top_srcdir
|
||||||
else
|
else
|
||||||
abort "can't find header files for ruby."
|
abort "can't find header files for ruby."
|
||||||
end
|
end
|
||||||
|
@ -136,6 +137,7 @@ module Logging
|
||||||
@logfile = 'mkmf.log'
|
@logfile = 'mkmf.log'
|
||||||
@orgerr = $stderr.dup
|
@orgerr = $stderr.dup
|
||||||
@orgout = $stdout.dup
|
@orgout = $stdout.dup
|
||||||
|
@postpone = 0
|
||||||
|
|
||||||
def self::open
|
def self::open
|
||||||
@log ||= File::open(@logfile, 'w')
|
@log ||= File::open(@logfile, 'w')
|
||||||
|
@ -164,7 +166,7 @@ module Logging
|
||||||
end
|
end
|
||||||
|
|
||||||
def self::postpone
|
def self::postpone
|
||||||
tmplog = "mkmftmp.log"
|
tmplog = "mkmftmp#{@postpone += 1}.log"
|
||||||
open do
|
open do
|
||||||
log, *save = @log, @logfile, @orgout, @orgerr
|
log, *save = @log, @logfile, @orgout, @orgerr
|
||||||
@log, @logfile, @orgout, @orgerr = nil, tmplog, log, log
|
@log, @logfile, @orgout, @orgerr = nil, tmplog, log, log
|
||||||
|
@ -174,6 +176,7 @@ module Logging
|
||||||
File::open(tmplog) {|t| FileUtils.copy_stream(t, log)}
|
File::open(tmplog) {|t| FileUtils.copy_stream(t, log)}
|
||||||
ensure
|
ensure
|
||||||
@log, @logfile, @orgout, @orgerr = log, *save
|
@log, @logfile, @orgout, @orgerr = log, *save
|
||||||
|
@postpone -= 1
|
||||||
rm_f tmplog
|
rm_f tmplog
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -293,48 +296,52 @@ def try_static_assert(expr, headers = nil, opt = "", &b)
|
||||||
#{COMMON_HEADERS}
|
#{COMMON_HEADERS}
|
||||||
#{headers}
|
#{headers}
|
||||||
/*top*/
|
/*top*/
|
||||||
int tmp[(#{expr}) ? 1 : -1];
|
int conftest_const[(#{expr}) ? 1 : -1];
|
||||||
SRC
|
SRC
|
||||||
end
|
end
|
||||||
|
|
||||||
def try_constant(const, headers = nil, opt = "", &b)
|
def try_constant(const, headers = nil, opt = "", &b)
|
||||||
headers = cpp_include(headers)
|
includes = cpp_include(headers)
|
||||||
if CROSS_COMPILING
|
if CROSS_COMPILING
|
||||||
unless try_compile(<<"SRC", opt, &b)
|
if try_static_assert("#{const} > 0", headers, opt)
|
||||||
#{COMMON_HEADERS}
|
# positive constant
|
||||||
#{headers}
|
elsif try_static_assert("#{const} < 0", headers, opt)
|
||||||
/*top*/
|
|
||||||
int tmp = #{const};
|
|
||||||
SRC
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
if try_static_assert("#{const} < 0", headers, opt)
|
|
||||||
neg = true
|
neg = true
|
||||||
const = "-(#{const})"
|
const = "-(#{const})"
|
||||||
elsif try_static_assert("#{const} == 0", headers, opt)
|
elsif try_static_assert("#{const} == 0", headers, opt)
|
||||||
return 0
|
return 0
|
||||||
|
else
|
||||||
|
# not a constant
|
||||||
|
return nil
|
||||||
end
|
end
|
||||||
upper = 1
|
upper = 1
|
||||||
until try_static_assert("#{const} < #{upper}", headers, opt)
|
until try_static_assert("#{const} <= #{upper}", headers, opt)
|
||||||
lower = upper
|
lower = upper
|
||||||
upper <<= 1
|
upper <<= 1
|
||||||
end
|
end
|
||||||
return nil unless lower
|
return nil unless lower
|
||||||
until try_static_assert("#{const} == #{upper}", headers, opt)
|
while upper > lower + 1
|
||||||
if try_static_assert("#{const} > #{(upper+lower)/2}", headers, opt)
|
mid = (upper + lower) / 2
|
||||||
lower = (upper+lower)/2
|
if try_static_assert("#{const} > #{mid}", headers, opt)
|
||||||
|
lower = mid
|
||||||
else
|
else
|
||||||
upper = (upper+lower)/2
|
upper = mid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
unless upper == lower
|
||||||
|
if try_static_assert("#{const} == #{lower}", headers, opt)
|
||||||
|
upper = lower
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
upper = -upper if neg
|
upper = -upper if neg
|
||||||
return upper
|
return upper
|
||||||
else
|
else
|
||||||
src = %{#{COMMON_HEADERS}
|
src = %{#{COMMON_HEADERS}
|
||||||
#{headers}
|
#{includes}
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
/*top*/
|
/*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)
|
if try_link0(src, opt, &b)
|
||||||
xpopen("./conftest") do |f|
|
xpopen("./conftest") do |f|
|
||||||
|
@ -361,6 +368,17 @@ int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; }
|
||||||
SRC
|
SRC
|
||||||
end
|
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)
|
def egrep_cpp(pat, src, opt = "", &b)
|
||||||
src = create_tmpsrc(src, &b)
|
src = create_tmpsrc(src, &b)
|
||||||
xpopen(cpp_command('', opt)) do |f|
|
xpopen(cpp_command('', opt)) do |f|
|
||||||
|
@ -459,14 +477,14 @@ def message(*s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def checking_for(m)
|
def checking_for(m, fmt = nil)
|
||||||
f = caller[0][/in `(.*)'$/, 1] and f << ": " #` for vim
|
f = caller[0][/in `(.*)'$/, 1] and f << ": " #` for vim
|
||||||
m = "checking for #{m}... "
|
m = "checking for #{m}... "
|
||||||
message "%s", m
|
message "%s", m
|
||||||
a = r = nil
|
a = r = nil
|
||||||
Logging::postpone do
|
Logging::postpone do
|
||||||
r = yield
|
r = yield
|
||||||
a = r ? "yes\n" : "no\n"
|
a = (fmt ? fmt % r : r ? "yes" : "no") << "\n"
|
||||||
"#{f}#{m}-------------------- #{a}\n"
|
"#{f}#{m}-------------------- #{a}\n"
|
||||||
end
|
end
|
||||||
message(a)
|
message(a)
|
||||||
|
@ -474,6 +492,14 @@ def checking_for(m)
|
||||||
r
|
r
|
||||||
end
|
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)
|
def have_library(lib, func = nil, header=nil, &b)
|
||||||
func = "main" if !func or func.empty?
|
func = "main" if !func or func.empty?
|
||||||
lib = with_config(lib+'lib', lib)
|
lib = with_config(lib+'lib', lib)
|
||||||
|
@ -495,6 +521,7 @@ end
|
||||||
def find_library(lib, func, *paths, &b)
|
def find_library(lib, func, *paths, &b)
|
||||||
func = "main" if !func or func.empty?
|
func = "main" if !func or func.empty?
|
||||||
lib = with_config(lib+'lib', lib)
|
lib = with_config(lib+'lib', lib)
|
||||||
|
paths = paths.collect {|path| path.split(File::PATH_SEPARATOR)}.flatten
|
||||||
checking_for "#{func}() in #{LIBARG%lib}" do
|
checking_for "#{func}() in #{LIBARG%lib}" do
|
||||||
libpath = $LIBPATH
|
libpath = $LIBPATH
|
||||||
libs = append_library($libs, lib)
|
libs = append_library($libs, lib)
|
||||||
|
@ -524,6 +551,19 @@ def have_func(func, headers = nil, &b)
|
||||||
end
|
end
|
||||||
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)
|
def have_header(header, &b)
|
||||||
checking_for header do
|
checking_for header do
|
||||||
if try_cpp(cpp_include(header), &b)
|
if try_cpp(cpp_include(header), &b)
|
||||||
|
@ -604,24 +644,28 @@ def find_executable(bin, path = nil)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def arg_config(config, default=nil)
|
def arg_config(config, *defaults, &block)
|
||||||
$configure_args.fetch(config.tr('_', '-'), default)
|
$arg_config << [config, *defaults]
|
||||||
|
defaults << nil if !block and defaults.empty?
|
||||||
|
$configure_args.fetch(config.tr('_', '-'), *defaults, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
def with_config(config, default=nil)
|
def with_config(config, *defaults, &block)
|
||||||
unless /^--with[-_]/ =~ config
|
unless /^--with[-_]/ =~ config
|
||||||
config = '--with-' + config
|
config = '--with-' + config
|
||||||
end
|
end
|
||||||
arg_config(config, default)
|
arg_config(config, *defaults, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
def enable_config(config, default=nil)
|
def enable_config(config, *defaults)
|
||||||
if arg_config("--enable-"+config)
|
if arg_config("--enable-"+config)
|
||||||
true
|
true
|
||||||
elsif arg_config("--disable-"+config)
|
elsif arg_config("--disable-"+config)
|
||||||
false
|
false
|
||||||
|
elsif block_given?
|
||||||
|
yield(config, *defaults)
|
||||||
else
|
else
|
||||||
default
|
return *defaults
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -646,15 +690,16 @@ end
|
||||||
|
|
||||||
def dir_config(target, idefault=nil, ldefault=nil)
|
def dir_config(target, idefault=nil, ldefault=nil)
|
||||||
if dir = with_config(target + "-dir", (idefault unless ldefault))
|
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
|
idefault = ldefault = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
idir = with_config(target + "-include", idefault)
|
idir = with_config(target + "-include", idefault)
|
||||||
|
$arg_config.last[1] ||= "${#{target}-dir}/include"
|
||||||
ldir = with_config(target + "-lib", ldefault)
|
ldir = with_config(target + "-lib", ldefault)
|
||||||
|
$arg_config.last[1] ||= "${#{target}-dir}/lib"
|
||||||
|
|
||||||
# idirs = idir ? idir.split(File::PATH_SEPARATOR) : []
|
idirs = idir ? Array === idir ? idir : idir.split(File::PATH_SEPARATOR) : []
|
||||||
idirs = idir.split(File::PATH_SEPARATOR) rescue []
|
|
||||||
if defaults
|
if defaults
|
||||||
idirs.concat(defaults.collect {|dir| dir + "/include"})
|
idirs.concat(defaults.collect {|dir| dir + "/include"})
|
||||||
idir = ([idir] + idirs).compact.join(File::PATH_SEPARATOR)
|
idir = ([idir] + idirs).compact.join(File::PATH_SEPARATOR)
|
||||||
|
@ -667,7 +712,7 @@ def dir_config(target, idefault=nil, ldefault=nil)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ldirs = ldir ? ldir.split(File::PATH_SEPARATOR) : []
|
ldirs = ldir ? Array === ldir ? ldir : ldir.split(File::PATH_SEPARATOR) : []
|
||||||
if defaults
|
if defaults
|
||||||
ldirs.concat(defaults.collect {|dir| dir + "/lib"})
|
ldirs.concat(defaults.collect {|dir| dir + "/lib"})
|
||||||
ldir = ([ldir] + ldirs).compact.join(File::PATH_SEPARATOR)
|
ldir = ([ldir] + ldirs).compact.join(File::PATH_SEPARATOR)
|
||||||
|
@ -800,15 +845,18 @@ def create_makefile(target, srcprefix = nil)
|
||||||
srcprefix ||= '$(srcdir)'
|
srcprefix ||= '$(srcdir)'
|
||||||
Config::expand(srcdir = srcprefix.dup)
|
Config::expand(srcdir = srcprefix.dup)
|
||||||
|
|
||||||
unless $objs then
|
if not $objs
|
||||||
$objs = []
|
$objs = []
|
||||||
for f in Dir[File.join(srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
|
srcs = Dir[File.join(srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
|
||||||
$objs.push(File.basename(f, ".*") << "." << $OBJEXT)
|
for f in srcs
|
||||||
end
|
obj = File.basename(f, ".*") << ".o"
|
||||||
else
|
$objs.push(obj) unless $objs.index(obj)
|
||||||
for i in $objs
|
|
||||||
i.sub!(/\.o\z/, ".#{$OBJEXT}")
|
|
||||||
end
|
end
|
||||||
|
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(" ")
|
$objs = $objs.join(" ")
|
||||||
|
|
||||||
|
@ -846,6 +894,7 @@ DISTCLEANFILES = #{$distcleanfiles.join(' ')}
|
||||||
target_prefix = #{target_prefix}
|
target_prefix = #{target_prefix}
|
||||||
LOCAL_LIBS = #{$LOCAL_LIBS}
|
LOCAL_LIBS = #{$LOCAL_LIBS}
|
||||||
LIBS = #{$LIBRUBYARG} #{$libs} #{$LIBS}
|
LIBS = #{$LIBRUBYARG} #{$libs} #{$LIBS}
|
||||||
|
SRCS = #{srcs.collect(&File.method(:basename)).join(' ')}
|
||||||
OBJS = #{$objs}
|
OBJS = #{$objs}
|
||||||
TARGET = #{target}
|
TARGET = #{target}
|
||||||
DLLIB = #{dllib}
|
DLLIB = #{dllib}
|
||||||
|
@ -946,17 +995,23 @@ static: $(STATIC_LIB)
|
||||||
mfile.printf "###\n"
|
mfile.printf "###\n"
|
||||||
while line = dfile.gets()
|
while line = dfile.gets()
|
||||||
line.gsub!(/\.o\b/, ".#{$OBJEXT}")
|
line.gsub!(/\.o\b/, ".#{$OBJEXT}")
|
||||||
line.gsub!(/(\s)([^\s\/]+\.[ch])/, '\1{$(srcdir)}\2') if $nmake
|
if $nmake
|
||||||
|
line.gsub!(%r"(\s)([^\s\/]+\.(?:#{SRC_EXT.join('|')})(?=\s|\z)", '\1{.;$(VPATH)}\2')
|
||||||
|
end
|
||||||
line.gsub!(/\$\(hdrdir\)\/config.h/, $config_h) if $config_h
|
line.gsub!(/\$\(hdrdir\)\/config.h/, $config_h) if $config_h
|
||||||
mfile.print line
|
mfile.print line
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
$makefile_created = true
|
||||||
ensure
|
ensure
|
||||||
mfile.close if mfile
|
mfile.close if mfile
|
||||||
end
|
end
|
||||||
|
|
||||||
def init_mkmf(config = CONFIG)
|
def init_mkmf(config = CONFIG)
|
||||||
|
$makefile_created = false
|
||||||
|
$arg_config = []
|
||||||
$enable_shared = config['ENABLE_SHARED'] == 'yes'
|
$enable_shared = config['ENABLE_SHARED'] == 'yes'
|
||||||
$defs = []
|
$defs = []
|
||||||
$CFLAGS = with_config("cflags", arg_config("CFLAGS", config["CFLAGS"])).dup
|
$CFLAGS = with_config("cflags", arg_config("CFLAGS", config["CFLAGS"])).dup
|
||||||
|
@ -985,9 +1040,25 @@ def init_mkmf(config = CONFIG)
|
||||||
$cleanfiles = []
|
$cleanfiles = []
|
||||||
$distcleanfiles = []
|
$distcleanfiles = []
|
||||||
|
|
||||||
|
$arg_config.clear
|
||||||
dir_config("opt")
|
dir_config("opt")
|
||||||
end
|
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
|
init_mkmf
|
||||||
|
|
||||||
$make = with_config("make-prog", ENV["MAKE"] || "make")
|
$make = with_config("make-prog", ENV["MAKE"] || "make")
|
||||||
|
@ -1042,13 +1113,18 @@ LIBPATHFLAG = config_string('LIBPATHFLAG') || ' -L"%s"'
|
||||||
RPATHFLAG = config_string('RPATHFLAG') || ''
|
RPATHFLAG = config_string('RPATHFLAG') || ''
|
||||||
LIBARG = config_string('LIBARG') || '-l%s'
|
LIBARG = config_string('LIBARG') || '-l%s'
|
||||||
|
|
||||||
|
sep = File::ALT_SEPARATOR ? ":/=#{File::ALT_SEPARATOR}" : ''
|
||||||
CLEANINGS = "
|
CLEANINGS = "
|
||||||
clean:
|
clean:
|
||||||
@$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
|
@-$(RM) $(CLEANLIBS#{sep}) $(CLEANOBJS#{sep}) $(CLEANFILES#{sep})
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
@$(RM) Makefile extconf.h conftest.* mkmf.log
|
@-$(RM) Makefile extconf.h conftest.* mkmf.log
|
||||||
@$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
|
@-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES#{sep})
|
||||||
|
|
||||||
realclean: distclean
|
realclean: distclean
|
||||||
"
|
"
|
||||||
|
|
||||||
|
if not $extmk and /\A(extconf|makefile).rb\z/ =~ File.basename($0)
|
||||||
|
END {mkmf_failed($0)}
|
||||||
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue