Skip to content

Commit

Permalink
cmake: finer options for building models; default visibility for impo…
Browse files Browse the repository at this point in the history
…rted targets
  • Loading branch information
program-- committed Jan 3, 2024
1 parent 2fac489 commit 1fe7fc9
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 29 deletions.
74 changes: 48 additions & 26 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,11 @@ deprecated_option(OLD QUIET NEW NGEN_QUIET)
# deprecated_option(OLD PACKAGE_TESTS NEW NGEN_WITH_TESTS)

# Options to automate building of extern-distributed models
option(NGEN_WITH_EXTERN_CXX_MODELS "Build with extern-distributed C++ models" ON)
cmake_dependent_option(NGEN_WITH_EXTERN_FORTRAN_MODELS "Build with extern-distributed Fortran models" ON "NGEN_WITH_BMI_FORTRAN" OFF)
cmake_dependent_option(NGEN_WITH_EXTERN_C_MODELS "Build with extern-distributed C models" ON "NGEN_WITH_BMI_C" OFF)
option(NGEN_WITH_EXTERN_SLOTH "Build with extern-distributed SLoTH" ON)
cmake_dependent_option(NGEN_WITH_EXTERN_TOPMODEL "Build with extern-distributed TOPMODEL" ON "NGEN_WITH_BMI_C" OFF)
cmake_dependent_option(NGEN_WITH_EXTERN_CFE "Build with extern-distributed CFE" ON "NGEN_WITH_BMI_C" OFF)
cmake_dependent_option(NGEN_WITH_EXTERN_PET "Build with extern-distributed PET" ON "NGEN_WITH_BMI_C" OFF)
cmake_dependent_option(NGEN_WITH_EXTERN_NOAH_OWP_MODULAR "Build with extern-distributed Noah-OWP-Modular" ON "NGEN_WITH_BMI_FORTRAN" OFF)

# Project =====================================================================

Expand Down Expand Up @@ -169,42 +171,47 @@ if(NGEN_WITH_NETCDF)
add_compile_definitions(NETCDF_ACTIVE)
endif()

if(NGEN_WITH_EXTERN_CXX_MODELS)
if(NGEN_WITH_EXTERN_SLOTH)
# This is set because SLOTH will link to gtest by default,
# which causes a configure error.
set(PACKAGE_TESTS OFF CACHE BOOL "SLoTH testing")
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/sloth"
OUTPUT "${NGEN_EXT_DIR}/sloth/cmake_build"
SOURCE "${NGEN_EXT_DIR}/sloth"
OUTPUT "${NGEN_EXT_DIR}/sloth/cmake_build"
GIT_UPDATE "${NGEN_EXT_DIR}/sloth"
IMPORTS slothmodel
)

set_target_properties(slothmodel PROPERTIES
CXX_VISIBILITY_PRESET default)
endif()

# -----------------------------------------------------------------------------
# Handle several steps for BMI C library logic and dependencies, at top level, if functionality is turned on
if(NGEN_WITH_BMI_C)
add_compile_definitions(NGEN_BMI_C_LIB_ACTIVE)

if(NGEN_WITH_EXTERN_C_MODELS)
if(NGEN_WITH_EXTERN_TOPMODEL)
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/topmodel"
OUTPUT "${NGEN_EXT_DIR}/topmodel/cmake_build"
SOURCE "${NGEN_EXT_DIR}/topmodel"
OUTPUT "${NGEN_EXT_DIR}/topmodel/cmake_build"
GIT_UPDATE "${NGEN_EXT_DIR}/topmodel/topmodel"
IMPORTS topmodelbmi
)
endif()

if(NGEN_WITH_EXTERN_CFE)
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/cfe"
OUTPUT "${NGEN_EXT_DIR}/cfe/cmake_build"
SOURCE "${NGEN_EXT_DIR}/cfe"
OUTPUT "${NGEN_EXT_DIR}/cfe/cmake_build"
GIT_UPDATE "${NGEN_EXT_DIR}/cfe/cfe"
IMPORTS cfebmi
)
endif()

if(NGEN_WITH_EXTERN_PET)
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/evapotranspiration/evapotranspiration"
OUTPUT "${NGEN_EXT_DIR}/evapotranspiration/evapotranspiration/cmake_build"
GIT_UPDATE "${NGEN_EXT_DIR}/evapotranspiration/evapotranspiration"
IMPORTS petbmi
)
endif()
endif()
Expand All @@ -215,15 +222,17 @@ if(NGEN_WITH_BMI_FORTRAN)
add_compile_definitions(NGEN_BMI_FORTRAN_ACTIVE)

add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/iso_c_fortran_bmi"
OUTPUT "${NGEN_EXT_DIR}/iso_c_fortran_bmi/cmake_build"
SOURCE "${NGEN_EXT_DIR}/iso_c_fortran_bmi"
OUTPUT "${NGEN_EXT_DIR}/iso_c_fortran_bmi/cmake_build"
IMPORTS iso_c_bmi
)

if(NGEN_WITH_EXTERN_FORTRAN_MODELS)
if(NGEN_WITH_EXTERN_NOAH_OWP_MODULAR)
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/noah-owp-modular"
OUTPUT "${NGEN_EXT_DIR}/noah-owp-modular/cmake_build"
SOURCE "${NGEN_EXT_DIR}/noah-owp-modular"
OUTPUT "${NGEN_EXT_DIR}/noah-owp-modular/cmake_build"
GIT_UPDATE "${NGEN_EXT_DIR}/noah-owp-modular/noah-owp-modular"
IMPORTS surfacebmi
)
endif()
endif()
Expand Down Expand Up @@ -261,15 +270,23 @@ add_library(ngen_config_header INTERFACE)
add_library(NGen::config_header ALIAS ngen_config_header)
target_include_directories(ngen_config_header INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/include")

if(NGEN_WITH_EXTERN_CXX_MODELS)
if(NGEN_WITH_EXTERN_SLOTH)
add_dependencies(ngen slothmodel)
endif()

if(NGEN_WITH_EXTERN_C_MODELS)
add_dependencies(ngen topmodelbmi cfebmi petbmi)
if(NGEN_WITH_EXTERN_TOPMODEL)
add_dependencies(ngen topmodelbmi)
endif()

if(NGEN_WITH_EXTERN_CFE)
add_dependencies(ngen cfebmi)
endif()

if(NGEN_WITH_EXTERN_PET)
add_dependencies(ngen petbmi)
endif()

if(NGEN_WITH_EXTERN_FORTRAN_MODELS)
if(NGEN_WITH_EXTERN_NOAH_OWP_MODULAR)
add_dependencies(ngen surfacebmi)
endif()

Expand Down Expand Up @@ -367,7 +384,9 @@ ngen_multiline_message(
" Build type: ${CMAKE_BUILD_TYPE}"
" System: ${CMAKE_SYSTEM_NAME}"
" C Compiler: ${CMAKE_C_COMPILER}"
" C Flags: ${CMAKE_C_FLAGS}"
" CXX Compiler: ${CMAKE_CXX_COMPILER}"
" CXX Flags: ${CMAKE_CXX_FLAGS}"
" Flags:"
" NGEN_WITH_MPI: ${NGEN_WITH_MPI}"
" NGEN_WITH_NETCDF: ${NGEN_WITH_NETCDF}"
Expand All @@ -379,10 +398,13 @@ ngen_multiline_message(
" NGEN_WITH_ROUTING: ${NGEN_WITH_ROUTING}"
" NGEN_WITH_TESTS: ${NGEN_WITH_TESTS}"
" NGEN_WITH_COVERAGE: ${NGEN_WITH_COVERAGE}"
" NGEN_WITH_EXTERN_CXX_MODELS: ${NGEN_WITH_EXTERN_CXX_MODELS}"
" NGEN_WITH_EXTERN_C_MODELS: ${NGEN_WITH_EXTERN_C_MODELS}"
" NGEN_WITH_EXTERN_FORTRAN_MODELS: ${NGEN_WITH_EXTERN_FORTRAN_MODELS}"
" NGEN_QUIET: ${NGEN_QUIET}"
" Extern Models:"
" NGEN_WITH_EXTERN_SLOTH: ${NGEN_WITH_EXTERN_SLOTH}"
" NGEN_WITH_EXTERN_TOPMODEL: ${NGEN_WITH_EXTERN_TOPMODEL}"
" NGEN_WITH_EXTERN_CFE: ${NGEN_WITH_EXTERN_CFE}"
" NGEN_WITH_EXTERN_PET: ${NGEN_WITH_EXTERN_PET}"
" NGEN_WITH_EXTERN_NOAH_OWP_MODULAR: ${NGEN_WITH_EXTERN_NOAH_OWP_MODULAR}"
"Environment summary:"
" Boost:"
" Version: ${Boost_VERSION}"
Expand Down
14 changes: 12 additions & 2 deletions cmake/ExternalSubdirectory.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ include(GitUpdateSubmodules)
# Add an external subdirectory to build
function(add_external_subdirectory)
set(options "")
set(oneValueArgs SOURCE OUTPUT GIT_UPDATE)
set(oneValueArgs SOURCE OUTPUT GIT_UPDATE IMPORTS)
set(multiValueArgs "")
cmake_parse_arguments(EXTERNAL_TARGET
"${options}" "${oneValueArgs}"
Expand All @@ -13,9 +13,19 @@ function(add_external_subdirectory)
git_update_submodule("${EXTERNAL_TARGET_GIT_UPDATE}")
endif()

if("EXTERNAL_TARGET_OUTPUT" IN_LIST EXTERNAL_TARGET_MISSING_VALUES)
if(EXTERNAL_TARGET_OUTPUT STREQUAL "")
add_subdirectory("${EXTERNAL_TARGET_SOURCE}")
else()
add_subdirectory("${EXTERNAL_TARGET_SOURCE}" "${EXTERNAL_TARGET_OUTPUT}")
endif()

if(EXTERNAL_TARGET_IMPORTS STREQUAL "")
if(TARGET ${EXTERNAL_TARGET_IMPORTS})
set_target_properties(${EXTERNAL_TARGET_IMPORTS}
PROPERTIES
CXX_VISIBILITY_PRESET default)
else()
message(FATAL_ERROR "Target `${EXTERNAL_TARGET_IMPORTS}` could not be found from subdirectory ${EXTERNAL_TARGET_SOURCE}")
endif()
endif()
endfunction()
2 changes: 1 addition & 1 deletion docker/ngen.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ RUN cmake -S . \
-DNGEN_WITH_PYTHON:BOOL=OFF \
-DNGEN_WITH_TESTS:BOOL=ON \
-DNGEN_QUIET:BOOL=ON \
-DNGEN_WITH_EXTERN_CXX_MODELS:BOOL=ON
-DNGEN_WITH_EXTERN_SLOTH:BOOL=ON

RUN cmake --build /ngen_build \
--target testbmicppmodel ngen \
Expand Down
3 changes: 3 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ git_update_submodule("${NGEN_EXT_DIR}/bmi-cxx")
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/test_bmi_cpp"
OUTPUT "${NGEN_EXT_DIR}/test_bmi_cpp/cmake_build"
IMPORTS testbmicppmodel
)

if (NGEN_WITH_PYTHON)
Expand All @@ -39,6 +40,7 @@ if(NGEN_WITH_BMI_C)
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/test_bmi_c"
OUTPUT "${NGEN_EXT_DIR}/test_bmi_c/cmake_build"
IMPORTS testbmicmodel
)
endif()

Expand All @@ -47,6 +49,7 @@ if(NGEN_WITH_BMI_FORTRAN)
add_external_subdirectory(
SOURCE "${NGEN_EXT_DIR}/test_bmi_fortran"
OUTPUT "${NGEN_EXT_DIR}/test_bmi_fortran/cmake_build"
IMPORTS testbmifortranmodel
)
endif()

Expand Down

0 comments on commit 1fe7fc9

Please sign in to comment.