From 4dcd27178d56f69aa9cfe88f3bd7413b48003f65 Mon Sep 17 00:00:00 2001 From: "Roscoe A. Bartlett" Date: Mon, 17 Feb 2025 16:46:44 -0700 Subject: [PATCH] Add support for tribits_add_library( ... HEADERONLY ... ) ToDo: We need to check that the SOURCES var is empty if HEADERONLY is passed in. Current, we just ignore SOURCES. Signed-off-by: Roscoe A. Bartlett --- tribits/CHANGELOG.md | 6 ++ .../core/package_arch/TribitsAddLibrary.cmake | 68 +++++++++++++------ .../packages/mixed_lang/src/CMakeLists.txt | 2 + .../mixed_lang/src/vector/CMakeLists.txt | 8 +++ .../src/{ => vector}/Vector_Lite.hh | 0 5 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 tribits/examples/TribitsExampleProject/packages/mixed_lang/src/vector/CMakeLists.txt rename tribits/examples/TribitsExampleProject/packages/mixed_lang/src/{ => vector}/Vector_Lite.hh (100%) diff --git a/tribits/CHANGELOG.md b/tribits/CHANGELOG.md index e0335a5ef..66cbb2bd1 100644 --- a/tribits/CHANGELOG.md +++ b/tribits/CHANGELOG.md @@ -2,6 +2,12 @@ ChangeLog for TriBITS ---------------------------------------- +## 2025-02-17: + +* **Added:** Added support for header-only libraries with + `tribits_add_library()` with new keyword `HEADERONLY`. See + updated documentation. + ## 2024-10-08: * **Changed:** The TriBITS framework find operation for diff --git a/tribits/core/package_arch/TribitsAddLibrary.cmake b/tribits/core/package_arch/TribitsAddLibrary.cmake index 6cfc7f661..9bb483f68 100644 --- a/tribits/core/package_arch/TribitsAddLibrary.cmake +++ b/tribits/core/package_arch/TribitsAddLibrary.cmake @@ -35,7 +35,7 @@ include(TribitsSetAndIncDirs) # [HEADERS

...] # [HEADERS_INSTALL_SUBDIR ] # [NOINSTALLHEADERS ...] -# [SOURCES ...] +# [SOURCES ...|HEADERONLY] # [DEPLIBS ...] # [IMPORTEDLIBS ...] # [STATIC|SHARED] @@ -150,6 +150,12 @@ include(TribitsSetAndIncDirs) # if, for example, ``-fPIC`` is specified). So be careful to use # ``STATIC`` in all downstream libraries! # +# ``HEADERONLY`` +# +# If passed in, then the ```` library target will be +# declared ``INTERFACE`` and the ``SOURCES`` argument must be empty. This +# is used to create a header-only library. +# # ``TESTONLY`` # # If passed in, then ```` will **not** be added to @@ -319,7 +325,7 @@ function(tribits_add_library LIBRARY_NAME_IN) #prefix PARSE #Options - "STATIC;SHARED;TESTONLY;NO_INSTALL_LIB_OR_HEADERS;CUDALIBRARY" + "STATIC;SHARED;HEADERONLY;TESTONLY;NO_INSTALL_LIB_OR_HEADERS;CUDALIBRARY" #one_value_keywords "" #mulit_value_keywords @@ -369,27 +375,39 @@ function(tribits_add_library LIBRARY_NAME_IN) add_definitions(${PARSE_DEFINES}) endif() + if (PARSE_HEADERONLY) + set(tribitsAddLibraryIncludeDirsMode "INTERFACE") + else() + set(tribitsAddLibraryIncludeDirsMode "PUBLIC") + endif() + + set(STATIC_KEYWORD "") + set(SHARED_KEYWORD "") + if (PARSE_STATIC) set(STATIC_KEYWORD "STATIC") - else() - set(STATIC_KEYWORD "") endif() if (PARSE_SHARED) set(SHARED_KEYWORD "SHARED") - else() - set(SHARED_KEYWORD "") endif() if (NOT PARSE_CUDALIBRARY) - add_library( - ${LIBRARY_NAME} - ${STATIC_KEYWORD} - ${SHARED_KEYWORD} - ${PARSE_HEADERS} - ${PARSE_NOINSTALLHEADERS} - ${PARSE_SOURCES} - ) + if (PARSE_HEADERONLY) + add_library( + ${LIBRARY_NAME} + INTERFACE + ) + else() + add_library( + ${LIBRARY_NAME} + ${STATIC_KEYWORD} + ${SHARED_KEYWORD} + ${PARSE_HEADERS} + ${PARSE_NOINSTALLHEADERS} + ${PARSE_SOURCES} + ) + endif() else() cuda_add_library( ${LIBRARY_NAME} @@ -433,30 +451,35 @@ function(tribits_add_library LIBRARY_NAME_IN) # DEPLIBS foreach(depLib ${PARSE_DEPLIBS}) - target_link_libraries(${LIBRARY_NAME} PUBLIC "${LIBRARY_NAME_PREFIX}${depLib}") + target_link_libraries(${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} "${LIBRARY_NAME_PREFIX}${depLib}") endforeach() # ${PACKAGE_NAME}_LIBRARIES - target_link_libraries(${LIBRARY_NAME} PUBLIC ${${PACKAGE_NAME}_LIBRARIES}) + target_link_libraries(${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} ${${PACKAGE_NAME}_LIBRARIES}) # ${PACKAGE_NAME}_LIB_ENABLED_DEPENDENCIES foreach(depPkg IN LISTS ${PACKAGE_NAME}_LIB_ENABLED_DEPENDENCIES) - target_link_libraries(${LIBRARY_NAME} PUBLIC ${depPkg}::all_libs) + target_link_libraries(${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} ${depPkg}::all_libs) endforeach() # ${PACKAGE_NAME}_TEST_ENABLED_DEPENDENCIES (TESTONLY lib) if (PARSE_TESTONLY) foreach(depPkg IN LISTS ${PACKAGE_NAME}_TEST_ENABLED_DEPENDENCIES) - target_link_libraries(${LIBRARY_NAME} PUBLIC ${depPkg}::all_libs) + target_link_libraries(${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} ${depPkg}::all_libs) endforeach() endif() # IMPORTEDLIBS foreach(importedLib ${PARSE_IMPORTEDLIBS}) - target_link_libraries(${LIBRARY_NAME} PUBLIC "${importedLib}") + target_link_libraries(${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} "${importedLib}") endforeach() # ToDo: #63: Above, allow for other link visibilities other than 'PUBLIC'! if (${PROJECT_NAME}_CXX_STANDARD_FEATURE) - target_compile_features(${LIBRARY_NAME} PUBLIC - "${${PROJECT_NAME}_CXX_STANDARD_FEATURE}") + target_compile_features(${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} "${${PROJECT_NAME}_CXX_STANDARD_FEATURE}") endif() # Add to the install target @@ -510,7 +533,8 @@ function(tribits_add_library LIBRARY_NAME_IN) foreach (includeDir IN LISTS INCLUDE_DIRS_CURRENT) list(APPEND buildInterfaceIncludeDirs "$") endforeach() - target_include_directories( ${LIBRARY_NAME} PUBLIC ${buildInterfaceIncludeDirs} ) + target_include_directories( ${LIBRARY_NAME} + ${tribitsAddLibraryIncludeDirsMode} ${buildInterfaceIncludeDirs} ) # Add ALIAS library :: add_library(${PACKAGE_NAME}::${LIBRARY_NAME} ALIAS ${LIBRARY_NAME}) diff --git a/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/CMakeLists.txt b/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/CMakeLists.txt index ddbeb6658..e85bf84cd 100644 --- a/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/CMakeLists.txt +++ b/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/CMakeLists.txt @@ -1,5 +1,6 @@ tribits_configure_file(${PACKAGE_NAME}_config.h) +add_subdirectory(vector) set(HEADERS "") set(SOURCES "") @@ -26,4 +27,5 @@ tribits_add_library( mixedlang HEADERS ${HEADERS} SOURCES ${SOURCES} + DEPLIBS mixedlang_vector ) diff --git a/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/vector/CMakeLists.txt b/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/vector/CMakeLists.txt new file mode 100644 index 000000000..e42ceb265 --- /dev/null +++ b/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/vector/CMakeLists.txt @@ -0,0 +1,8 @@ +tribits_include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + +tribits_add_library( + mixedlang_vector + HEADERONLY + HEADERS Vector_Lite.hh + HEADERS_INSTALL_SUBDIR vector + ) diff --git a/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/Vector_Lite.hh b/tribits/examples/TribitsExampleProject/packages/mixed_lang/src/vector/Vector_Lite.hh similarity index 100% rename from tribits/examples/TribitsExampleProject/packages/mixed_lang/src/Vector_Lite.hh rename to tribits/examples/TribitsExampleProject/packages/mixed_lang/src/vector/Vector_Lite.hh