|
| 1 | +## MPAS-Model |
| 2 | +cmake_minimum_required(VERSION 3.12) |
| 3 | + |
| 4 | +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Functions/MPAS_Functions.cmake) |
| 5 | +get_mpas_version(MPAS_VERSION) |
| 6 | +project(MPAS LANGUAGES C Fortran VERSION ${MPAS_VERSION} DESCRIPTION "MPAS - Model for Prediction Across Scales") |
| 7 | + |
| 8 | +list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) |
| 9 | +set(CMAKE_DIRECTORY_LABELS ${PROJECT_NAME}) |
| 10 | +include(GNUInstallDirs) |
| 11 | + |
| 12 | +# Options |
| 13 | +set(MPAS_ALL_CORES atmosphere init_atmosphere) |
| 14 | +set(MPAS_CORES atmosphere CACHE STRING "MPAS cores to build. Options: ${MPAS_ALL_CORES}") |
| 15 | +if(MPAS_CORES MATCHES " ") #Convert strings separated with spaces to CMake list separated with ';' |
| 16 | + string(REPLACE " " ";" MPAS_CORES ${MPAS_CORES}) |
| 17 | + set(MPAS_CORES ${MPAS_CORES} CACHE STRING "MPAS cores to build. Options: ${MPAS_ALL_CORES}" FORCE) |
| 18 | +endif() |
| 19 | +option(DO_PHYSICS "Use built-in physics schemes." TRUE) |
| 20 | +option(MPAS_DOUBLE_PRECISION "Use double precision 64-bit Floating point." TRUE) |
| 21 | +option(MPAS_PROFILE "Enable GPTL profiling" OFF) |
| 22 | +option(MPAS_OPENMP "Enable OpenMP" OFF) |
| 23 | +option(BUILD_SHARED_LIBS "Build shared libraries" ON) |
| 24 | + |
| 25 | +message(STATUS "[OPTION] MPAS_CORES: ${MPAS_CORES}") |
| 26 | +message(STATUS "[OPTION] MPAS_DOUBLE_PRECISION: ${MPAS_DOUBLE_PRECISION}") |
| 27 | +message(STATUS "[OPTION] MPAS_PROFILE: ${MPAS_PROFILE}") |
| 28 | +message(STATUS "[OPTION] MPAS_OPENMP: ${MPAS_OPENMP}") |
| 29 | +message(STATUS "[OPTION] BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") |
| 30 | + |
| 31 | +# Build product output locations |
| 32 | +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) |
| 33 | +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) |
| 34 | +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) |
| 35 | + |
| 36 | +# Set default build type to RelWithDebInfo |
| 37 | +if(NOT CMAKE_BUILD_TYPE) |
| 38 | + message(STATUS "Setting default build type to Release. Specify CMAKE_BUILD_TYPE to override.") |
| 39 | + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "CMake Build type" FORCE) |
| 40 | + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") |
| 41 | +endif() |
| 42 | + |
| 43 | +# Detect MPAS git version |
| 44 | +if(NOT MPAS_GIT_VERSION) |
| 45 | + find_package(Git QUIET) |
| 46 | + if(GIT_FOUND) |
| 47 | + execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty |
| 48 | + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" |
| 49 | + OUTPUT_VARIABLE _mpas_git_version |
| 50 | + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 51 | + else() |
| 52 | + set(_mpas_git_version "Unknown") |
| 53 | + endif() |
| 54 | + set(MPAS_GIT_VERSION ${_mpas_git_version} CACHE STRING "MPAS-Model git version") |
| 55 | +endif() |
| 56 | + |
| 57 | +### Dependencies |
| 58 | +find_package(OpenMP COMPONENTS Fortran) |
| 59 | +find_package(MPI REQUIRED COMPONENTS Fortran) |
| 60 | +find_package(NetCDF REQUIRED COMPONENTS Fortran C) |
| 61 | +find_package(PnetCDF REQUIRED COMPONENTS Fortran) |
| 62 | +find_package(PIO REQUIRED COMPONENTS Fortran C) |
| 63 | +if(MPAS_PROFILE) |
| 64 | + find_package(GPTL REQUIRED) |
| 65 | +endif() |
| 66 | + |
| 67 | +# Find C pre-processor |
| 68 | +if(CMAKE_C_COMPILER_ID MATCHES GNU) |
| 69 | + find_program(CPP_EXECUTABLE NAMES cpp REQUIRED) |
| 70 | + set(CPP_EXTRA_FLAGS -traditional) |
| 71 | +elseif(CMAKE_C_COMPILER_ID MATCHES "(Apple)?Clang" ) |
| 72 | + find_program(CPP_EXECUTABLE NAMES cpp REQUIRED) |
| 73 | +else() |
| 74 | + message(STATUS "Unknown compiler: ${CMAKE_C_COMPILER_ID}") |
| 75 | + set(CPP_EXECUTABLE ${CMAKE_C_COMPILER}) |
| 76 | +endif() |
| 77 | + |
| 78 | +## Common Variables |
| 79 | + |
| 80 | +# Fortran module output directory for build interface |
| 81 | +set(MPAS_MODULE_DIR ${PROJECT_NAME}/module/${CMAKE_Fortran_COMPILER_ID}/${CMAKE_Fortran_COMPILER_VERSION}) |
| 82 | +# Install Fortran module directory |
| 83 | +install(DIRECTORY ${CMAKE_BINARY_DIR}/${MPAS_MODULE_DIR}/ DESTINATION ${CMAKE_INSTALL_LIBDIR}/${MPAS_MODULE_DIR}/) |
| 84 | + |
| 85 | +# Location of common subdriver module compiled by each cores |
| 86 | +set(MPAS_MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/driver/mpas.F) |
| 87 | +set(MPAS_SUBDRIVER_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/driver/mpas_subdriver.F) |
| 88 | + |
| 89 | +## Create targets |
| 90 | +add_subdirectory(src/external/ezxml) # Target: MPAS::external::ezxml |
| 91 | +if(ESMF_FOUND) |
| 92 | + message(STATUS "Configure MPAS for external ESMF") |
| 93 | + add_definitions(-DMPAS_EXTERNAL_ESMF_LIB -DMPAS_NO_ESMF_INIT) |
| 94 | + add_library(${PROJECT_NAME}::external::esmf ALIAS esmf) |
| 95 | +else() |
| 96 | + message(STATUS "Configure MPAS for internal ESMF") |
| 97 | + add_subdirectory(src/external/esmf_time_f90) # Target: MPAS::external::esmf_time |
| 98 | +endif() |
| 99 | +add_subdirectory(src/tools/input_gen) # Targets: namelist_gen, streams_gen |
| 100 | +add_subdirectory(src/tools/registry) # Targets: mpas_parse_<core_name> |
| 101 | +add_subdirectory(src/framework) # Target: MPAS::framework |
| 102 | +add_subdirectory(src/operators) # Target: MPAS::operators |
| 103 | + |
| 104 | +foreach(_core IN LISTS MPAS_CORES) |
| 105 | + add_subdirectory(src/core_${_core}) # Target: MPAS::core::<core_name> |
| 106 | +endforeach() |
| 107 | + |
| 108 | +### Package config |
| 109 | +include(CMakePackageConfigHelpers) |
| 110 | + |
| 111 | +# Build-tree target exports |
| 112 | +export(EXPORT ${PROJECT_NAME}ExportsExternal NAMESPACE ${PROJECT_NAME}::external:: FILE ${PROJECT_NAME}-targets-external.cmake) |
| 113 | +export(EXPORT ${PROJECT_NAME}Exports NAMESPACE ${PROJECT_NAME}:: FILE ${PROJECT_NAME}-targets.cmake) |
| 114 | +export(EXPORT ${PROJECT_NAME}ExportsCore NAMESPACE ${PROJECT_NAME}::core:: FILE ${PROJECT_NAME}-targets-core.cmake) |
| 115 | + |
| 116 | +# CMake Config file install location |
| 117 | +set(CONFIG_INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) |
| 118 | +# Install MPAS-supplied Find<Pkg>.cmake modules for use by downstream CMake dependencies |
| 119 | +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules DESTINATION ${CONFIG_INSTALL_DESTINATION}) |
| 120 | + |
| 121 | +## <pkgname>-config.cmake: build-tree |
| 122 | +# Variables to export for use from build-tree |
| 123 | +set(BINDIR ${CMAKE_BINARY_DIR}/bin) |
| 124 | +set(CORE_DATADIR_ROOT ${CMAKE_BINARY_DIR}/${PROJECT_NAME}) |
| 125 | +set(CMAKE_MODULE_INSTALL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) |
| 126 | +string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) |
| 127 | +configure_package_config_file(cmake/PackageConfig.cmake.in ${PROJECT_NAME_LOWER}-config.cmake |
| 128 | + INSTALL_DESTINATION . |
| 129 | + INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR} |
| 130 | + PATH_VARS BINDIR CORE_DATADIR_ROOT CMAKE_MODULE_INSTALL_PATH) |
| 131 | + |
| 132 | +## <pkgname>-config.cmake: install-tree |
| 133 | +# Variables to export for use from install-tree |
| 134 | +set(BINDIR ${CMAKE_INSTALL_BINDIR}) |
| 135 | +set(CORE_DATADIR_ROOT ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}) |
| 136 | +set(CMAKE_MODULE_INSTALL_PATH ${CONFIG_INSTALL_DESTINATION}/Modules) |
| 137 | +configure_package_config_file(cmake/PackageConfig.cmake.in install/${PROJECT_NAME_LOWER}-config.cmake |
| 138 | + INSTALL_DESTINATION ${CONFIG_INSTALL_DESTINATION} |
| 139 | + PATH_VARS BINDIR CORE_DATADIR_ROOT CMAKE_MODULE_INSTALL_PATH) |
| 140 | +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/${PROJECT_NAME_LOWER}-config.cmake |
| 141 | + DESTINATION ${CONFIG_INSTALL_DESTINATION}) |
| 142 | + |
| 143 | +## <pkgname>-config-version.cmake |
| 144 | +write_basic_package_version_file( |
| 145 | + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake |
| 146 | + VERSION ${PROJECT_VERSION} |
| 147 | + COMPATIBILITY AnyNewerVersion) |
| 148 | +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake |
| 149 | + DESTINATION ${CONFIG_INSTALL_DESTINATION}) |
| 150 | + |
| 151 | +## package-targets.cmake and package-targets-<build-type>.cmake |
| 152 | +install(EXPORT ${PROJECT_NAME}ExportsExternal NAMESPACE ${PROJECT_NAME}::external:: |
| 153 | + FILE ${PROJECT_NAME_LOWER}-targets-external.cmake |
| 154 | + DESTINATION ${CONFIG_INSTALL_DESTINATION}) |
| 155 | +install(EXPORT ${PROJECT_NAME}Exports NAMESPACE ${PROJECT_NAME}:: |
| 156 | + FILE ${PROJECT_NAME_LOWER}-targets.cmake |
| 157 | + DESTINATION ${CONFIG_INSTALL_DESTINATION}) |
| 158 | +install(EXPORT ${PROJECT_NAME}ExportsCore NAMESPACE ${PROJECT_NAME}::core:: |
| 159 | + FILE ${PROJECT_NAME_LOWER}-targets-core.cmake |
| 160 | + DESTINATION ${CONFIG_INSTALL_DESTINATION}) |
0 commit comments