Skip to content

Commit

Permalink
Add support for tribits_add_library( ... HEADERONLY ... )
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
bartlettroscoe committed Feb 21, 2025
1 parent a3ddcf6 commit 4dcd271
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 22 deletions.
6 changes: 6 additions & 0 deletions tribits/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
68 changes: 46 additions & 22 deletions tribits/core/package_arch/TribitsAddLibrary.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ include(TribitsSetAndIncDirs)
# [HEADERS <h0> <h1> ...]
# [HEADERS_INSTALL_SUBDIR <headerssubdir>]
# [NOINSTALLHEADERS <nih0> <hih1> ...]
# [SOURCES <src0> <src1> ...]
# [SOURCES <src0> <src1> ...|HEADERONLY]
# [DEPLIBS <deplib0> <deplib1> ...]
# [IMPORTEDLIBS <ideplib0> <ideplib1> ...]
# [STATIC|SHARED]
Expand Down Expand Up @@ -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 ``<libTargetName>`` 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 ``<libTargetName>`` will **not** be added to
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -510,7 +533,8 @@ function(tribits_add_library LIBRARY_NAME_IN)
foreach (includeDir IN LISTS INCLUDE_DIRS_CURRENT)
list(APPEND buildInterfaceIncludeDirs "$<BUILD_INTERFACE:${includeDir}>")
endforeach()
target_include_directories( ${LIBRARY_NAME} PUBLIC ${buildInterfaceIncludeDirs} )
target_include_directories( ${LIBRARY_NAME}
${tribitsAddLibraryIncludeDirsMode} ${buildInterfaceIncludeDirs} )

# Add ALIAS library <PackageName>::<libname>
add_library(${PACKAGE_NAME}::${LIBRARY_NAME} ALIAS ${LIBRARY_NAME})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
tribits_configure_file(${PACKAGE_NAME}_config.h)

add_subdirectory(vector)

set(HEADERS "")
set(SOURCES "")
Expand All @@ -26,4 +27,5 @@ tribits_add_library(
mixedlang
HEADERS ${HEADERS}
SOURCES ${SOURCES}
DEPLIBS mixedlang_vector
)
Original file line number Diff line number Diff line change
@@ -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
)

0 comments on commit 4dcd271

Please sign in to comment.