From fa4601034fbddbf5ce22a5031bfd7a51b92fe1ee Mon Sep 17 00:00:00 2001 From: David Minton Date: Wed, 16 Aug 2023 13:43:56 -0400 Subject: [PATCH] Significantly improved how the NetCDF libraries and dependencies are found. --- buildscripts/build_all.sh | 25 +++++++- buildscripts/build_hdf5.sh | 8 ++- buildscripts/build_netcdf-c.sh | 37 +++-------- buildscripts/build_netcdf-fortran.sh | 8 ++- buildscripts/build_swiftest.sh | 16 ++--- buildscripts/build_zlib.sh | 8 ++- cmake/Modules/FindNETCDF.cmake | 94 +++++++++++++++++++++++++--- cmake/Modules/SetFortranFlags.cmake | 4 +- pyproject.toml | 6 +- setup.py | 2 + src/CMakeLists.txt | 19 ++---- 11 files changed, 160 insertions(+), 67 deletions(-) diff --git a/buildscripts/build_all.sh b/buildscripts/build_all.sh index e96590635..793c250c5 100755 --- a/buildscripts/build_all.sh +++ b/buildscripts/build_all.sh @@ -16,7 +16,30 @@ SCRIPT_DIR=$(realpath $(dirname $0)) ROOT_DIR=$(realpath ${SCRIPT_DIR}/..) BUILD_DIR="${ROOT_DIR}/build" -PREFIX=${BUILD_DIR}/usr/local +PREFIX=/usr/local + +# Parse arguments +USTMT="Usage: ${0} [-d {./build}|/path/to/build] [-p {/usr/local}|/prefix/path]" +IFORT=false +PREFIX=/usr/local +COMPILER="" +while getopts ":c:d:" ARG; do + case "${ARG}" in + d) + BUILD_DIR="${OPTARG}" + ;; + p) + PREFIX="${OPTARG}" + ;; + :) + echo "Error: -${OPTARG} requires an argument." + echo $USTMT + exit 1 + ;; + *) + ;; + esac +done mkdir -p ${BUILD_DIR} read -r OS ARCH < <($SCRIPT_DIR/get_platform.sh) diff --git a/buildscripts/build_hdf5.sh b/buildscripts/build_hdf5.sh index 2c2859168..a140a7ed0 100755 --- a/buildscripts/build_hdf5.sh +++ b/buildscripts/build_hdf5.sh @@ -87,7 +87,13 @@ if [ $COMPILER = "GNU-Mac" ]; then fi COPTS="--disable-shared --enable-build-mode=production --disable-fortran --disable-java --disable-cxx --prefix=${PREFIX} --with-zlib=${PREFIX}" ./configure ${COPTS} -make && make install +make +if [ -w ${PREFIX} ]; then + make install +else + sudo make install +fi + if [ $? -ne 0 ]; then printf "hdf5 could not be compiled.\n" exit 1 diff --git a/buildscripts/build_netcdf-c.sh b/buildscripts/build_netcdf-c.sh index c707fd6c8..37ed18363 100755 --- a/buildscripts/build_netcdf-c.sh +++ b/buildscripts/build_netcdf-c.sh @@ -47,15 +47,15 @@ export FC=${FC} export F77=${F77} export CPP=${CPP} -export HDF5_ROOT="${PREFIX}" +export HDF5_ROOT=${HDF5_ROOT:-$PREFIX} export HDF5_LIBDIR="${HDF5_ROOT}/lib" export HDF5_INCLUDE_DIR="${HDF5_ROOT}/include" export HDF5_PLUGIN_PATH="${HDF5_LIBDIR}/plugin" export NCDIR="${PREFIX}" export NFDIR="${PREFIX}" -export LD_LIBRARY_PATH="${PREFIX}/lib:${LD_LIBRARY_PATH}" -export CPPFLAGS="${CPPFLAGS} -isystem ${PREFIX}/include" -export LDFLAGS="${LDFLAGS} -L${PREFIX}/lib" +export LD_LIBRARY_PATH="${PREFIX}/lib:${HDF5_LIBDIR}:${LD_LIBRARY_PATH}" +export CPPFLAGS="${CPPFLAGS} -isystem ${PREFIX}/include -isystem ${HDF5_INCLUDE_DIR}" +export LDFLAGS="${LDFLAGS} -L${PREFIX}/lib -L${HDF5_LIBDIR}" export CPATH="${PREFIX}/include:${CPATH}" export CFLAGS="${CFLAGS} -Wno-unused-but-set-variable" @@ -75,6 +75,7 @@ printf "CPPFLAGS: ${CPPFLAGS}\n" printf "CPATH: ${CPATH}\n" printf "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH}\n" printf "LDFLAGS: ${LDFLAGS}\n" +printf "HDF5_ROOT: ${HDF5_ROOT}\n" printf "*********************************************************\n" cd ${BUILD_DIR}/netcdf-c-* @@ -84,34 +85,16 @@ if [ ! $COMPILER = "GNU-Mac" ]; then fi printf "COPTS: ${COPTS}\n" ./configure $COPTS -make && make check && make install -if [ $? -ne 0 ]; then - printf "netcdf-c could not be compiled."\n - exit 1 -fi +make && make check -if [ $COMPILER = "Intel" ]; then - export FCFLAGS="${CFLAGS} -standard-semantics" +if [ -w ${PREFIX} ]; then + make install else - export FCFLAGS="${CFLAGS}" + sudo make install fi -export FFLAGS=${CFLAGS} -export LIBS="$(${PREFIX}/bin/nc-config --libs --static)" -printf "\n" -printf "*********************************************************\n" -printf "* BUILDING NETCDF-FORTRAN STATIC LIBRARY *\n" -printf "*********************************************************\n" -cd ../netcdf-fortran-4.6.1 -./configure --disable-shared --with-pic --prefix=${PREFIX} -make && make check && make install if [ $? -ne 0 ]; then - printf "netcdf-fortran could not be compiled.\n" + printf "netcdf-c could not be compiled."\n exit 1 fi -printf "\n" -printf "*********************************************************\n" -printf "* DEPENDENCIES ARE BUILT *\n" -printf "*********************************************************\n" -printf "Dependencys are installed to: ${PREFIX}\n\n" diff --git a/buildscripts/build_netcdf-fortran.sh b/buildscripts/build_netcdf-fortran.sh index 4840d8294..2811aa715 100755 --- a/buildscripts/build_netcdf-fortran.sh +++ b/buildscripts/build_netcdf-fortran.sh @@ -82,7 +82,13 @@ printf "*********************************************************\n" cd ${BUILD_DIR}/netcdf-fortran-* ./configure --disable-shared --with-pic --disable-zstandard-plugin --prefix=${PREFIX} -make && make check && make install +make && make check i +if [ -w ${PREFIX} ]; then + make install +else + sudo make install +fi + if [ $? -ne 0 ]; then printf "netcdf-fortran could not be compiled.\n" exit 1 diff --git a/buildscripts/build_swiftest.sh b/buildscripts/build_swiftest.sh index 580ff66b2..fbd17cf8d 100755 --- a/buildscripts/build_swiftest.sh +++ b/buildscripts/build_swiftest.sh @@ -49,6 +49,11 @@ printf "Dependency libraries in ${PREFIX}\n" export DEPDIR=$PREFIX export NETCDF_FORTRAN_HOME=$DEPDIR +export HDF_ROOT=$PREFIX +export HDF5_LIBDIR="${HDF5_ROOT}/lib" +export HDF5_INCLUDE_DIR="${HDF5_ROOT}/include" +export HDF5_PLUGIN_PATH="${HDF5_LIBDIR}/plugin" + export LD_LIBRARY_PATH="${DEPDIR}/lib:${LD_LIBRARY_PATH}" export CPPFLAGS="${CPPFLAGS} -isystem ${DEPDIR}/include" export LDFLAGS="${LDFLAGS} -L${DEPDIR}/lib" @@ -59,16 +64,7 @@ if [ $COMPILER = "GNU-Mac" ]; then export LDFLAGS="${LDFLAGS} -Wl,-no_compact_unwind" printf "MACOSX_DEPLOYMENT_TARGET: ${MACOSX_DEPLOYMENT_TARGET}\n" fi -NFCFG="${DEPDIR}/bin/nf-config" -if command -v $NFCFG &> /dev/null; then - export LIBS=$($NFCFG --flibs) -else - printf "Error: Cannot find ${NFCFG}.\n" - printf "Is NetCDF-Fortran installed?\n" - exit 1 -fi -export LDFLAGS="${LDFLAGS} -L${DEPDIR}/lib" -export CFLAGS="-fPIC" + export SKBUILD_CONFIGURE_OPTIONS="-DBUILD_SHARED_LIBS=OFF" if [ $COMPILER = "Intel" ]; then diff --git a/buildscripts/build_zlib.sh b/buildscripts/build_zlib.sh index cac640084..f937819aa 100755 --- a/buildscripts/build_zlib.sh +++ b/buildscripts/build_zlib.sh @@ -73,7 +73,13 @@ printf "*********************************************************\n" cd ${BUILD_DIR}/zlib-* ./configure --prefix=${PREFIX} --static make -make install + +if [ -w ${PREFIX} ]; then + make install +else + sudo make install +fi + if [ $? -ne 0 ]; then printf "zlib could not be compiled.\n" exit 1 diff --git a/cmake/Modules/FindNETCDF.cmake b/cmake/Modules/FindNETCDF.cmake index 51a607633..a21f417d3 100644 --- a/cmake/Modules/FindNETCDF.cmake +++ b/cmake/Modules/FindNETCDF.cmake @@ -8,13 +8,91 @@ # If not, see: https://www.gnu.org/licenses. # - Finds the NetCDF libraries -set(NETCDF_FORTRAN_HOME $ENV{NETCDF_FORTRAN_HOME} CACHE STRING "Value of NetCDF library home directory") -find_path(NETCDF_INCLUDE_DIR NAMES netcdf.mod HINTS ENV NETCDF_FORTRAN_HOME PATH_SUFFIXES include) -find_library(NETCDF_FORTRAN_LIBRARY NAMES netcdff HINTS ENV NETCDF_FORTRAN_HOME PATH_SUFFIXES lib) -find_library(NETCDF_LIBRARY NAMES netcdf HINTS ENV NETCDF_FORTRAN_HOME PATH_SUFFIXES lib) -set(NETCDF_FOUND TRUE) -# Note for posterity: When building static libraries, NETCDF_FORTRAN_LIBRARY must come *before* NETCDF_LIBRARY. Otherwise you get a bunch of "undefined reference to" errors +FIND_PATH(NETCDF_INCLUDE_DIR + NAMES netcdf.mod + HINTS + ENV NETCDF_INCLUDE_DIR + ENV NETCDF_FORTRAN_HOME + ENV CPATH + PATH_SUFFIXES + include + REQUIRED +) -mark_as_advanced(NETCDF_LIBRARY NETCDF_FORTRAN_LIBRARY NETCDF_INCLUDE_DIR) -set(NETCDF_LIBRARIES ${NETCDF_FORTRAN_LIBRARY} ${NETCDF_LIBRARY} CACHE STRING "NetCDF libraries") \ No newline at end of file +MESSAGE(STATUS "NetCDF-Fortran include directory: ${NETCDF_INCLUDE_DIR}") + +IF (BUILD_SHARED_LIBS) + SET(NETCDFF "netcdff") +ELSE () + SET(NETCDFF "libnetcdff.a") + SET(NETCDF "libnetcdf.a") +ENDIF() + +FIND_LIBRARY(NETCDF_FORTRAN_LIBRARY + NAMES ${NETCDFF} + HINTS + ENV NETCDF_FORTRAN_HOME + ENV NETCDF_HOME + ENV LD_LIBRARY_PATH + PATH_SUFFIXES + lib + ${CMAKE_LIBRARY_ARCHITECTURE} + REQUIRED +) + +MESSAGE(STATUS "NetCDF-Fortran Library: ${NETCDF_FORTRAN_LIBRARY}") + +IF (BUILD_SHARED_LIBS) + SET(NETCDF_LIBRARIES ${NETCDF_FORTRAN_LIBRARY} CACHE STRING "NetCDF Fortran library") +ELSE () + FIND_LIBRARY(NETCDF_LIBRARY + NAMES ${NETCDF} + HINTS + ENV NETCDF_HOME + ENV LD_LIBRARY_PATH + PATH_SUFFIXES + lib + ${CMAKE_LIBRARY_ARCHITECTURE} + REQUIRED + ) + + MESSAGE(STATUS "NetCDF-C Library: ${NETCDF_LIBRARY}") + + FIND_PATH(NCBIN + NAMES nc-config + HINTS + ENV NETCDF_HOME + ENV PATH + PATH_SUFFIXES + bin + ) + + IF (NCBIN) # The nc-config utility is available. Parse its output for unique flags + SET(CMD "${NCBIN}/nc-config") + LIST(APPEND CMD "--libs") + LIST(APPEND CMD "--static") + MESSAGE(STATUS "NetCDF configuration command: ${CMD}") + EXECUTE_PROCESS(COMMAND ${CMD} OUTPUT_VARIABLE EXTRA_FLAGS ERROR_VARIABLE ERR RESULT_VARIABLE RES OUTPUT_STRIP_TRAILING_WHITESPACE) + IF (EXTRA_FLAGS) + SEPARATE_ARGUMENTS(EXTRA_FLAGS NATIVE_COMMAND "${EXTRA_FLAGS}") + LIST(REMOVE_DUPLICATES EXTRA_FLAGS) + LIST(FILTER EXTRA_FLAGS EXCLUDE REGEX "netcdf+|-L+") + MESSAGE(STATUS "Extra library flags: ${EXTRA_FLAGS}") + ELSE () + MESSAGE(STATUS "Cannot execute ${CMD}") + MESSAGE(STATUS "OUTPUT: ${EXTRA_FLAGS}") + MESSAGE(STATUS "RESUL : ${RES}") + MESSAGE(STATUS "ERROR : ${ERR}") + MESSAGE(FATAL_ERROR "Cannot configure NetCDF for static") + ENDIF () + ELSE () + MESSAGE(FATAL_ERROR "Cannot find nc-config") + ENDIF () + + # Note for posterity: When building static libraries, NETCDF_FORTRAN_LIBRARY must come *before* NETCDF_LIBRARY. Otherwise you get a bunch of "undefined reference to" errors + SET(NETCDF_LIBRARIES ${NETCDF_FORTRAN_LIBRARY} ${NETCDF_LIBRARY} ${EXTRA_FLAGS} CACHE STRING "NetCDF Fortran and dependant static libraries") +ENDIF () + +SET(NETCDF_FOUND TRUE) +MARK_AS_ADVANCED(NETCDF_LIBRARIES NETCDF_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/Modules/SetFortranFlags.cmake b/cmake/Modules/SetFortranFlags.cmake index eebd974c6..23cccd7a8 100644 --- a/cmake/Modules/SetFortranFlags.cmake +++ b/cmake/Modules/SetFortranFlags.cmake @@ -104,11 +104,13 @@ ELSEIF (COMPILER_OPTIONS STREQUAL "Intel") SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}" Fortran "-pad" # Intel "/Qpad" # Intel Windows - ) ENDIF () IF (NOT BUILD_SHARED_LIBS) + SET_COMPILE_FLAG(CMAKE_FORTRAN_FLAGS "${CMAKE_FORTRAN_FLAGS}" + Fortran "-fPIC" + ) IF (COMPILER_OPTIONS STREQUAL "Intel") # Use static Intel libraries diff --git a/pyproject.toml b/pyproject.toml index ce98167b0..273cf28c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,10 +9,8 @@ requires = [ build-backend = "setuptools.build_meta" [tool.cibuildwheel.linux] -environment = {SCRIPT_DIR="buildscripts", BUILD_DIR="build", PREFIX="/usr/local", SKBUILD_CONFIGURE_OPTIONS="-DBUILD_SHARED_LIBS=OFF", CFLAGS="-fPIC", CPPFLAGS="-isystem /usr/local/include", NETCDF_FORTRAN_HOME="/usr/local", LIBS="-lm -lz -ldl"} +environment = {SKBUILD_CONFIGURE_OPTIONS="-DBUILD_SHARED_LIBS=OFF",CPATH="/usr:/usr/local",LD_LIBRARY_PATH="/usr/lib:/usr/lib64:/usr/local/lib:/usr/lib/x86_64-linux-gnu:/usr/lib/aarch64-linux-gnu"} before-all = [ - "yum install wget m4 doxygen -y", - "bash ${SCRIPT_DIR}/fetch_dependencies.sh -d ${BUILD_DIR}", - "bash ${SCRIPT_DIR}/build_dependencies.sh -c GNU-Linux -p ${PREFIX}" + "yum install netcdf-fortran-static netcdf-static hdf5-static -y", ] \ No newline at end of file diff --git a/setup.py b/setup.py index 545aab4f1..299382808 100644 --- a/setup.py +++ b/setup.py @@ -11,6 +11,8 @@ """ from skbuild import setup +import os +import subprocess with open('version.txt') as version_file: version = version_file.read().strip() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 610160ca0..fb07c789e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -140,6 +140,10 @@ ELSEIF(BT STREQUAL "PROFILE") ADD_DEFINITIONS(-DPROFILE) ENDIF() +# Define the executable name +SET(SWIFTEST_DRIVER swiftest_driver) +ADD_EXECUTABLE(${SWIFTEST_DRIVER} ${DRIVER_src}) + ##################################################### # Add the needed libraries ##################################################### @@ -147,21 +151,10 @@ ENDIF() SET(SWIFTEST_LIBRARY swiftest) ADD_LIBRARY(${SWIFTEST_LIBRARY} ${SWIFTEST_src}) -# Define the executable name -SET(SWIFTEST_DRIVER swiftest_driver) -ADD_EXECUTABLE(${SWIFTEST_DRIVER} ${DRIVER_src}) - -MESSAGE(STATUS "NetCDF Include directory: ${NETCDF_INCLUDE_DIR}") TARGET_INCLUDE_DIRECTORIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_INCLUDE_DIR}) TARGET_INCLUDE_DIRECTORIES(${SWIFTEST_DRIVER} PUBLIC ${NETCDF_INCLUDE_DIR}) - -IF (BUILD_SHARED_LIBS) - TARGET_LINK_LIBRARIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_LIBRARIES}) - TARGET_LINK_LIBRARIES(${SWIFTEST_DRIVER} PUBLIC ${SWIFTEST_LIBRARY}) -ELSE () - TARGET_LINK_LIBRARIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_LIBRARIES} $ENV{LIBS}) - TARGET_LINK_LIBRARIES(${SWIFTEST_DRIVER} PUBLIC ${SWIFTEST_LIBRARY} ${NETCDF_LIBRARIES} $ENV{LIBS}) -ENDIF (BUILD_SHARED_LIBS) +TARGET_LINK_LIBRARIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_LIBRARIES}) +TARGET_LINK_LIBRARIES(${SWIFTEST_DRIVER} PUBLIC ${SWIFTEST_LIBRARY} ${NETCDF_LIBRARIES}) IF(USE_OPENMP OR USE_SIMD) SET_PROPERTY(TARGET ${SWIFTEST_LIBRARY} ${SWIFTEST_DRIVER} APPEND_STRING PROPERTY COMPILE_FLAGS "${OpenMP_Fortran_FLAGS} ")