forked from rails-sqlserver/tiny_tds
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
98 additions
and
346 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,91 +1,118 @@ | ||
ENV['RC_ARCHS'] = '' if RUBY_PLATFORM =~ /darwin/ | ||
|
||
# :stopdoc: | ||
|
||
require 'pp' | ||
require 'mkmf' | ||
require 'rbconfig' | ||
require_relative './extconsts' | ||
|
||
# Shamelessly copied from nokogiri | ||
# | ||
|
||
def do_help | ||
print <<HELP | ||
usage: ruby #{$0} [options] | ||
--with-freetds-dir=DIR | ||
Use the freetds library placed under DIR. | ||
HELP | ||
exit! 0 | ||
end | ||
|
||
do_help if arg_config('--help') | ||
if ENV['MAINTAINER_MODE'] | ||
$stderr.puts "Maintainer mode enabled." | ||
$CFLAGS << | ||
' -Wall' << | ||
' -ggdb' << | ||
' -DDEBUG' << | ||
' -pedantic' | ||
$LDFLAGS << | ||
' -ggdb' | ||
end | ||
|
||
# Make sure to check the ports path for the configured host | ||
architecture = RbConfig::CONFIG['arch'] | ||
require 'mini_portile2' | ||
require_relative 'extconsts' | ||
|
||
project_dir = File.expand_path("../../..", __FILE__) | ||
freetds_ports_dir = File.join(project_dir, 'ports', architecture, 'freetds', FREETDS_VERSION) | ||
freetds_ports_dir = File.expand_path(freetds_ports_dir) | ||
class BuildRecipe < MiniPortile | ||
def initialize(name, version, files) | ||
super(name, version) | ||
self.files = files | ||
rootdir = File.expand_path('../..', __FILE__) | ||
self.target = File.join(rootdir, "ports") | ||
self.patch_files = Dir[File.join(target, "patches", self.name, self.version, "*.patch")].sort | ||
end | ||
|
||
# Add all the special path searching from the original tiny_tds build | ||
# order is important here! First in, first searched. | ||
DIRS = %w( | ||
/opt/local | ||
/usr/local | ||
) | ||
def port_path | ||
"../ports/#{RUBY_PLATFORM}/#{@name}/#{@version}" | ||
end | ||
|
||
if RbConfig::CONFIG['host_os'] =~ /darwin/i | ||
# Ruby below 2.7 seems to label the host CPU on Apple Silicon as aarch64 | ||
# 2.7 and above print is as ARM64 | ||
target_host_cpu = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7') ? 'aarch64' : 'arm64' | ||
def tmp_path | ||
"../tmp/#{RUBY_PLATFORM}/ports/#{@name}/#{@version}" | ||
end | ||
|
||
if RbConfig::CONFIG['host_cpu'] == target_host_cpu | ||
# Homebrew on Apple Silicon installs into /opt/hombrew | ||
# https://docs.brew.sh/Installation | ||
# On Intel Macs, it is /usr/local, so no changes necessary to DIRS | ||
DIRS.unshift("/opt/homebrew") | ||
def cook_and_activate | ||
checkpoint = "../ports/checkpoints/#{name}-#{version}-#{RUBY_PLATFORM}.installed" | ||
|
||
unless File.exist?(checkpoint) | ||
self.cook | ||
FileUtils.mkdir_p("../ports/checkpoints") | ||
FileUtils.touch checkpoint | ||
end | ||
|
||
self.activate | ||
self | ||
end | ||
end | ||
|
||
if ENV["RI_DEVKIT"] && ENV["MINGW_PREFIX"] # RubyInstaller Support | ||
DIRS.unshift(File.join(ENV["RI_DEVKIT"], ENV["MINGW_PREFIX"])) | ||
openssl_recipe = BuildRecipe.new("openssl", OPENSSL_VERSION, [OPENSSL_SOURCE_URI]).tap do |recipe| | ||
class << recipe | ||
def configure | ||
envs = [] | ||
envs << "CFLAGS=-DDSO_WIN32 -DOPENSSL_THREADS" if RUBY_PLATFORM =~ /mingw|mswin/ | ||
envs << "CFLAGS=-fPIC -DOPENSSL_THREADS" if RUBY_PLATFORM =~ /linux/ | ||
execute('configure', ['env', *envs, "./Configure", target_arch, "threads", "-static", "CROSS_COMPILE=#{host}-", configure_prefix], altlog: "config.log") | ||
end | ||
|
||
def compile | ||
execute('compile', "#{make_cmd} build_libs") | ||
end | ||
|
||
def install | ||
execute('install', "#{make_cmd} install_dev") | ||
end | ||
|
||
private | ||
|
||
def target_arch | ||
if RUBY_PLATFORM =~ /mingw|mswin/ | ||
arch = '' | ||
arch = '64' if host=~ /x86_64/ | ||
|
||
"mingw#{arch}" | ||
else | ||
arch = 'x32' | ||
arch = 'x86_64' if host=~ /x86_64/ | ||
|
||
"linux-#{arch}" | ||
end | ||
end | ||
end | ||
|
||
recipe.cook_and_activate | ||
end | ||
|
||
# Add the ports directory if it exists for local developer builds | ||
DIRS.unshift(freetds_ports_dir) if File.directory?(freetds_ports_dir) | ||
libiconv_recipe = BuildRecipe.new("libiconv", ICONV_VERSION, [ICONV_SOURCE_URI]).tap do |recipe| | ||
recipe.configure_options << "CFLAGS=-fPIC" if RUBY_PLATFORM =~ /linux/ | ||
recipe.cook_and_activate | ||
end | ||
|
||
# Grab freetds environment variable for use by people on services like | ||
# Heroku who they can't easily use bundler config to set directories | ||
DIRS.unshift(ENV['FREETDS_DIR']) if ENV.has_key?('FREETDS_DIR') | ||
freetds_recipe = BuildRecipe.new("freetds", FREETDS_VERSION, [FREETDS_SOURCE_URI]).tap do |recipe| | ||
recipe.configure_options << "CFLAGS=-fPIC" if RUBY_PLATFORM =~ /linux/ | ||
recipe.configure_options << "LDFLAGS=-L#{openssl_recipe.path}/lib -L#{openssl_recipe.path}/lib64 -L#{libiconv_recipe.path}/lib" | ||
recipe.configure_options << "LIBS=-lssl -lcrypto -liconv" | ||
recipe.configure_options << "CPPFLAGS=-I#{openssl_recipe.path}/include -I#{libiconv_recipe.path}/include" | ||
|
||
# Add the search paths for freetds configured above | ||
ldirs = DIRS.flat_map do |path| | ||
ldir = "#{path}/lib" | ||
[ldir, "#{ldir}/freetds"] | ||
recipe.cook_and_activate | ||
end | ||
|
||
idirs = DIRS.flat_map do |path| | ||
idir = "#{path}/include" | ||
[idir, "#{idir}/freetds"] | ||
end | ||
# Avoid dependency to external libgcc.dll on x86-mingw32 | ||
$LDFLAGS << " -static-libgcc" | ||
|
||
puts "looking for freetds headers in the following directories:\n#{idirs.map{|a| " - #{a}\n"}.join}" | ||
puts "looking for freetds library in the following directories:\n#{ldirs.map{|a| " - #{a}\n"}.join}" | ||
dir_config('freetds', idirs, ldirs) | ||
|
||
have_dependencies = [ | ||
find_header('sybfront.h'), | ||
find_header('sybdb.h'), | ||
find_library('sybdb', 'tdsdbopen'), | ||
find_library('sybdb', 'dbanydatecrack') | ||
].inject(true) do |memo, current| | ||
memo && current | ||
end | ||
dir_config('freetds', "#{freetds_recipe.path}/include", "#{freetds_recipe.path}/lib") | ||
|
||
unless have_dependencies | ||
abort 'Failed! Do you have FreeTDS 1.0.0 or higher installed?' | ||
# $stderr.puts "Using freetds from #{dlldir}" | ||
|
||
if /solaris/ =~ RUBY_PLATFORM | ||
append_cppflags( '-D__EXTENSIONS__' ) | ||
end | ||
|
||
create_makefile('tiny_tds/tiny_tds') | ||
find_header('sybfront.h') or abort "Can't find the 'sybfront.h' header" | ||
find_header('sybdb.h') or abort "Can't find the 'sybdb.h' header" | ||
|
||
unless have_library('sybdb', 'dbanydatecrack') | ||
abort "Failed! Do you have FreeTDS 1.0.0 or higher installed?" | ||
end | ||
|
||
# :startdoc: | ||
create_makefile("tiny_tds/tiny_tds") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.