oracle-instantclient: 12.2.0.1.0 -> 19.3.0.0.0

It's now possible to download Oracle Instant Client without having to
click a checkbox to agree to the license, and then log in with an Oracle
account to start the download, at least on Linux (for now).

Darwin still seems to be at 18.1, and version numbers haven't been that
aligned recently, so allow different version numbers per platform.
This commit is contained in:
Florian Klink 2019-08-20 01:24:36 +02:00
parent c79d9e17d6
commit 2decc61d28

View file

@ -1,46 +1,95 @@
{ stdenv, requireFile, autoPatchelfHook, fixDarwinDylibNames, unzip, libaio, makeWrapper, odbcSupport ? false, unixODBC }: { stdenv
, fetchurl
, requireFile
, autoPatchelfHook
, fixDarwinDylibNames
, unzip
, libaio
, makeWrapper
, odbcSupport ? true
, unixODBC
}:
assert odbcSupport -> unixODBC != null; assert odbcSupport -> unixODBC != null;
let let
inherit (stdenv.lib) optional optionals optionalString; inherit (stdenv.lib) optional optionals optionalString;
baseVersion = "12.2";
version = "${baseVersion}.0.1.0";
requireSource = component: arch: version: rel: hash: (requireFile rec {
name = "instantclient-${component}-${arch}-${version}" + (optionalString (rel != "") "-${rel}") + ".zip";
url = "http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html";
sha256 = hash;
});
throwSystem = throw "Unsupported system: ${stdenv.hostPlatform.system}"; throwSystem = throw "Unsupported system: ${stdenv.hostPlatform.system}";
# assemble list of components
components = [ "basic" "sdk" "sqlplus" ] ++ optional odbcSupport "odbc";
# determine the version number, there might be different ones per architecture
version = {
"x86_64-linux" = "19.3.0.0.0";
"x86_64-darwin" = "18.1.0.0.0";
}."${stdenv.hostPlatform.system}" or throwSystem;
# hashes per component and architecture
hashes = {
"x86_64-linux" = {
"basic" = "1yk4ng3a9ka1mzgfph9br6rwclagbgfvmg6kja11nl5dapxdzaxy";
"sdk" = "115v1gqr0czy7dcf2idwxhc6ja5b0nind0mf1rn8iawgrw560l99";
"sqlplus" = "0zj5h84ypv4n4678kfix6jih9yakb277l9hc0819iddc0a5slbi5";
"odbc" = "1g1z6pdn76dp440fh49pm8ijfgjazx4cvxdi665fsr62h62xkvch";
};
"x86_64-darwin" = {
"basic" = "fac3cdaaee7526f6c50ff167edb4ba7ab68efb763de24f65f63fb48cc1ba44c0";
"sdk" = "98e6d797f1ce11e59b042b232f62380cec29ec7d5387b88a9e074b741c13e63a";
"sqlplus" = "02e66dc52398fced75e7efcb6b4372afcf617f7d88344fb7f0f4bb2bed371f3b";
"odbc" = "5d0cdd7f9dd2e27affbc9b36ef9fc48e329713ecd36905fdd089366e365ae8a2";
};
}."${stdenv.hostPlatform.system}" or throwSystem;
# rels per component and architecture, optional
rels = {
"x86_64-darwin" = {
"sdk" = "2";
};
}."${stdenv.hostPlatform.system}" or {};
# convert platform to oracle architecture names
arch = { arch = {
"x86_64-linux" = "linux.x64"; "x86_64-linux" = "linux.x64";
"x86_64-darwin" = "macos.x64"; "x86_64-darwin" = "macos.x64";
}."${stdenv.hostPlatform.system}" or throwSystem; }."${stdenv.hostPlatform.system}" or throwSystem;
srcs = { # calculate the filename of a single zip file
"x86_64-linux" = [ srcFilename = component: arch: version: rel:
(requireSource "basic" arch version "" "5015e3c9fba84e009f7519893f798a1622c37d1ae2c55104ff502c52a0fe5194") "instantclient-${component}-${arch}-${version}" +
(requireSource "sdk" arch version "" "7f404c3573c062ce487a51ac4cfe650c878d7edf8e73b364ec852645ed1098cb") (optionalString (rel != "") "-${rel}") +
(requireSource "sqlplus" arch version "" "d49b2bd97376591ca07e7a836278933c3f251875c215044feac73ba9f451dfc2") ] (optionalString (arch == "linux.x64") "dbru") + # ¯\_(ツ)_/¯
++ optional odbcSupport (requireSource "odbc" arch version "2" "365a4ae32c7062d9fbc3fb41add748e7881f774484a175a4b41a2c294ce9095d"); ".zip";
"x86_64-darwin" = [
(requireSource "basic" arch version "2" "3ed3102e5a24f0da638694191edb34933309fb472eb1df21ad5c86eedac3ebb9")
(requireSource "sdk" arch version "2" "e0befca9c4e71ebc9f444957ffa70f01aeeec5976ea27c40406471b04c34848b")
(requireSource "sqlplus" arch version "2" "d147cbb5b2a954fdcb4b642df4f0bd1153fd56e0f56e7fa301601b4f7e2abe0e") ]
++ optional odbcSupport (requireSource "odbc" arch version "2" "1805c1ab6c8c5e8df7bdcc35d7f2b94c329ecf4dff9bde55d5f9b159ecd8b64e");
}."${stdenv.hostPlatform.system}" or throwSystem;
# fetcher for the clickthrough artifacts (requiring manual download)
fetchClickThrough = srcFilename: hash: (requireFile {
name = srcFilename;
url = "https://www.oracle.com/database/technologies/instant-client/downloads.html";
sha256 = hash;
});
# fetcher for the non clickthrough artifacts
fetchSimple = srcFilename: hash: fetchurl {
url = "https://download.oracle.com/otn_software/linux/instantclient/193000/${srcFilename}";
sha256 = hash;
};
# pick the appropriate fetcher depending on the platform
fetcher = if stdenv.hostPlatform.system == "x86_64-linux" then fetchSimple else fetchClickThrough;
# assemble srcs
srcs = map (component:
(fetcher (srcFilename component arch version rels."${component}" or "") hashes."${component}" or ""))
components;
pname = "oracle-instantclient";
extLib = stdenv.hostPlatform.extensions.sharedLibrary; extLib = stdenv.hostPlatform.extensions.sharedLibrary;
in stdenv.mkDerivation rec { in stdenv.mkDerivation {
inherit version srcs; inherit pname version srcs;
name = "oracle-instantclient-${version}";
buildInputs = [ stdenv.cc.cc.lib ] buildInputs = [ stdenv.cc.cc.lib ]
++ optionals (stdenv.isLinux) [ libaio ] ++ optional stdenv.isLinux libaio
++ optional odbcSupport unixODBC; ++ optional odbcSupport unixODBC;
nativeBuildInputs = [ makeWrapper unzip ] nativeBuildInputs = [ makeWrapper unzip ]
@ -52,20 +101,22 @@ in stdenv.mkDerivation rec {
unpackCmd = "unzip $curSrc"; unpackCmd = "unzip $curSrc";
installPhase = '' installPhase = ''
mkdir -p "$out/"{bin,include,"share/java","share/${name}/demo/"} $lib/lib mkdir -p "$out/"{bin,include,lib,"share/java","share/${pname}-${version}/demo/"} $lib/lib
install -Dm755 {adrci,genezi,uidrvci,sqlplus} $out/bin install -Dm755 {adrci,genezi,uidrvci,sqlplus} $out/bin
install -Dm644 *${extLib}* $lib/lib install -Dm644 *${extLib}* $lib/lib
install -Dm644 *.jar $out/share/java install -Dm644 *.jar $out/share/java
install -Dm644 sdk/include/* $out/include install -Dm644 sdk/include/* $out/include
install -Dm644 sdk/demo/* $out/share/${name}/demo install -Dm644 sdk/demo/* $out/share/${pname}-${version}/demo
# provide alias
ln -sfn $out/bin/sqlplus $out/bin/sqlplus64
'';
postFixup = ''
# PECL::oci8 will not build without this # PECL::oci8 will not build without this
# this symlink only exists in dist zipfiles for some platforms # this symlink only exists in dist zipfiles for some platforms
ln -sfn $out/lib/libclntsh${extLib}.12.1 $out/lib/libclntsh${extLib} ln -sfn $out/lib/libclntsh${extLib}.12.1 $out/lib/libclntsh${extLib}
''; '' + optionalString stdenv.isDarwin ''
postFixup = optionalString stdenv.isDarwin ''
for exe in "$out/bin/"* ; do for exe in "$out/bin/"* ; do
if [ ! -L "$exe" ]; then if [ ! -L "$exe" ]; then
install_name_tool -add_rpath "$lib/lib" "$exe" install_name_tool -add_rpath "$lib/lib" "$exe"