diff --git a/CMakeLists.txt b/CMakeLists.txt index adc5c9436..b55b4c73c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,12 @@ IF (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.27") CMAKE_POLICY(SET CMP0148 OLD) ENDIF () +# Set some options the user may choose +OPTION(USE_COARRAY "Use Coarray Fortran for parallelization of test particles" OFF) +OPTION(USE_OPENMP "Use OpenMP for parallelization" ON) +OPTION(USE_SIMD "Use SIMD vectorization" ON) +OPTION(BUILD_SHARED_LIBS "Build using shared libraries" ON) + INCLUDE(GNUInstallDirs) IF (SKBUILD) SET(INSTALL_BINDIR ${SKBUILD_PLATLIB_DIR}/${SKBUILD_PROJECT_NAME}) @@ -55,17 +61,13 @@ ELSE () MESSAGE(FATAL_ERROR "Compiler ${CMAKE_Fortran_COMPILER_ID} not recognized!") ENDIF () -# Set some options the user may choose -OPTION(USE_COARRAY "Use Coarray Fortran for parallelization of test particles" OFF) -OPTION(USE_OPENMP "Use OpenMP for parallelization" ON) -OPTION(USE_SIMD "Use SIMD vectorization" ON) -OPTION(BUILD_SHARED_LIBS "Build using shared libraries" ON) - # The following section is modified from Numpy f2py documentation IF(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) MESSAGE(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there.\n") ENDIF() +FIND_PACKAGE(NETCDF_FORTRAN REQUIRED) + # Ensure scikit-build modules FIND_PACKAGE(Python COMPONENTS Interpreter Development.Module REQUIRED) @@ -76,13 +78,14 @@ SET(PY "${CMAKE_SOURCE_DIR}/swiftest") ##################################### # Tell how to install this executable ##################################### -IF(WIN32) +IF(CMAKE_SYSTEM_NAME STREQUAL "Windows") SET(CMAKE_INSTALL_PREFIX "C:\\Program Files\\swiftest") FILE(TO_CMAKE_PATH ${CMAKE_INSTALL_PREFIX} CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Path for install") ELSE() SET(CMAKE_INSTALL_PREFIX /usr/local CACHE PATH "Path for install") -ENDIF(WIN32) +ENDIF() + # Make sure paths are correct for Unix or Windows style FILE(TO_CMAKE_PATH ${SRC} SRC) diff --git a/cmake/Modules/FindNETCDF.cmake b/cmake/Modules/FindNETCDF_Fortran.cmake similarity index 60% rename from cmake/Modules/FindNETCDF.cmake rename to cmake/Modules/FindNETCDF_Fortran.cmake index bb69254e2..3a0e648f5 100644 --- a/cmake/Modules/FindNETCDF.cmake +++ b/cmake/Modules/FindNETCDF_Fortran.cmake @@ -50,7 +50,7 @@ ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Windows") ENDIF () IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") - FIND_PATH(NFBIN + FIND_FILE(NFBIN NAMES nf-config HINTS NFPREFIX_DIR @@ -61,7 +61,7 @@ IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") ) IF (NFBIN) - SET(CMD "${NFBIN}/nf-config") + SET(CMD "${NFBIN}") LIST(APPEND CMD "--includedir") MESSAGE(STATUS "Searching for NetCDF-Fortran include directory using ${CMD}") EXECUTE_PROCESS(COMMAND ${CMD} OUTPUT_VARIABLE NFINCLUDE_DIR ERROR_VARIABLE ERR RESULT_VARIABLE RES OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -74,7 +74,7 @@ IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") MESSAGE(STATUS "ERROR : ${ERR}") ENDIF () - SET(CMD "${NFBIN}/nf-config") + SET(CMD "${NFBIN}") LIST(APPEND CMD "--prefix") MESSAGE(STATUS "Searching for NetCDF-Fortran library directory using ${CMD}") EXECUTE_PROCESS(COMMAND ${CMD} OUTPUT_VARIABLE NFPREFIX_DIR ERROR_VARIABLE ERR RESULT_VARIABLE RES OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -89,7 +89,7 @@ IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") ENDIF() ENDIF() -FIND_PATH(NETCDF_INCLUDE_DIR +FIND_PATH(NETCDF_FORTRAN_INCLUDE_DIR NAMES netcdf.mod HINTS ${NFINCLUDE_DIR} @@ -121,7 +121,7 @@ ELSE () ENDIF() ENDIF() -FIND_LIBRARY(NETCDF_FORTRAN_LIBRARY +FIND_LIBRARY(NFLIB NAMES ${NETCDFF} PATHS ${NFPREFIX_DIR} @@ -133,105 +133,33 @@ FIND_LIBRARY(NETCDF_FORTRAN_LIBRARY ${CMAKE_LIBRARY_ARCHITECTURE} REQUIRED ) - -IF (BUILD_SHARED_LIBS) - SET(NETCDF_LIBRARIES ${NETCDF_FORTRAN_LIBRARY} CACHE STRING "NetCDF Fortran library") -ELSE () - FIND_LIBRARY(NETCDF_LIBRARY - NAMES ${NETCDF} - HINTS - ${NCPREFIX_DIR} - ENV NETCDF_HOME - ENV LD_LIBRARY_PATH +ADD_LIBRARY(NETCDF_FORTRAN_LIBRARY SHARED IMPORTED) +IF (CMAKE_SYSTEM_NAME STREQUAL "Windows") + # Get the DLL added in + FIND_FILE(NFDLL + NAMES "netcdff.dll" + HINTS + NFPREFIX_DIR + ENV NETCDF_FORTRAN_HOME + ENV PATH PATH_SUFFIXES - lib - ${CMAKE_LIBRARY_ARCHITECTURE} - REQUIRED + bin ) + SET_TARGET_PROPERTIES(NETCDF_FORTRAN_LIBRARY PROPERTIES + IMPORTED_IMPLIB "${NFLIB}" + IMPORTED_LOCATION "${NFDLL}" + INTERFACE_INCLUDE_DIRECTORIES "${NETCDF_FORTRAN_INCLUDE_DIR}" + ) + MESSAGE(STATUS "NetCDF-Fortran dll: ${NFDLL}") +ELSE () + SET_TARGET_PROPERTIES(NETCDF_FORTRAN_LIBRARY PROPERTIES + IMPORTED_LOCATION "${NFLIB}" + INTERFACE_INCLUDE_DIRECTORIES "${NETCDF_FORTRAN_INCLUDE_DIR}" + ) +ENDIF() + +MESSAGE(STATUS "NetCDF-Fortran library: ${NFLIB}") +MESSAGE(STATUS "NetCDF-Fortran include directory: ${NETCDF_FORTRAN_INCLUDE_DIR}") - IF (CMAKE_SYSTEM_NAME STREQUAL "Windows") - FIND_LIBRARY(HDF5_LIBRARY - NAMES ${HDF5} - HINTS - ${H5PREFIX_DIR} - ENV HDF5_ROOT - ENV LD_LIBRARY_PATH - PATH_SUFFIXES - lib - ${CMAKE_LIBRARY_ARCHITECTURE} - REQUIRED - ) - - FIND_LIBRARY(HDF5_HL_LIBRARY - NAMES ${HDF5_HL} - HINTS - ${H5PREFIX_DIR} - ENV HDF5_ROOT - ENV LD_LIBRARY_PATH - PATH_SUFFIXES - lib - ${CMAKE_LIBRARY_ARCHITECTURE} - REQUIRED - ) - - FIND_LIBRARY(Z_LIBRARY - NAMES ${ZLIB} - HINTS - ${ZPREFIX_DIR} - ENV ZLIB_ROOT - ENV LD_LIBRARY_PATH - PATH_SUFFIXES - lib - ${CMAKE_LIBRARY_ARCHITECTURE} - REQUIRED - ) - - LIST(APPEND EXTRA_FLAGS ${HDF5_LIBRARY} ${HDF5_HL_LIBRARY} ${Z_LIBRARY}) - - ELSE () - 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+") - 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 () - ENDIF() - - IF (DEFINED ENV{LIBS}) - STRING(STRIP "$ENV{LIBS}" LIBS) - SEPARATE_ARGUMENTS(LIBS NATIVE_COMMAND "${LIBS}") - LIST(APPEND EXTRA_FLAGS ${LIBS}) - 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 () -MESSAGE(STATUS "NetCDF libraries: ${NETCDF_LIBRARIES}") -MESSAGE(STATUS "NetCDF include directory: ${NETCDF_INCLUDE_DIR}") - -SET(NETCDF_FOUND TRUE) -MARK_AS_ADVANCED(NETCDF_LIBRARIES NETCDF_INCLUDE_DIR) \ No newline at end of file +SET(NETCDF_FORTRAN_FOUND TRUE) +MARK_AS_ADVANCED(NETCDF_FORTRAN_LIBRARY NETCDF_FORTRAN_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/Modules/SetUpNetCDF.cmake b/cmake/Modules/SetUpNetCDF.cmake deleted file mode 100644 index fad06d4f5..000000000 --- a/cmake/Modules/SetUpNetCDF.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2022 - David Minton, Carlisle Wishard, Jennifer Pouplin, Jake Elliott, & Dana Singh -# This file is part of Swiftest. -# Swiftest is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -# Swiftest is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty -# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -# You should have received a copy of the GNU General Public License along with Swiftest. -# If not, see: https://www.gnu.org/licenses. - -# Find NetCDF if not already found -IF(NOT NETCDF_FOUND) - ENABLE_LANGUAGE(C) # Some libraries need a C compiler to find - FIND_PACKAGE(NETCDF REQUIRED) -ENDIF(NOT NETCDF_FOUND) - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a35d9a9ba..548ea7b83 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -126,16 +126,16 @@ ADD_EXECUTABLE(${SWIFTEST_DRIVER} ${DRIVER_src}) # Add the needed libraries ##################################################### # Create a library from the source files, except the driver -INCLUDE(SetUpNetCDF) + ADD_LIBRARY(${SWIFTEST_LIBRARY} ${SWIFTEST_src}) IF (NOT BUILD_SHARED_LIBS) SET_PROPERTY(TARGET ${SWIFTEST_LIBRARY} PROPERTY POSITION_INDEPENDENT_CODE) ENDIF () -TARGET_INCLUDE_DIRECTORIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_INCLUDE_DIR}) -TARGET_INCLUDE_DIRECTORIES(${SWIFTEST_DRIVER} PUBLIC ${NETCDF_INCLUDE_DIR}) -TARGET_LINK_LIBRARIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_LIBRARIES}) -TARGET_LINK_LIBRARIES(${SWIFTEST_DRIVER} PUBLIC ${SWIFTEST_LIBRARY} ${NETCDF_LIBRARIES}) +TARGET_INCLUDE_DIRECTORIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_FORTRAN_INCLUDE_DIR}) +TARGET_INCLUDE_DIRECTORIES(${SWIFTEST_DRIVER} PUBLIC ${NETCDF_FORTRAN_INCLUDE_DIR}) +TARGET_LINK_LIBRARIES(${SWIFTEST_LIBRARY} PUBLIC ${NETCDF_FORTRAN_LIBRARY}) +TARGET_LINK_LIBRARIES(${SWIFTEST_DRIVER} PUBLIC ${SWIFTEST_LIBRARY} ${NETCDF_FORTRAN_LIBRARY}) IF(USE_OPENMP OR USE_SIMD) SET_PROPERTY(TARGET ${SWIFTEST_LIBRARY} ${SWIFTEST_DRIVER} APPEND_STRING PROPERTY COMPILE_FLAGS "${OpenMP_Fortran_FLAGS} ") diff --git a/swiftest/CMakeLists.txt b/swiftest/CMakeLists.txt index 31114fd6d..243cf93fb 100644 --- a/swiftest/CMakeLists.txt +++ b/swiftest/CMakeLists.txt @@ -33,7 +33,7 @@ PYTHON_ADD_LIBRARY(${SWIFTEST_BINDINGS} MODULE "${CMAKE_CURRENT_BINARY_DIR}/${SW IF (NOT BUILD_SHARED_LIBS) SET_PROPERTY(TARGET ${SWIFTEST_BINDINGS} PROPERTY POSITION_INDEPENDENT_CODE) - TARGET_LINK_LIBRARIES(${SWIFTEST_BINDINGS} PUBLIC ${SWIFTEST_LIBRARY} ${NETCDF_LIBRARIES}) + TARGET_LINK_LIBRARIES(${SWIFTEST_BINDINGS} PUBLIC ${SWIFTEST_LIBRARY} ${NETCDF_FORTRAN_LIBRARY}) ELSE () TARGET_LINK_LIBRARIES(${SWIFTEST_BINDINGS} PUBLIC ${SWIFTEST_LIBRARY}) ENDIF ()