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

merge and test first level cmake changes from @wdeconinck fesom/feature/cmake-improvements #518

Closed
wants to merge 13 commits into from
Closed
Show file tree
Hide file tree
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
33 changes: 29 additions & 4 deletions cmake/FindNETCDF.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,13 @@ if(CMAKE_Fortran_COMPILER_LOADED)
if(HAVE_Fortran_NETCDF)
set(NETCDF_Fortran_INCLUDE_DIRECTORIES "")
set(NETCDF_Fortran_LIBRARIES "")
set(NETCDF_Fortran_FOUND 1)
else()
find_path(NETCDF_Fortran_INCLUDE_DIRECTORIES netcdf.inc HINTS $ENV{NETCDF_DIR}/include ENV NETCDF_Fortran_INCLUDE_DIRECTORIES)
find_path(NETCDF_Fortran_INCLUDE_DIRECTORIES netcdf.inc HINTS $ENV{NETCDF_ROOT}/include $ENV{NETCDF_DIR}/include $ENV{NETCDF4_DIR}/include ENV NETCDF_Fortran_INCLUDE_DIRECTORIES)
find_library(NETCDF_Fortran_LIBRARIES netcdff HINTS ${NETCDF_Fortran_INCLUDE_DIRECTORIES}/../lib)
if( NETCDF_Fortran_INCLUDE_DIRECTORIES AND NETCDF_Fortran_LIBRARIES )
set(NETCDF_Fortran_FOUND 1)
endif()
endif()
endif()

Expand All @@ -27,14 +31,18 @@ if(CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
if(HAVE_C_NETCDF)
set(NETCDF_C_INCLUDE_DIRECTORIES "")
set(NETCDF_C_LIBRARIES "")
set(NETCDF_C_FOUND 1)
else()
find_path(NETCDF_C_INCLUDE_DIRECTORIES netcdf.h HINTS $ENV{NETCDF_DIR}/include ENV NETCDF_C_INCLUDE_DIRECTORIES)
find_path(NETCDF_C_INCLUDE_DIRECTORIES netcdf.h HINTS $ENV{NETCDF_ROOT}/include $ENV{NETCDF_DIR}/include $ENV{NETCDF4_DIR}/include ENV NETCDF_C_INCLUDE_DIRECTORIES)
find_library(NETCDF_C_LIBRARIES netcdf HINTS ${NETCDF_C_INCLUDE_DIRECTORIES}/../lib)
if( NETCDF_C_INCLUDE_DIRECTORIES AND NETCDF_C_LIBRARIES )
set(NETCDF_C_FOUND 1)
endif()
endif()
endif()

if(CMAKE_CXX_COMPILER_LOADED)
find_path(NETCDF_CXX_INCLUDE_DIRECTORIES netcdf HINTS $ENV{NETCDF_DIR}/include ENV NETCDF_CXX_INCLUDE_DIRECTORIES)
find_path(NETCDF_CXX_INCLUDE_DIRECTORIES netcdf HINTS $ENV{NETCDF_ROOT}/include $ENV{NETCDF_DIR}/include $ENV{NETCDF4_DIR} ENV NETCDF_CXX_INCLUDE_DIRECTORIES)
# the cray toolchain (e.g. hlrn) disables dynamic linking by default. to enable it at build time do e.g. "CRAYPE_LINK_TYPE=dynamic make".
find_library(NETCDF_CXX_LIBRARIES NAMES netcdf_c++4 netcdf-cxx4 HINTS ${NETCDF_CXX_INCLUDE_DIRECTORIES}/../lib)
if(NETCDF_CXX_INCLUDE_DIRECTORIES AND NETCDF_C_INCLUDE_DIRECTORIES)
Expand All @@ -43,4 +51,21 @@ if(CMAKE_CXX_COMPILER_LOADED)
if(NETCDF_CXX_LIBRARIES AND NETCDF_C_LIBRARIES)
list(APPEND NETCDF_CXX_LIBRARIES ${NETCDF_C_LIBRARIES})
endif()
endif()
if( NETCDF_CXX_INCLUDE_DIRECTORIES AND NETCDF_CXX_LIBRARIES )
set(NETCDF_CXX_FOUND 1)
endif()
endif()

if(NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
set(${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS C)
endif()

unset({CMAKE_FIND_PACKAGE_NAME}_REQUIRED_VARS)
foreach(COMP C CXX Fortran)
if("${COMP}" IN_LIST ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
list(APPEND ${CMAKE_FIND_PACKAGE_NAME}_REQUIRED_VARS NETCDF_${COMP}_FOUND)
endif()
endforeach()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} HANDLE_COMPONENTS REQUIRED_VARS ${CMAKE_FIND_PACKAGE_NAME}_REQUIRED_VARS)

51 changes: 51 additions & 0 deletions cmake/fesom_export.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

macro( fesom_export )

set( options )
set( single_value_args )
set( multi_value_args TARGETS )

cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )

set( PROJECT_TARGETS_FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake" )
file( REMOVE ${PROJECT_TARGETS_FILE} )


foreach( tgt ${_PAR_TARGETS} )
install( TARGETS ${tgt}
EXPORT ${PROJECT_NAME}-targets
RUNTIME DESTINATION ${INSTALL_BIN_DIR}
LIBRARY DESTINATION ${INSTALL_LIB_DIR}
ARCHIVE DESTINATION ${INSTALL_LIB_DIR} )
set_target_properties( ${tgt} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
export( TARGETS ${tgt} APPEND FILE "${PROJECT_TARGETS_FILE}" )
endforeach()

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${PROJECT_NAME}-config-version.cmake"
VERSION ${${PROJECT_NAME}_VERSION}
COMPATIBILITY AnyNewerVersion)

if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-config.cmake.in )
configure_package_config_file(${PROJECT_NAME}-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
INSTALL_DESTINATION ${INSTALL_CMAKE_DIR})
else()
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake.in "include(${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}-targets.cmake)")
configure_package_config_file(${PROJECT_NAME}-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
INSTALL_DESTINATION ${INSTALL_CMAKE_DIR})
endif()

install(EXPORT ${PROJECT_NAME}-targets DESTINATION "${INSTALL_CMAKE_DIR}")
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
DESTINATION "${INSTALL_CMAKE_DIR}")

install( DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/${CMAKE_CFG_INTDIR}
DESTINATION module/${PROJECT_NAME}
COMPONENT modules )

endmacro()
143 changes: 143 additions & 0 deletions cmake/fesom_setup.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# To a large degree this follows the ecbuild setup
message("[${PROJECT_NAME}]")

### Setup project

set(BUILD_SHARED_LIBS ON CACHE BOOL "Default to using shared libs")
set(CMAKE_LINK_DEPENDS_NO_SHARED ON) # relink of downstream libraries not required when shared library is rebuilt

# Default build type: Release
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")

# Set location to look for find_package modules
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/../cmake ${CMAKE_MODULE_PATH})

# Set Fortran module directory
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/module/${PROJECT_NAME} )

# Build-dir destinations
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# Set install directories
include(GNUInstallDirs)
if( NOT INSTALL_BIN_DIR )
set( INSTALL_BIN_DIR ${CMAKE_INSTALL_BINDIR} )
endif()
if( NOT INSTALL_LIB_DIR )
set( INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR} )
endif()
if( NOT INSTALL_INCLUDE_DIR )
set( INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR} )
endif()
set( INSTALL_CMAKE_DIR ${INSTALL_LIB_DIR}/cmake/${PROJECT_NAME} )

mark_as_advanced( INSTALL_BIN_DIR )
mark_as_advanced( INSTALL_LIB_DIR )
mark_as_advanced( INSTALL_INCLUDE_DIR )
mark_as_advanced( INSTALL_CMAKE_DIR )

# make sure nothing breaks if INSTALL_LIB_DIR is not lib
if( NOT INSTALL_LIB_DIR STREQUAL "lib" AND NOT EXISTS ${CMAKE_BINARY_DIR}/${INSTALL_LIB_DIR} )
execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink lib ${CMAKE_BINARY_DIR}/${INSTALL_LIB_DIR} )
endif()

# for macosx use @rpath in a target’s install name (CMP0042)
set( CMAKE_MACOSX_RPATH ON )

# find packages use <package>_ROOT by default, new in version 3.12
if( POLICY CMP0074 )
cmake_policy( SET CMP0074 NEW )
endif()

# add the automatic parts to RPATH which point to dirs outside build tree
set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )

# use RPATHs for the build tree
set( CMAKE_SKIP_BUILD_RPATH FALSE )

# build with *relative* rpaths by default
option( ENABLE_RPATHS "when installing insert RPATHS into binaries" ON )
option( ENABLE_RELATIVE_RPATHS "try to use relative RPATHS, including build dir" ON )
if( ENABLE_RELATIVE_RPATHS )
set( CMAKE_BUILD_WITH_INSTALL_RPATH TRUE )
else()
# in case the RPATH is absolute, the install RPATH cannot be set
# at build-time since it breaks the build tree dynamic links
set( CMAKE_BUILD_WITH_INSTALL_RPATH FALSE )
endif()


foreach( p LIB BIN INCLUDE DATA CMAKE )
set( var INSTALL_${p}_DIR )
set( ${PROJECT_NAME}_FULL_INSTALL_${p}_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_${p}_DIR}"
CACHE INTERNAL "${PROJECT_NAME} ${p} full install path" )
endforeach()


function( _path_append var path )
list( FIND ${var} ${path} _found )
if( _found EQUAL "-1" )
list( APPEND ${var} ${path})
endif()
set( ${var} "${${var}}" PARENT_SCOPE ) #
endfunction()

function( _make_relative_rpath_entry entry var )

if( CMAKE_SYSTEM_NAME MATCHES "Darwin" )
set( ${var} "@loader_path/${entry}" PARENT_SCOPE )

elseif( CMAKE_SYSTEM_NAME MATCHES "FreeBSD|Linux|SunOS" )
set( ${var} "$ORIGIN/${entry}" PARENT_SCOPE )

elseif( CMAKE_SYSTEM_NAME MATCHES "AIX" ) # always relative to executable path
set( ${var} "${entry}" PARENT_SCOPE )

else()
set( ${var} "${CMAKE_INSTALL_PREFIX}/${entry}" PARENT_SCOPE )

endif()
endfunction()

macro( append_to_rpath RPATH_DIRS )

foreach( RPATH_DIR ${RPATH_DIRS} )

if( NOT ${RPATH_DIR} STREQUAL "" )

file( TO_CMAKE_PATH ${RPATH_DIR} RPATH_DIR ) # sanitize the path

if( IS_ABSOLUTE ${RPATH_DIR} )
_path_append( CMAKE_INSTALL_RPATH "${RPATH_DIR}" )
else()
_make_relative_rpath_entry( "${RPATH_DIR}" rpath_dir_rel )
_path_append( CMAKE_INSTALL_RPATH ${rpath_dir_rel} )
endif()

endif()

endforeach()

endmacro( append_to_rpath )


if( ENABLE_RPATHS )
if( ENABLE_RELATIVE_RPATHS )
file( RELATIVE_PATH relative_rpath ${CMAKE_INSTALL_PREFIX}/${INSTALL_BIN_DIR} ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR} )
append_to_rpath( ${relative_rpath} )
else() # make rpaths absolute
append_to_rpath( "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}" )
endif()
endif()

# put the include dirs which are in the source or build tree
# before all other include dirs, so the headers in the sources
# are prefered over the already installed ones (since cmake 2.4.1)
set( CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON )

# Set -fPIC flag etc.
set( CMAKE_POSITION_INDEPENDENT_CODE ON )

include(fesom_export)
11 changes: 6 additions & 5 deletions configure.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#!/usr/bin/env bash

set -e

HERE=$PWD
source env.sh # source this from your run script too
mkdir build || true # make sure not to commit this to svn or git
mkdir -p build
cd build
cmake .. $@ -DCMAKE_BUILD_TYPE=Debug # not required when re-compiling
# additional cmake arguments can be passed to configure.sh
# this also includes fesom specific options in CMakeLists, can be used as -DFESOM_COUPLED=ON
cmake .. -DCMAKE_INSTALL_PREFIX=$HERE -DCMAKE_BUILD_TYPE=Debug ${CMAKE_ARGS} $@
# not required when re-compiling
# additional cmake arguments can be passed to configure.sh
# this also includes fesom specific options in CMakeLists, can be used as -DFESOM_COUPLED=ON
make install -j`nproc --all`
4 changes: 1 addition & 3 deletions env/atosecmwf/shell
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,5 @@ module load cmake/3.20.2
module load ninja/1.10.0
module load fcm/2019.05.0

export NETCDF_DIR=$NETCDF4_DIR
export FC=ifort CC=icc CXX=icpc

export FC=mpif90 CC=mpicc CXX=mpicxx # MPI wrappers for Fortran, cc and CC similarly
#export FC=mpif90 CC=gcc CXX=mpicxx # MPI wrappers for Fortran, cc and CC similarly
71 changes: 43 additions & 28 deletions lib/parms/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,44 +2,59 @@ cmake_minimum_required(VERSION 3.4)

project(parms C)

# Set location to look for find_package modules
set( CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/../../cmake )

# Set -fPIC flag etc.
set( CMAKE_POSITION_INDEPENDENT_CODE ON )

# get our source files
set(src_home ${CMAKE_CURRENT_LIST_DIR}) # path to src directory starting from the dir containing our CMakeLists.txt
file(GLOB all_sources ${src_home}/src/*.c ${src_home}/src/DDPQ/*.c)

find_package(BLAS) # standard way to find blas
if( NOT BLAS_FOUND) # try older way to find blas
include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/FindBLAS.cmake")
# TODO: support legacy BLAS without LAPACK?
#include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/FindBLAS.cmake")
if( NOT LAPACK_LIBRARIES )
# First check if we have the Cray libraries
set( _cray_libsci_loaded $ENV{CRAY_LIBSCI_DIR} )
if( _cray_libsci_loaded )
# set( _CRAY_PRGENV $ENV{PE_ENV} )
# string( TOLOWER "${_CRAY_PRGENV}" _cray_prgenv )
# set( LAPACK_LIBRARIES sci_${_cray_prgenv} )
else()
find_package(LAPACK)
if(NOT LAPACK_FOUND)
find_package(BLAS REQUIRED)
endif(i)
endif()
endif()
if( NOT TARGET MPI::MPI_C )
find_package(MPI REQUIRED COMPONENTS C)
endif()


# create our library (set its name to name of this project)
if(${BUILD_FESOM_AS_LIBRARY})
add_library(${PROJECT_NAME} ${all_sources})
else()
add_library(${PROJECT_NAME} ${all_sources})
endif()
add_library(${PROJECT_NAME} ${all_sources})

if(${BLAS_FOUND})
message("BLAS FOUND ---------------------------")
target_compile_definitions(${PROJECT_NAME} PRIVATE PARMS USE_MPI REAL=double DBL FORTRAN_UNDERSCORE VOID_POINTER_SIZE_8 HAS_BLAS)
target_link_libraries(${PROJECT_NAME} INTERFACE ${BLAS_C_LIBRARIES} $ENV{UBUNTU_BLAS_LIBRARY})
else()
message("BLAS NOT FOUND ***********************")
target_compile_definitions(${PROJECT_NAME} PRIVATE PARMS USE_MPI REAL=double DBL FORTRAN_UNDERSCORE VOID_POINTER_SIZE_8)
target_link_libraries(${PROJECT_NAME} INTERFACE $ENV{UBUNTU_BLAS_LIBRARY})
endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE PARMS USE_MPI REAL=double DBL FORTRAN_UNDERSCORE VOID_POINTER_SIZE_8)

target_include_directories(${PROJECT_NAME}
PRIVATE ${src_home}/src/../include ${src_home}/src/include
INTERFACE ${src_home}/src/../include
PRIVATE ${src_home}/src/include
PUBLIC $<BUILD_INTERFACE:${src_home}/src/../include>
)
if(${CMAKE_C_COMPILER_ID} STREQUAL "Intel")
target_compile_options(${PROJECT_NAME} PRIVATE -no-prec-div -no-prec-sqrt -fast-transcendentals -fp-model precise)

if(${FESOM_PLATFORM_STRATEGY} STREQUAL levante.dkrz.de )
target_compile_options(${PROJECT_NAME} PRIVATE -march=core-avx2 -mtune=core-avx2)
endif()

if(BLAS_FOUND)
target_link_libraries(${PROJECT_NAME} PRIVATE ${BLAS_C_LIBRARIES} $ENV{UBUNTU_BLAS_LIBRARY})
else()
target_link_libraries(${PROJECT_NAME} PRIVATE ${LAPACK_LIBRARIES})
endif()
if(${BUILD_FESOM_AS_LIBRARY})
target_compile_options(${PROJECT_NAME} PRIVATE -fPIC)
install(TARGETS ${PROJECT_NAME} DESTINATION "${FESOM_INSTALL_PREFIX}/lib")
target_link_libraries(${PROJECT_NAME} PRIVATE MPI::MPI_C)



if(${CMAKE_C_COMPILER_ID} STREQUAL "Intel")
target_compile_options(${PROJECT_NAME} PRIVATE -no-prec-div -no-prec-sqrt -fast-transcendentals -fp-model precise)
if(${FESOM_PLATFORM_STRATEGY} STREQUAL levante.dkrz.de )
target_compile_options(${PROJECT_NAME} PRIVATE -march=core-avx2 -mtune=core-avx2)
endif()
endif()
Loading