Skip to content

Commit

Permalink
Merge pull request #626 from bartlettroscoe/625-headeronly-libs
Browse files Browse the repository at this point in the history
Add support for tribits_add_library( ... HEADERONLY ... )  (#625)
  • Loading branch information
bartlettroscoe authored Feb 21, 2025
2 parents a3ddcf6 + fdcb586 commit c26021e
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 32 deletions.
17 changes: 11 additions & 6 deletions test/core/ExamplesUnitTests/TribitsExampleProject_Tests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ function(TribitsExampleProject_ALL_ST_NoFortran sharedOrStatic serialOrMpi)
"WithSubpackages_MPI_EXEC_MAX_NUMPROCS = '${MPI_EXEC_MAX_NUMPROCS}'"
"WithSubpackages_MPI_EXEC_NUMPROCS_FLAG = '${MPI_EXEC_NUMPROCS_FLAG}'"
"WithSubpackages_FOUND = '1'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesB::pws_b[;]WithSubpackagesC::pws_c'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesA::all_libs[;]WithSubpackagesB::pws_b[;]WithSubpackagesB::all_libs[;]WithSubpackagesC::pws_c[;]WithSubpackagesC::all_libs'"
"-- Configuring done"
"-- Generating done"
ALWAYS_FAIL_ON_NONZERO_RETURN
Expand Down Expand Up @@ -399,7 +399,7 @@ function(TribitsExampleProject_ALL_ST_NoFortran sharedOrStatic serialOrMpi)
"WithSubpackages_MPI_EXEC_MAX_NUMPROCS = '${MPI_EXEC_MAX_NUMPROCS}'"
"WithSubpackages_MPI_EXEC_NUMPROCS_FLAG = '${MPI_EXEC_NUMPROCS_FLAG}'"
"WithSubpackages_FOUND = '1'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesB::pws_b[;]WithSubpackagesC::pws_c'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesA::all_libs[;]WithSubpackagesB::pws_b[;]WithSubpackagesB::all_libs[;]WithSubpackagesC::pws_c[;]WithSubpackagesC::all_libs'"
ALWAYS_FAIL_ON_NONZERO_RETURN

TEST_8
Expand Down Expand Up @@ -1303,7 +1303,7 @@ tribits_add_advanced_test( TribitsExampleProject_ALL_ST_NoFortran_Ninja
-P ${CMAKE_CURRENT_SOURCE_DIR}/RunDummyPackageClientBulid.cmake
PASS_REGULAR_EXPRESSION_ALL
"WithSubpackages_INSTALL_DIR = '.*/TriBITS_TribitsExampleProject_ALL_ST_NoFortran_Ninja/install'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesB::pws_b[;]WithSubpackagesC::pws_c'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesA::all_libs[;]WithSubpackagesB::pws_b[;]WithSubpackagesB::all_libs[;]WithSubpackagesC::pws_c[;]WithSubpackagesC::all_libs'"
ALWAYS_FAIL_ON_NONZERO_RETURN

TEST_6 CMND ninja ARGS -j1 install ${CTEST_BUILD_FLAGS}
Expand All @@ -1327,7 +1327,7 @@ tribits_add_advanced_test( TribitsExampleProject_ALL_ST_NoFortran_Ninja
PASS_REGULAR_EXPRESSION_ALL
"Calling: find_package[(]WithSubpackages REQUIRED COMPONENTS OPTIONAL_COMPONENTS [)]"
"WithSubpackages_FOUND = '1'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesB::pws_b[;]WithSubpackagesC::pws_c'"
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesA::all_libs[;]WithSubpackagesB::pws_b[;]WithSubpackagesB::all_libs[;]WithSubpackagesC::pws_c[;]WithSubpackagesC::all_libs'"
ALWAYS_FAIL_ON_NONZERO_RETURN

TEST_8 CMND ninja ARGS -j1 package_source
Expand Down Expand Up @@ -1591,7 +1591,12 @@ tribits_add_advanced_test( TribitsExampleProject_ALL_ST
"Configuring done"
"Generating done"
"Build files have been written to: .*ExamplesUnitTests/TriBITS_TribitsExampleProject_ALL_ST"
TEST_1 CMND make
TEST_1
MESSAGE "Grep MixedLangTargets.cmake to ensure INTERFACE library mixedlang_vector in all_libs"
CMND grep ARGS -A 1 "set_target_properties.MixedLang::all_libs PROPERTIES" cmake_packages/MixedLang/MixedLangTargets.cmake
PASS_REGULAR_EXPRESSION_ALL
"INTERFACE_LINK_LIBRARIES .MixedLang::mixedlang_vector[;]MixedLang::mixedlang."
TEST_2 CMND make
MESSAGE "Build the default 'all' target using raw 'make'"
ARGS ${CTEST_BUILD_FLAGS}
PASS_REGULAR_EXPRESSION_ALL
Expand All @@ -1600,7 +1605,7 @@ tribits_add_advanced_test( TribitsExampleProject_ALL_ST
"Built target pws_a"
"Built target pws_b"
"Built target pws_c"
TEST_2 CMND ${CMAKE_CTEST_COMMAND} ARGS -VV
TEST_3 CMND ${CMAKE_CTEST_COMMAND} ARGS -VV
MESSAGE "Run all the tests with raw 'ctest'"
PASS_REGULAR_EXPRESSION_ALL
"SimpleCxx_HelloWorldTests${TEST_MPI_1_SUFFIX} .* Passed"
Expand Down
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
8 changes: 4 additions & 4 deletions tribits/core/package_arch/TribitsPackageMacros.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -669,9 +669,9 @@ macro(tribits_package_postprocess_common)

tribits_package_create_all_libs_interface_library()

if (${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES)
# Create the configure file so external projects can find packages with a
# call to find_package(<package_name>).
if (${PROJECT_NAME}_ENABLE_INSTALL_CMAKE_CONFIG_FILES
AND (NOT ${PROJECT_NAME}_ENABLE_INSTALLATION_TESTING)
)
tribits_write_package_client_export_files(${PACKAGE_NAME})
endif()

Expand All @@ -689,7 +689,7 @@ macro(tribits_package_create_all_libs_interface_library)

# Find all of the non-TESTONLY library targets
tribits_get_all_build_targets_including_in_subdirs("${CMAKE_CURRENT_SOURCE_DIR}"
"STATIC_LIBRARY;SHARED_LIBRARY"
"STATIC_LIBRARY;SHARED_LIBRARY;INTERFACE_LIBRARY"
allPackageBuildableLibTargetsList )
#print_var(allPackageBuildableLibTargetsList)
set(packageLibsInAllLibsList)
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 c26021e

Please sign in to comment.