11cmake_minimum_required (VERSION 3.22)
22
33# load packages and modules
4- list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} /cmake)
4+ list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} /../ cmake)
55set (Python_FIND_UNVERSIONED_NAMES "FIRST" )
66set (Python_FIND_FRAMEWORK "LAST" )
77set (Python_FIND_REGISTRY "LAST" )
88find_package (Python 3.5 REQUIRED COMPONENTS Interpreter)
9- find_package (ESMF 8.6 .0 MODULE REQUIRED)
9+ find_package (ESMF 8.9 .0 MODULE REQUIRED)
1010include (FetchContent)
1111
1212# esmx functions
@@ -16,7 +16,7 @@ function(esmx_check_ret RETVAL MESSAGE)
1616 endif ()
1717endfunction ()
1818
19- # unset user ESMF variables stored in cache
19+ # unset user ESMX variables stored in cache
2020get_cmake_property (_variableNames VARIABLES )
2121foreach (_variableName ${_variableNames} )
2222 if ("${_variableName} " MATCHES "^ESMX_*" )
@@ -103,6 +103,17 @@ elseif(DEFINED ESMX_BUILD_JOBS)
103103 set (ESMX_MAKE_BUILD_JOBS "--jobs=${ESMX_BUILD_JOBS} " )
104104endif ()
105105
106+ # diagnostic output
107+ message ("" )
108+ message ("ESMX_BUILD_FILE ............. ${ESMX_BUILD_FILE} " )
109+ message ("ESMX_EXE_NAME ............... ${ESMX_EXE_NAME} " )
110+ message ("ESMX_DISABLE_COMPS .......... ${ESMX_DISABLE_COMPS} " )
111+ #message("ESMX_CMAKE_BUILD_VERBOSE .... ${ESMX_CMAKE_BUILD_VERBOSE}")
112+ #message("ESMX_CMAKE_BUILD_JOBS ....... ${ESMX_CMAKE_BUILD_JOBS}")
113+ #message("ESMX_TEST_DIR ............... ${ESMX_TEST_DIR}")
114+ #message("ESMX_TEST_TASKS ............. ${ESMX_TEST_TASKS}")
115+ message ("" )
116+
106117# compiler options
107118if (CMAKE_Fortran_COMPILER_ID MATCHES "GNU" )
108119 set (CMAKE_Fortran_FLAGS_RELEASE "-O2" )
@@ -181,6 +192,7 @@ set(CMP_OPTIONS BUILD_TYPE;
181192 GIT_TAG;
182193 GIT_DIR;
183194 CMAKE_CONFIG;
195+ CMAKE_TARGET;
184196 INSTALL_PREFIX ;
185197 LIBRARY_DIR;
186198 CONFIG_DIR;
@@ -209,6 +221,7 @@ foreach(CMP IN ITEMS ${COMPS})
209221 if (CMP_INSTALL_PREFIX STREQUAL "" )
210222 set (CMP_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} )
211223 endif ()
224+ string (REPLACE "," ";" "${${CMP} -CMAKE_TARGET}" CMP_CMAKE_TARGET)
212225 string (REPLACE "," ";" "${${CMP} -LIBRARIES}" CMP_LIBRARIES)
213226 string (REPLACE "," ";" "${${CMP} -LINK_LIBRARIES}" CMP_LINK_LIBRARIES)
214227 string (REPLACE "," ";" "${${CMP} -LINK_PATHS}" CMP_LINK_PATHS)
@@ -318,7 +331,11 @@ foreach(CMP IN ITEMS ${COMPS})
318331
319332 # build component with cmake
320333 if (${CMP_BUILD_TYPE} STREQUAL "cmake" )
321- message (STATUS "ESMX building (CMAKE) - ${CMP} - ${CMP_SOURCE_DIR} " )
334+ # CMake builds are only configured at this stage!
335+
336+ # build component with cmake.external
337+ elseif (${CMP_BUILD_TYPE} STREQUAL "cmake.external" )
338+ message (STATUS "ESMX building (CMAKE external) - ${CMP} - ${CMP_SOURCE_DIR} " )
322339 find_file (FND_CMAKE_LISTS
323340 NAMES CMakeLists.txt cmakelists.txt CMAKELISTS.txt
324341 PATHS ${CMP_SOURCE_DIR}
@@ -415,53 +432,74 @@ foreach(CMP IN ITEMS ${COMPS})
415432 message (FATAL_ERROR "Invalid BUILD_TYPE: ${CMP_BUILD_TYPE} for ${CMP} " )
416433 endif ()
417434
418- # include modules and link libraries
419- if (${CMP_LINK_INTO_APP} STREQUAL "True" )
435+ # look for CMake target and conditionally include config, modules, link libs
436+ if (TARGET ${CMP_CMAKE_TARGET} )
437+ if (${CMP_LINK_INTO_APP} STREQUAL "True" )
438+ message (STATUS "ESMX Found CMake target dependency for ${CMP} : ${CMP_CMAKE_TARGET} " )
439+ target_link_libraries (esmx_driver PUBLIC ${CMP_CMAKE_TARGET} )
440+ endif ()
441+ elseif (${CMP_BUILD_TYPE} STREQUAL "cmake" )
442+ message (STATUS "ESMX Found CMake subdirectory for ${CMP} : ${CMP_SOURCE_DIR} " )
443+ # add source subdirectory with explicit binary directory path. This works for
444+ # internal as well as external component source directories
445+ add_subdirectory (${CMP_SOURCE_DIR} ${CMAKE_BINARY_DIR} /${CMP} )
446+ if (TARGET ${CMP_CMAKE_TARGET} )
447+ if (${CMP_LINK_INTO_APP} STREQUAL "True" )
448+ message (STATUS "ESMX Found CMake target dependency for ${CMP} : ${CMP_CMAKE_TARGET} " )
449+ target_link_libraries (esmx_driver PUBLIC ${CMP_CMAKE_TARGET} )
450+ endif ()
451+ else ()
452+ message (FATAL_ERROR "ESMX Did not find expected CMake target dependency for ${CMP} after adding subdirectory: ${CMP_CMAKE_TARGET} " )
453+ endif ()
454+ else ()
455+ # not a known CMake target -> find the config file
420456 find_file (FND_CMAKE_CONFIG
421457 NAMES ${CMP_CMAKE_CONFIG}
422458 HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR} /${CMP}
423459 PATH_SUFFIXES ${CMP_CONFIG_DIR} "." "cmake" "config"
424460 NO_CACHE NO_DEFAULT_PATH
425461 )
426462 if (FND_CMAKE_CONFIG)
463+ message (STATUS "ESMX found CMake configuration for ${CMP} : ${FND_CMAKE_CONFIG} " )
427464 include (${FND_CMAKE_CONFIG} )
428465 endif ()
466+ unset (FND_CMAKE_CONFIG)
467+ # not a known CMake target -> find the Fortran module
429468 find_path (FND_FORT_MODULE
430469 NAMES ${CMP_FORT_MODULE}
431470 HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR} /${CMP}
432471 PATH_SUFFIXES ${CMP_INCLUDE_DIR} "." "include" "mod"
433472 NO_CACHE NO_DEFAULT_PATH
434473 )
435474 if (FND_FORT_MODULE)
475+ message (STATUS "ESMX Found Fortran module ${CMP_FORT_MODULE} for ${CMP} in: ${FND_FORT_MODULE} " )
436476 target_include_directories (esmx_driver PUBLIC ${FND_FORT_MODULE} )
437- elseif ( NOT FND_CMAKE_CONFIG )
438- message (FATAL_ERROR "Cannot find fort_module ${CMP_FORT_MODULE} in ${CMP_INSTALL_PREFIX} " )
477+ else ( )
478+ message (FATAL_ERROR "Cannot find fort_module ${CMP_FORT_MODULE} for ${CMP} in ${CMP_INSTALL_PREFIX} " )
439479 endif ()
440480 unset (FND_FORT_MODULE)
441- unset (FND_CMAKE_CONFIG)
481+ # not a known CMake target -> find the libraries
442482 foreach (CMP_LIBRARY IN ITEMS ${CMP_LIBRARIES} )
443- if (TARGET ${CMP_LIBRARY} )
444- target_link_libraries (esmx_driver PUBLIC ${CMP_LIBRARY} )
445- else ()
446- find_library (FND_LIBRARY
447- NAMES ${CMP_LIBRARY}
448- HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR} /${CMP}
449- PATH_SUFFIXES ${CMP_LIBRARY_DIR} "." "lib" "lib64"
450- NO_CACHE NO_DEFAULT_PATH
451- )
452- if (NOT FND_LIBRARY)
453- message (FATAL_ERROR "Cannot find libraries ${CMP_LIBRARY} in ${CMP_INSTALL_PREFIX} " )
454- endif ()
455- target_link_libraries (esmx_driver PUBLIC ${FND_LIBRARY} )
456- unset (FND_LIBRARY)
483+ find_library (FND_LIBRARY
484+ NAMES ${CMP_LIBRARY}
485+ HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR} /${CMP}
486+ PATH_SUFFIXES ${CMP_LIBRARY_DIR} "." "lib" "lib64"
487+ NO_CACHE NO_DEFAULT_PATH
488+ )
489+ if (NOT FND_LIBRARY)
490+ message (FATAL_ERROR "Cannot find libraries ${CMP_LIBRARY} for ${CMP} in ${CMP_INSTALL_PREFIX} " )
457491 endif ()
492+ message (STATUS "ESMX Found link library for ${CMP} : ${FND_LIBRARY} " )
493+ target_link_libraries (esmx_driver PUBLIC ${FND_LIBRARY} )
494+ unset (FND_LIBRARY)
458495 endforeach ()
459496 endif ()
460497
461498 # link external libraries
462499 if (${CMP_LINK_INTO_APP} STREQUAL "True" )
463500 foreach (CMP_LINK_LIBRARY IN ITEMS ${CMP_LINK_LIBRARIES} )
464501 if (TARGET ${CMP_LINK_LIBRARY} )
502+ message (STATUS "ESMX Found external link library for ${CMP} : ${CMP_LINK_LIBRARY} " )
465503 target_link_libraries (esmx_driver PUBLIC ${CMP_LINK_LIBRARY} )
466504 else ()
467505 find_library (FND_LINK_LIBRARY
@@ -471,8 +509,9 @@ foreach(CMP IN ITEMS ${COMPS})
471509 NO_CACHE
472510 )
473511 if (NOT FND_LINK_LIBRARY)
474- message (FATAL_ERROR "Cannot find link_libraries ${CMP_LINK_LIBRARY} in ${CMP_LINK_PATHS} " )
512+ message (FATAL_ERROR "Cannot find link_libraries ${CMP_LINK_LIBRARY} for ${CMP} in ${CMP_LINK_PATHS} " )
475513 endif ()
514+ message (STATUS "ESMX Found external link library for ${CMP} : ${FND_LINK_LIBRARY} " )
476515 target_link_libraries (esmx_driver PUBLIC ${FND_LINK_LIBRARY} )
477516 unset (FND_LINK_LIBRARY)
478517 endif ()
@@ -484,7 +523,7 @@ foreach(CMP IN ITEMS ${COMPS})
484523 if (CMP_TEST_DIR STREQUAL "" )
485524 message (WARNING "No test directory provided for ${CMP} " )
486525 elseif (NOT EXISTS ${CMP_TEST_DIR} )
487- message (FATAL_ERROR "Cannot find test directory ${CMP_TEST_DIR} " )
526+ message (FATAL_ERROR "Cannot find test directory for ${CMP} : ${CMP_TEST_DIR} " )
488527 else ()
489528 if (CMP_TEST_EXE STREQUAL "" )
490529 set (CMP_TEST_EXE ${ESMX_TEST_EXE} )
@@ -508,7 +547,7 @@ foreach(CMP IN ITEMS ${COMPS})
508547 NO_CACHE
509548 )
510549 if (NOT FND_TEST_EXE)
511- message (FATAL_ERROR "Cannot find test executable: ${CMP_TEST_EXE} " )
550+ message (FATAL_ERROR "Cannot find test executable for ${CMP} : ${CMP_TEST_EXE} " )
512551 endif ()
513552
514553 # add test
0 commit comments