Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

hdf4: modernize, fix cross #348334

Merged
merged 3 commits into from
Nov 5, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 92 additions & 71 deletions pkgs/tools/misc/hdf4/default.nix
Original file line number Diff line number Diff line change
@@ -1,99 +1,114 @@
{ lib
, stdenv
, fetchpatch
, fetchurl
, fixDarwinDylibNames
, cmake
, libjpeg
, uselibtirpc ? stdenv.hostPlatform.isLinux
, libtirpc
, zlib
, szipSupport ? false
, szip
, javaSupport ? false
, jdk
, fortranSupport ? false
, gfortran
, netcdfSupport ? false
{
lib,
stdenv,
fetchpatch,
fetchurl,
fixDarwinDylibNames,
cmake,
libjpeg,
uselibtirpc ? stdenv.hostPlatform.isLinux,
libtirpc,
zlib,
szipSupport ? false,
szip,
javaSupport ? false,
jdk,
fortranSupport ? false,
gfortran,
netcdfSupport ? false,
}:
stdenv.mkDerivation rec {

stdenv.mkDerivation (finalAttrs: {
pname = "hdf";
version = "4.2.15";

src = fetchurl {
url = "https://support.hdfgroup.org/ftp/HDF/releases/HDF${version}/src/hdf-${version}.tar.bz2";
sha256 = "04nbgfxyj5jg4d6sr28162cxbfwqgv0sa7vz1ayzvm8wbbpkbq5x";
url = "https://support.hdfgroup.org/ftp/HDF/releases/HDF${finalAttrs.version}/src/hdf-${finalAttrs.version}.tar.bz2";
hash = "sha256-veA171oc1f29Cn8fpcF+mLvVmTABiaxNI08W6bt7yxI=";
};

patches = [
# Note that the PPC, SPARC and s390 patches are only needed so the aarch64 patch applies cleanly
(fetchpatch {
url = "https://src.fedoraproject.org/rpms/hdf/raw/edbe5f49646b609f5bc9aeeee5a2be47e9556e8c/f/hdf-ppc.patch";
sha256 = "0dbbfpsvvqzy9zyfv38gd81zzc44gxjib9sd8scxqnkkqprj6jq0";
hash = "sha256-AEsj88VzWtyZRk2nFWV/hLD/A2oPje38T/7jvfV1azU=";
})
(fetchpatch {
url = "https://src.fedoraproject.org/rpms/hdf/raw/edbe5f49646b609f5bc9aeeee5a2be47e9556e8c/f/hdf-4.2.4-sparc.patch";
sha256 = "0ip4prcjpa404clm87ib7l71605mws54x9492n9pbz5yb51r9aqh";
hash = "sha256-EKuUQ1m+/HWTFYmkTormtQATDj0rHlQpI4CoK1m+5EY=";
})
(fetchpatch {
url = "https://src.fedoraproject.org/rpms/hdf/raw/edbe5f49646b609f5bc9aeeee5a2be47e9556e8c/f/hdf-s390.patch";
sha256 = "0aiqbr4s1l19y3r3y4wjd5fkv9cfc8rlr4apbh1p0d57wyvqa7i3";
hash = "sha256-Ix6Ft+enNHADXFeRTDNijqU9XWmSEz/y8CnQoEleOCo=";
})
(fetchpatch {
url = "https://src.fedoraproject.org/rpms/hdf/raw/edbe5f49646b609f5bc9aeeee5a2be47e9556e8c/f/hdf-arm.patch";
sha256 = "157k1avvkpf3x89m1fv4a1kgab6k3jv74rskazrmjivgzav4qaw3";
hash = "sha256-gytMtvpvR1nzV1NncrYc0yz1ZlBku1AT6sPdubcK85Q=";
})
(fetchpatch {
url = "https://src.fedoraproject.org/rpms/hdf/raw/edbe5f49646b609f5bc9aeeee5a2be47e9556e8c/f/hdf-aarch64.patch";
sha256 = "112svcsilk16ybbsi8ywnxfl2p1v44zh3rfn4ijnl8z08vfqrvvs";
hash = "sha256-eu+M3UbgI2plJNblAT8hO1xBXbfco6jX8iZMGjXbWoQ=";
})
./darwin-aarch64.patch
];

nativeBuildInputs = [
cmake
] ++ lib.optionals stdenv.hostPlatform.isDarwin [
fixDarwinDylibNames
] ++ lib.optional fortranSupport gfortran;
nativeBuildInputs =
[
cmake
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
fixDarwinDylibNames
]
++ lib.optional fortranSupport gfortran;

buildInputs = [
libjpeg
zlib
]
++ lib.optional javaSupport jdk
++ lib.optional szipSupport szip
++ lib.optional uselibtirpc libtirpc;
buildInputs =
[
libjpeg
zlib
]
++ lib.optional javaSupport jdk
++ lib.optional szipSupport szip
++ lib.optional uselibtirpc libtirpc;

preConfigure = lib.optionalString uselibtirpc ''
# Make tirpc discovery work with CMAKE_PREFIX_PATH
substituteInPlace config/cmake/FindXDR.cmake \
--replace 'find_path(XDR_INCLUDE_DIR NAMES rpc/types.h PATHS "/usr/include" "/usr/include/tirpc")' \
'find_path(XDR_INCLUDE_DIR NAMES rpc/types.h PATH_SUFFIXES include/tirpc)'
'' + lib.optionalString szipSupport ''
export SZIP_INSTALL=${szip}
'';
preConfigure =
lib.optionalString uselibtirpc ''
# Make tirpc discovery work with CMAKE_PREFIX_PATH
substituteInPlace config/cmake/FindXDR.cmake \
--replace-fail 'find_path(XDR_INCLUDE_DIR NAMES rpc/types.h PATHS "/usr/include" "/usr/include/tirpc")' \
'find_path(XDR_INCLUDE_DIR NAMES rpc/types.h PATH_SUFFIXES include/tirpc)'
''
+ lib.optionalString szipSupport ''
export SZIP_INSTALL=${szip}
'';

cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
"-DHDF4_BUILD_TOOLS=ON"
"-DHDF4_BUILD_UTILS=ON"
"-DHDF4_BUILD_WITH_INSTALL_NAME=OFF"
"-DHDF4_ENABLE_JPEG_LIB_SUPPORT=ON"
"-DHDF4_ENABLE_NETCDF=${if netcdfSupport then "ON" else "OFF"}"
"-DHDF4_ENABLE_Z_LIB_SUPPORT=ON"
"-DJPEG_DIR=${libjpeg}"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out JPEG_DIR no longer does anything, so I removed it. Maybe the library detection got better.

] ++ lib.optionals javaSupport [
"-DHDF4_BUILD_JAVA=ON"
"-DJAVA_HOME=${jdk}"
] ++ lib.optionals szipSupport [
"-DHDF4_ENABLE_SZIP_ENCODING=ON"
"-DHDF4_ENABLE_SZIP_SUPPORT=ON"
] ++ (if fortranSupport
then [
"-DHDF4_BUILD_FORTRAN=ON"
"-DCMAKE_Fortran_FLAGS=-fallow-argument-mismatch"
]
else [ "-DHDF4_BUILD_FORTRAN=OFF" ]
);
cmakeFlags =
[
(lib.cmakeBool "BUILD_SHARED_LIBS" true)
(lib.cmakeBool "HDF4_BUILD_TOOLS" true)
(lib.cmakeBool "HDF4_BUILD_UTILS" true)
(lib.cmakeBool "HDF4_BUILD_WITH_INSTALL_NAME" false)
(lib.cmakeBool "HDF4_ENABLE_JPEG_LIB_SUPPORT" true)
(lib.cmakeBool "HDF4_ENABLE_Z_LIB_SUPPORT" true)
(lib.cmakeBool "HDF4_ENABLE_NETCD" netcdfSupport)
(lib.cmakeBool "HDF4_BUILD_FORTRAN" fortranSupport)
(lib.cmakeBool "HDF4_ENABLE_SZIP_SUPPORT" szipSupport)
(lib.cmakeBool "HDF4_ENABLE_SZIP_ENCODING" szipSupport)
(lib.cmakeBool "HDF4_BUILD_JAVA" javaSupport)
(lib.cmakeBool "BUILD_TESTING" finalAttrs.doCheck)
]
++ lib.optionals javaSupport [
(lib.cmakeFeature "JAVA_HOME" "${jdk}")
]
++ lib.optionals fortranSupport [
(lib.cmakeFeature "CMAKE_Fortran_FLAGS" "-fallow-argument-mismatch")
]
# using try_run would set these, but that requires a cross-compiling emulator to be available
# instead, we mark them as if the try_run calls returned a non-zero exit code
++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
(lib.cmakeFeature "TEST_LFS_WORKS_RUN" "1")
(lib.cmakeFeature "H4_PRINTF_LL_TEST_RUN" "1")
(lib.cmakeFeature "H4_PRINTF_LL_TEST_RUN__TRYRUN_OUTPUT" "")
];

env = lib.optionalAttrs stdenv.cc.isClang {
NIX_CFLAGS_COMPILE = toString [
Expand All @@ -102,7 +117,7 @@ stdenv.mkDerivation rec {
];
};

doCheck = true;
doCheck = stdenv.buildPlatform.canExecute stdenv.hostPlatform;

excludedTests = lib.optionals stdenv.hostPlatform.isDarwin [
"MFHDF_TEST-hdftest"
Expand All @@ -113,15 +128,21 @@ stdenv.mkDerivation rec {

checkPhase =
let
excludedTestsRegex = lib.optionalString (excludedTests != [ ]) "(${lib.concatStringsSep "|" excludedTests})";
excludedTestsRegex = lib.optionalString (
finalAttrs.excludedTests != [ ]
) "(${lib.concatStringsSep "|" finalAttrs.excludedTests})";
in
''
runHook preCheck
ctest -E "${excludedTestsRegex}" --output-on-failure
runHook postCheck
'';

outputs = [ "bin" "dev" "out" ];
outputs = [
"bin"
"dev"
"out"
];

postInstall = ''
moveToOutput bin "$bin"
Expand All @@ -145,4 +166,4 @@ stdenv.mkDerivation rec {
platforms = platforms.unix;
license = licenses.bsdOriginal;
};
}
})