Skip to content

Commit c26021e

Browse files
Merge pull request #626 from bartlettroscoe/625-headeronly-libs
Add support for tribits_add_library( ... HEADERONLY ... ) (#625)
2 parents a3ddcf6 + fdcb586 commit c26021e

File tree

7 files changed

+77
-32
lines changed

7 files changed

+77
-32
lines changed

test/core/ExamplesUnitTests/TribitsExampleProject_Tests.cmake

+11-6
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ function(TribitsExampleProject_ALL_ST_NoFortran sharedOrStatic serialOrMpi)
313313
"WithSubpackages_MPI_EXEC_MAX_NUMPROCS = '${MPI_EXEC_MAX_NUMPROCS}'"
314314
"WithSubpackages_MPI_EXEC_NUMPROCS_FLAG = '${MPI_EXEC_NUMPROCS_FLAG}'"
315315
"WithSubpackages_FOUND = '1'"
316-
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesB::pws_b[;]WithSubpackagesC::pws_c'"
316+
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesA::all_libs[;]WithSubpackagesB::pws_b[;]WithSubpackagesB::all_libs[;]WithSubpackagesC::pws_c[;]WithSubpackagesC::all_libs'"
317317
"-- Configuring done"
318318
"-- Generating done"
319319
ALWAYS_FAIL_ON_NONZERO_RETURN
@@ -399,7 +399,7 @@ function(TribitsExampleProject_ALL_ST_NoFortran sharedOrStatic serialOrMpi)
399399
"WithSubpackages_MPI_EXEC_MAX_NUMPROCS = '${MPI_EXEC_MAX_NUMPROCS}'"
400400
"WithSubpackages_MPI_EXEC_NUMPROCS_FLAG = '${MPI_EXEC_NUMPROCS_FLAG}'"
401401
"WithSubpackages_FOUND = '1'"
402-
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesB::pws_b[;]WithSubpackagesC::pws_c'"
402+
"WithSubpackages::all_libs INTERFACE_LINK_LIBRARIES: 'WithSubpackagesA::pws_a[;]WithSubpackagesA::all_libs[;]WithSubpackagesB::pws_b[;]WithSubpackagesB::all_libs[;]WithSubpackagesC::pws_c[;]WithSubpackagesC::all_libs'"
403403
ALWAYS_FAIL_ON_NONZERO_RETURN
404404

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

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

13331333
TEST_8 CMND ninja ARGS -j1 package_source
@@ -1591,7 +1591,12 @@ tribits_add_advanced_test( TribitsExampleProject_ALL_ST
15911591
"Configuring done"
15921592
"Generating done"
15931593
"Build files have been written to: .*ExamplesUnitTests/TriBITS_TribitsExampleProject_ALL_ST"
1594-
TEST_1 CMND make
1594+
TEST_1
1595+
MESSAGE "Grep MixedLangTargets.cmake to ensure INTERFACE library mixedlang_vector in all_libs"
1596+
CMND grep ARGS -A 1 "set_target_properties.MixedLang::all_libs PROPERTIES" cmake_packages/MixedLang/MixedLangTargets.cmake
1597+
PASS_REGULAR_EXPRESSION_ALL
1598+
"INTERFACE_LINK_LIBRARIES .MixedLang::mixedlang_vector[;]MixedLang::mixedlang."
1599+
TEST_2 CMND make
15951600
MESSAGE "Build the default 'all' target using raw 'make'"
15961601
ARGS ${CTEST_BUILD_FLAGS}
15971602
PASS_REGULAR_EXPRESSION_ALL
@@ -1600,7 +1605,7 @@ tribits_add_advanced_test( TribitsExampleProject_ALL_ST
16001605
"Built target pws_a"
16011606
"Built target pws_b"
16021607
"Built target pws_c"
1603-
TEST_2 CMND ${CMAKE_CTEST_COMMAND} ARGS -VV
1608+
TEST_3 CMND ${CMAKE_CTEST_COMMAND} ARGS -VV
16041609
MESSAGE "Run all the tests with raw 'ctest'"
16051610
PASS_REGULAR_EXPRESSION_ALL
16061611
"SimpleCxx_HelloWorldTests${TEST_MPI_1_SUFFIX} .* Passed"

tribits/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
ChangeLog for TriBITS
33
----------------------------------------
44

5+
## 2025-02-17:
6+
7+
* **Added:** Added support for header-only libraries with
8+
`tribits_add_library()` with new keyword `HEADERONLY`. See
9+
updated documentation.
10+
511
## 2024-10-08:
612

713
* **Changed:** The TriBITS framework find operation for

tribits/core/package_arch/TribitsAddLibrary.cmake

+46-22
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ include(TribitsSetAndIncDirs)
3535
# [HEADERS <h0> <h1> ...]
3636
# [HEADERS_INSTALL_SUBDIR <headerssubdir>]
3737
# [NOINSTALLHEADERS <nih0> <hih1> ...]
38-
# [SOURCES <src0> <src1> ...]
38+
# [SOURCES <src0> <src1> ...|HEADERONLY]
3939
# [DEPLIBS <deplib0> <deplib1> ...]
4040
# [IMPORTEDLIBS <ideplib0> <ideplib1> ...]
4141
# [STATIC|SHARED]
@@ -150,6 +150,12 @@ include(TribitsSetAndIncDirs)
150150
# if, for example, ``-fPIC`` is specified). So be careful to use
151151
# ``STATIC`` in all downstream libraries!
152152
#
153+
# ``HEADERONLY``
154+
#
155+
# If passed in, then the ``<libTargetName>`` library target will be
156+
# declared ``INTERFACE`` and the ``SOURCES`` argument must be empty. This
157+
# is used to create a header-only library.
158+
#
153159
# ``TESTONLY``
154160
#
155161
# If passed in, then ``<libTargetName>`` will **not** be added to
@@ -319,7 +325,7 @@ function(tribits_add_library LIBRARY_NAME_IN)
319325
#prefix
320326
PARSE
321327
#Options
322-
"STATIC;SHARED;TESTONLY;NO_INSTALL_LIB_OR_HEADERS;CUDALIBRARY"
328+
"STATIC;SHARED;HEADERONLY;TESTONLY;NO_INSTALL_LIB_OR_HEADERS;CUDALIBRARY"
323329
#one_value_keywords
324330
""
325331
#mulit_value_keywords
@@ -369,27 +375,39 @@ function(tribits_add_library LIBRARY_NAME_IN)
369375
add_definitions(${PARSE_DEFINES})
370376
endif()
371377

378+
if (PARSE_HEADERONLY)
379+
set(tribitsAddLibraryIncludeDirsMode "INTERFACE")
380+
else()
381+
set(tribitsAddLibraryIncludeDirsMode "PUBLIC")
382+
endif()
383+
384+
set(STATIC_KEYWORD "")
385+
set(SHARED_KEYWORD "")
386+
372387
if (PARSE_STATIC)
373388
set(STATIC_KEYWORD "STATIC")
374-
else()
375-
set(STATIC_KEYWORD "")
376389
endif()
377390

378391
if (PARSE_SHARED)
379392
set(SHARED_KEYWORD "SHARED")
380-
else()
381-
set(SHARED_KEYWORD "")
382393
endif()
383394

384395
if (NOT PARSE_CUDALIBRARY)
385-
add_library(
386-
${LIBRARY_NAME}
387-
${STATIC_KEYWORD}
388-
${SHARED_KEYWORD}
389-
${PARSE_HEADERS}
390-
${PARSE_NOINSTALLHEADERS}
391-
${PARSE_SOURCES}
392-
)
396+
if (PARSE_HEADERONLY)
397+
add_library(
398+
${LIBRARY_NAME}
399+
INTERFACE
400+
)
401+
else()
402+
add_library(
403+
${LIBRARY_NAME}
404+
${STATIC_KEYWORD}
405+
${SHARED_KEYWORD}
406+
${PARSE_HEADERS}
407+
${PARSE_NOINSTALLHEADERS}
408+
${PARSE_SOURCES}
409+
)
410+
endif()
393411
else()
394412
cuda_add_library(
395413
${LIBRARY_NAME}
@@ -433,30 +451,35 @@ function(tribits_add_library LIBRARY_NAME_IN)
433451

434452
# DEPLIBS
435453
foreach(depLib ${PARSE_DEPLIBS})
436-
target_link_libraries(${LIBRARY_NAME} PUBLIC "${LIBRARY_NAME_PREFIX}${depLib}")
454+
target_link_libraries(${LIBRARY_NAME}
455+
${tribitsAddLibraryIncludeDirsMode} "${LIBRARY_NAME_PREFIX}${depLib}")
437456
endforeach()
438457
# ${PACKAGE_NAME}_LIBRARIES
439-
target_link_libraries(${LIBRARY_NAME} PUBLIC ${${PACKAGE_NAME}_LIBRARIES})
458+
target_link_libraries(${LIBRARY_NAME}
459+
${tribitsAddLibraryIncludeDirsMode} ${${PACKAGE_NAME}_LIBRARIES})
440460
# ${PACKAGE_NAME}_LIB_ENABLED_DEPENDENCIES
441461
foreach(depPkg IN LISTS ${PACKAGE_NAME}_LIB_ENABLED_DEPENDENCIES)
442-
target_link_libraries(${LIBRARY_NAME} PUBLIC ${depPkg}::all_libs)
462+
target_link_libraries(${LIBRARY_NAME}
463+
${tribitsAddLibraryIncludeDirsMode} ${depPkg}::all_libs)
443464
endforeach()
444465
# ${PACKAGE_NAME}_TEST_ENABLED_DEPENDENCIES (TESTONLY lib)
445466
if (PARSE_TESTONLY)
446467
foreach(depPkg IN LISTS ${PACKAGE_NAME}_TEST_ENABLED_DEPENDENCIES)
447-
target_link_libraries(${LIBRARY_NAME} PUBLIC ${depPkg}::all_libs)
468+
target_link_libraries(${LIBRARY_NAME}
469+
${tribitsAddLibraryIncludeDirsMode} ${depPkg}::all_libs)
448470
endforeach()
449471
endif()
450472
# IMPORTEDLIBS
451473
foreach(importedLib ${PARSE_IMPORTEDLIBS})
452-
target_link_libraries(${LIBRARY_NAME} PUBLIC "${importedLib}")
474+
target_link_libraries(${LIBRARY_NAME}
475+
${tribitsAddLibraryIncludeDirsMode} "${importedLib}")
453476
endforeach()
454477

455478
# ToDo: #63: Above, allow for other link visibilities other than 'PUBLIC'!
456479

457480
if (${PROJECT_NAME}_CXX_STANDARD_FEATURE)
458-
target_compile_features(${LIBRARY_NAME} PUBLIC
459-
"${${PROJECT_NAME}_CXX_STANDARD_FEATURE}")
481+
target_compile_features(${LIBRARY_NAME}
482+
${tribitsAddLibraryIncludeDirsMode} "${${PROJECT_NAME}_CXX_STANDARD_FEATURE}")
460483
endif()
461484

462485
# Add to the install target
@@ -510,7 +533,8 @@ function(tribits_add_library LIBRARY_NAME_IN)
510533
foreach (includeDir IN LISTS INCLUDE_DIRS_CURRENT)
511534
list(APPEND buildInterfaceIncludeDirs "$<BUILD_INTERFACE:${includeDir}>")
512535
endforeach()
513-
target_include_directories( ${LIBRARY_NAME} PUBLIC ${buildInterfaceIncludeDirs} )
536+
target_include_directories( ${LIBRARY_NAME}
537+
${tribitsAddLibraryIncludeDirsMode} ${buildInterfaceIncludeDirs} )
514538

515539
# Add ALIAS library <PackageName>::<libname>
516540
add_library(${PACKAGE_NAME}::${LIBRARY_NAME} ALIAS ${LIBRARY_NAME})

tribits/core/package_arch/TribitsPackageMacros.cmake

+4-4
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,9 @@ macro(tribits_package_postprocess_common)
669669

670670
tribits_package_create_all_libs_interface_library()
671671

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

@@ -689,7 +689,7 @@ macro(tribits_package_create_all_libs_interface_library)
689689

690690
# Find all of the non-TESTONLY library targets
691691
tribits_get_all_build_targets_including_in_subdirs("${CMAKE_CURRENT_SOURCE_DIR}"
692-
"STATIC_LIBRARY;SHARED_LIBRARY"
692+
"STATIC_LIBRARY;SHARED_LIBRARY;INTERFACE_LIBRARY"
693693
allPackageBuildableLibTargetsList )
694694
#print_var(allPackageBuildableLibTargetsList)
695695
set(packageLibsInAllLibsList)

tribits/examples/TribitsExampleProject/packages/mixed_lang/src/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
tribits_configure_file(${PACKAGE_NAME}_config.h)
22

3+
add_subdirectory(vector)
34

45
set(HEADERS "")
56
set(SOURCES "")
@@ -26,4 +27,5 @@ tribits_add_library(
2627
mixedlang
2728
HEADERS ${HEADERS}
2829
SOURCES ${SOURCES}
30+
DEPLIBS mixedlang_vector
2931
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
tribits_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
2+
3+
tribits_add_library(
4+
mixedlang_vector
5+
HEADERONLY
6+
HEADERS Vector_Lite.hh
7+
HEADERS_INSTALL_SUBDIR vector
8+
)

0 commit comments

Comments
 (0)