diff options
author | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-07-18 11:28:49 +0000 |
---|---|---|
committer | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-07-18 11:28:49 +0000 |
commit | 13155d4df577a2b5fc57c6b16cd92515c2d56870 (patch) | |
tree | 1450fd80b117cadb69f12176a2dca9bcdf0c5577 | |
parent | e69dd14a6cbb02756d0568e87bae8697159e72f5 (diff) | |
download | ruby-13155d4df577a2b5fc57c6b16cd92515c2d56870.tar.gz |
Copy openssl library finder for ext/digest from OpenSSL extention.
* ext/digest/digest_conf.rb: Support to search variaous filenames of
OpenSSL/LibreSSL libraries.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59362 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ext/digest/digest_conf.rb | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/ext/digest/digest_conf.rb b/ext/digest/digest_conf.rb index 8e36ce5d41..915b61877f 100644 --- a/ext/digest/digest_conf.rb +++ b/ext/digest/digest_conf.rb @@ -1,4 +1,56 @@ # frozen_string_literal: false + +# Copy from ext/openssl/extconf.rb +def find_openssl_library + if $mswin || $mingw + # required for static OpenSSL libraries + have_library("gdi32") # OpenSSL <= 1.0.2 (for RAND_screen()) + have_library("crypt32") + end + + return false unless have_header("openssl/ssl.h") + + ret = have_library("crypto", "CRYPTO_malloc") && + have_library("ssl", "SSL_new") + return ret if ret + + if $mswin + # OpenSSL >= 1.1.0: libcrypto.lib and libssl.lib. + if have_library("libcrypto", "CRYPTO_malloc") && + have_library("libssl", "SSL_new") + return true + end + + # OpenSSL <= 1.0.2: libeay32.lib and ssleay32.lib. + if have_library("libeay32", "CRYPTO_malloc") && + have_library("ssleay32", "SSL_new") + return true + end + + # LibreSSL: libcrypto-##.lib and libssl-##.lib, where ## is the ABI version + # number. We have to find the version number out by scanning libpath. + libpath = $LIBPATH.dup + libpath |= ENV["LIB"].split(File::PATH_SEPARATOR) + libpath.map! { |d| d.tr(File::ALT_SEPARATOR, File::SEPARATOR) } + + ret = [ + ["crypto", "CRYPTO_malloc"], + ["ssl", "SSL_new"] + ].all? do |base, func| + result = false + libs = ["lib#{base}-[0-9][0-9]", "lib#{base}-[0-9][0-9][0-9]"] + libs = Dir.glob(libs.map{|l| libpath.map{|d| File.join(d, l + ".*")}}.flatten).map{|path| File.basename(path, ".*")}.uniq + libs.each do |lib| + result = have_library(lib, func) + break if result + end + result + end + return ret if ret + end + return false +end + def digest_conf(name, hdr = name, funcs = nil, types = nil) unless with_config("bundled-#{name}") cc = with_config("common-digest") @@ -14,7 +66,7 @@ def digest_conf(name, hdr = name, funcs = nil, types = nil) dir_config("openssl") pkg_config("openssl") require File.expand_path('../../openssl/deprecation', __FILE__) - if have_library("crypto") + if find_openssl_library funcs ||= name.upcase funcs = Array(funcs) types ||= funcs |