Skip to content

Commit

Permalink
Implement the link_into_app Component option key, supporting ESMX
Browse files Browse the repository at this point in the history
directed component build, without final linking into the executable.
This is a very useful feature for components that are loaded at run-time
via the shared object approach.
  • Loading branch information
theurich committed Jan 5, 2024
1 parent 85d7075 commit 42988fb
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 55 deletions.
113 changes: 59 additions & 54 deletions src/addon/ESMX/Driver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ set(CMP_OPTIONS BUILD_TYPE;
LIBRARIES;
LINK_LIBRARIES;
LINK_PATHS;
LINK_INTO_APP;
BUILD_ARGS;
BUILD_SCRIPT;
TEST_DIR;
Expand Down Expand Up @@ -391,64 +392,68 @@ foreach(CMP IN ITEMS ${COMPS})
endif()

# include modules and link libraries
find_file(FND_CMAKE_CONFIG
NAMES ${CMP_CMAKE_CONFIG}
HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR}/${CMP}
PATH_SUFFIXES ${CMP_CONFIG_DIR} "." "cmake" "config"
NO_CACHE NO_DEFAULT_PATH
)
if(FND_CMAKE_CONFIG)
include(${FND_CMAKE_CONFIG})
endif()
find_path(FND_FORT_MODULE
NAMES ${CMP_FORT_MODULE}
HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR}/${CMP}
PATH_SUFFIXES ${CMP_INCLUDE_DIR} "." "include" "mod"
NO_CACHE NO_DEFAULT_PATH
)
if(FND_FORT_MODULE)
target_include_directories(esmx_driver PUBLIC ${FND_FORT_MODULE})
elseif(NOT FND_CMAKE_CONFIG)
message(FATAL_ERROR "Cannot find fort_module ${CMP_FORT_MODULE} in ${CMP_INSTALL_PREFIX}")
endif()
unset(FND_FORT_MODULE)
unset(FND_CMAKE_CONFIG)
foreach(CMP_LIBRARY IN ITEMS ${CMP_LIBRARIES})
if(TARGET ${CMP_LIBRARY})
target_link_libraries(esmx_driver PUBLIC ${CMP_LIBRARY})
else()
find_library(FND_LIBRARY
NAMES ${CMP_LIBRARY}
HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR}/${CMP}
PATH_SUFFIXES ${CMP_LIBRARY_DIR} "." "lib" "lib64"
NO_CACHE NO_DEFAULT_PATH
)
if(NOT FND_LIBRARY)
message(FATAL_ERROR "Cannot find libraries ${CMP_LIBRARY} in ${CMP_INSTALL_PREFIX}")
endif()
target_link_libraries(esmx_driver PUBLIC ${FND_LIBRARY})
unset(FND_LIBRARY)
if(${CMP_LINK_INTO_APP} STREQUAL "True")
find_file(FND_CMAKE_CONFIG
NAMES ${CMP_CMAKE_CONFIG}
HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR}/${CMP}
PATH_SUFFIXES ${CMP_CONFIG_DIR} "." "cmake" "config"
NO_CACHE NO_DEFAULT_PATH
)
if(FND_CMAKE_CONFIG)
include(${FND_CMAKE_CONFIG})
endif()
endforeach()
find_path(FND_FORT_MODULE
NAMES ${CMP_FORT_MODULE}
HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR}/${CMP}
PATH_SUFFIXES ${CMP_INCLUDE_DIR} "." "include" "mod"
NO_CACHE NO_DEFAULT_PATH
)
if(FND_FORT_MODULE)
target_include_directories(esmx_driver PUBLIC ${FND_FORT_MODULE})
elseif(NOT FND_CMAKE_CONFIG)
message(FATAL_ERROR "Cannot find fort_module ${CMP_FORT_MODULE} in ${CMP_INSTALL_PREFIX}")
endif()
unset(FND_FORT_MODULE)
unset(FND_CMAKE_CONFIG)
foreach(CMP_LIBRARY IN ITEMS ${CMP_LIBRARIES})
if(TARGET ${CMP_LIBRARY})
target_link_libraries(esmx_driver PUBLIC ${CMP_LIBRARY})
else()
find_library(FND_LIBRARY
NAMES ${CMP_LIBRARY}
HINTS ${CMP_INSTALL_PREFIX} ${CMAKE_BINARY_DIR}/${CMP}
PATH_SUFFIXES ${CMP_LIBRARY_DIR} "." "lib" "lib64"
NO_CACHE NO_DEFAULT_PATH
)
if(NOT FND_LIBRARY)
message(FATAL_ERROR "Cannot find libraries ${CMP_LIBRARY} in ${CMP_INSTALL_PREFIX}")
endif()
target_link_libraries(esmx_driver PUBLIC ${FND_LIBRARY})
unset(FND_LIBRARY)
endif()
endforeach()
endif()

# link external libraries
foreach(CMP_LINK_LIBRARY IN ITEMS ${CMP_LINK_LIBRARIES})
if(TARGET ${CMP_LINK_LIBRARY})
target_link_libraries(esmx_driver PUBLIC ${CMP_LINK_LIBRARY})
else()
find_library(FND_LINK_LIBRARY
NAMES ${CMP_LINK_LIBRARY}
HINTS ${CMP_LINK_PATHS}
PATH_SUFFIXES "." "lib" "lib64"
NO_CACHE
)
if(NOT FND_LINK_LIBRARY)
message(FATAL_ERROR "Cannot find link_libraries ${CMP_LINK_LIBRARY} in ${CMP_LINK_PATHS}")
if(${CMP_LINK_INTO_APP} STREQUAL "True")
foreach(CMP_LINK_LIBRARY IN ITEMS ${CMP_LINK_LIBRARIES})
if(TARGET ${CMP_LINK_LIBRARY})
target_link_libraries(esmx_driver PUBLIC ${CMP_LINK_LIBRARY})
else()
find_library(FND_LINK_LIBRARY
NAMES ${CMP_LINK_LIBRARY}
HINTS ${CMP_LINK_PATHS}
PATH_SUFFIXES "." "lib" "lib64"
NO_CACHE
)
if(NOT FND_LINK_LIBRARY)
message(FATAL_ERROR "Cannot find link_libraries ${CMP_LINK_LIBRARY} in ${CMP_LINK_PATHS}")
endif()
target_link_libraries(esmx_driver PUBLIC ${FND_LINK_LIBRARY})
unset(FND_LINK_LIBRARY)
endif()
target_link_libraries(esmx_driver PUBLIC ${FND_LINK_LIBRARY})
unset(FND_LINK_LIBRARY)
endif()
endforeach()
endforeach()
endif()

# add component test
if(ESMX_TEST)
Expand Down
6 changes: 5 additions & 1 deletion src/addon/ESMX/Driver/esmx_comp_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def create_compList(cmpCfg: ESMXCmpCfg, odir):
ESMXOpt('build_args', '', str),
ESMXOpt('link_libraries', '', str),
ESMXOpt('link_paths', '', dir),
ESMXOpt('link_into_app', 'True', str),
ESMXOpt('git_repository', '', str),
ESMXOpt('git_tag', '', str),
ESMXOpt('git_dir', '', dir),
Expand All @@ -44,6 +45,9 @@ def create_compList(cmpCfg: ESMXCmpCfg, odir):
dirs[i] = os.path.abspath(dirs[i])
val = ';'.join(dirs)
f.write('set({}-{} {})\n'.format(cmp, opt.upper(), val))
if opt.option == "link_into_app":
if not val:
cmpCfg.remove_ci(cmp)

def create_compUse(comps: ESMXCmpCfg, odir):
# open file
Expand Down Expand Up @@ -107,7 +111,7 @@ def main(argv):
for dis in disable_comps:
comps.remove_ci(dis)

# create compList.txt for CMake
# create compList.txt for CMake, and remove unlinked components from list
create_compList(comps, odir)

# create compUse.inc
Expand Down
1 change: 1 addition & 0 deletions src/addon/ESMX/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ This section contains a key for for each *component-name*, specifying component
| `library_dir` | subdirectory for library file | `lib` |
| `include_dir` | subdirectory for fortran module file | `include` |
| `link_paths` | search path for external libraries | *None* |
| `link_into_app` | whether to link component into the app | `True` |
| `link_libraries` | external libraries, linked to esmx | *None* |
| `git_repository` | URL for downloading git repository | *None* |
| `git_tag` | tag for downloading git repository | *None* |
Expand Down

0 comments on commit 42988fb

Please sign in to comment.