mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
48d1e8682c
* cast to suppress C4267 warnings; no possible loss of data as following the comparison. * shift base address to suppress LNK4281; although /DYNAMICBASE is preferable, not sure from which version of link.exe supports it.
136 lines
3.5 KiB
Ruby
136 lines
3.5 KiB
Ruby
# frozen_string_literal: true
|
|
#
|
|
# extconf.rb
|
|
#
|
|
# $Id$
|
|
#
|
|
|
|
require 'mkmf'
|
|
require 'rbconfig'
|
|
|
|
dir_config 'zlib'
|
|
|
|
|
|
if %w'z libz zlib1 zlib zdll zlibwapi'.find {|z| have_library(z, 'deflateReset')} and
|
|
have_header('zlib.h') then
|
|
have_zlib = true
|
|
else
|
|
unless File.directory?(zsrc = "#{$srcdir}/zlib")
|
|
dirs = Dir.open($srcdir) {|z| z.grep(/\Azlib-\d+[.\d]*\z/) {|x|"#{$srcdir}/#{x}"}}
|
|
dirs.delete_if {|x| !File.directory?(x)}
|
|
zsrc = dirs.max_by {|x| x.scan(/\d+/).map(&:to_i)}
|
|
end
|
|
if zsrc
|
|
addconf = [
|
|
"ZSRC = $(srcdir)/#{File.basename(zsrc)}\n",
|
|
"all:\n",
|
|
]
|
|
$INCFLAGS << " -I$(ZSRC)"
|
|
if $mswin or $mingw
|
|
dll = "zlib1.dll"
|
|
$extso << dll
|
|
$cleanfiles << "$(topdir)/#{dll}" << "$(ZIMPLIB)"
|
|
zmk = "\t$(MAKE) -f $(ZMKFILE) TOP=$(ZSRC)"
|
|
zopts = []
|
|
if $nmake
|
|
zmkfile = "$(ZSRC)/win32/Makefile.msc"
|
|
m = "#{zsrc}/win32/Makefile.msc"
|
|
# zopts << "USE_ASM=1"
|
|
zopts << "ARCH=#{RbConfig::CONFIG['target_cpu']}"
|
|
else
|
|
zmkfile = "$(ZSRC)/win32/Makefile.gcc"
|
|
m = "#{zsrc}/win32/Makefile.gcc"
|
|
zmk += " PREFIX="
|
|
zmk << CONFIG['CC'][/(.*-)gcc([^\/]*)\z/, 1]
|
|
zmk << " CC=$(CC)" if $2
|
|
end
|
|
m = File.read(m)
|
|
zimplib = m[/^IMPLIB[ \t]*=[ \t]*(\S+)/, 1]
|
|
$LOCAL_LIBS << " " << zimplib
|
|
unless $nmake or /^TOP[ \t]/ =~ m
|
|
m.gsub!(/win32\/zlib\.def/, '$(TOP)/\&')
|
|
m.gsub!(/^(\t.*[ \t])(\S+\.rc)/, '\1-I$(<D) $<')
|
|
m = "TOP = .\n""VPATH=$(TOP)\n" + m
|
|
zmkfile = File.basename(zmkfile)
|
|
File.rename(zmkfile, zmkfile+".orig") if File.exist?(zmkfile)
|
|
File.write(zmkfile, m)
|
|
end
|
|
addconf.push(
|
|
"ZMKFILE = #{zmkfile}\n",
|
|
"ZIMPLIB = #{zimplib}\n",
|
|
"ZOPTS = #{zopts.join(' ')}\n",
|
|
"$(TARGET_SO): $(ZIMPLIB)\n",
|
|
"$(ZIMPLIB):\n",
|
|
"#{zmk} $(ZOPTS) $@\n",
|
|
"install-so: $(topdir)/#{dll}",
|
|
"$(topdir)/#{dll}: $(ZIMPLIB)\n",
|
|
"\t$(Q) $(COPY) #{dll} $(@D)\n",
|
|
"clean: clean-zsrc\n",
|
|
"clean-zsrc:\n",
|
|
"#{zmk} clean\n",
|
|
)
|
|
end
|
|
Logging.message "using zlib in #{zsrc}\n"
|
|
$defs << "-DHAVE_ZLIB_H"
|
|
have_zlib = true
|
|
end
|
|
end
|
|
|
|
if have_zlib
|
|
defines = []
|
|
|
|
Logging::message 'checking for kind of operating system... '
|
|
os_code = with_config('os-code') ||
|
|
case RUBY_PLATFORM.split('-',2)[1]
|
|
when 'amigaos' then
|
|
os_code = 'AMIGA'
|
|
when /mswin|mingw|bccwin/ then
|
|
# NOTE: cygwin should be regarded as Unix.
|
|
os_code = 'WIN32'
|
|
else
|
|
os_code = 'UNIX'
|
|
end
|
|
os_code = 'OS_' + os_code.upcase
|
|
|
|
OS_NAMES = {
|
|
'OS_MSDOS' => 'MS-DOS',
|
|
'OS_AMIGA' => 'Amiga',
|
|
'OS_VMS' => 'VMS',
|
|
'OS_UNIX' => 'Unix',
|
|
'OS_ATARI' => 'Atari',
|
|
'OS_MACOS' => 'MacOS',
|
|
'OS_TOPS20' => 'TOPS20',
|
|
'OS_WIN32' => 'Win32',
|
|
'OS_VMCMS' => 'VM/CMS',
|
|
'OS_ZSYSTEM' => 'Z-System',
|
|
'OS_CPM' => 'CP/M',
|
|
'OS_QDOS' => 'QDOS',
|
|
'OS_RISCOS' => 'RISCOS',
|
|
'OS_UNKNOWN' => 'Unknown',
|
|
}
|
|
unless OS_NAMES.key? os_code then
|
|
raise "invalid OS_CODE `#{os_code}'"
|
|
end
|
|
Logging::message "#{OS_NAMES[os_code]}\n"
|
|
defines << "OS_CODE=#{os_code}"
|
|
|
|
$defs.concat(defines.collect{|d|' -D'+d})
|
|
|
|
if zsrc
|
|
$defs << "-DHAVE_CRC32_COMBINE"
|
|
$defs << "-DHAVE_ADLER32_COMBINE"
|
|
$defs << "-DHAVE_TYPE_Z_CRC_T"
|
|
else
|
|
have_func('crc32_combine', 'zlib.h')
|
|
have_func('adler32_combine', 'zlib.h')
|
|
have_type('z_crc_t', 'zlib.h')
|
|
end
|
|
|
|
create_makefile('zlib') {|conf|
|
|
if zsrc
|
|
conf.concat addconf if addconf
|
|
end
|
|
conf
|
|
}
|
|
|
|
end
|