From 4afd2bdeb9ba0ff5c988a31f901f1629134cb109 Mon Sep 17 00:00:00 2001 From: "Jonathan R. Madsen" Date: Thu, 3 Mar 2022 14:56:42 -0600 Subject: [PATCH] Support for BUILD_OBJECT_LIBS (#28) - when PTL is a cmake subproject, it can be useful to build an object library so that compiled translation units can be treated as part of the library using PTL - E.g. when parent cmake project compiles with -fvisibility=hidden or -fvisibility=internal - In subproject mode, this eliminates the need to compile all of PTL with default visibility or decorating PTL functions/classes with __attribute__((visibility("default"))) - Bump version to 2.3.2 --- VERSION | 2 +- cmake/Modules/PTLBuildSettings.cmake | 22 ++++++++++++++---- cmake/Modules/PTLCMakeUtilities.cmake | 33 +++++++++++++++------------ source/CMakeLists.txt | 26 +++++++++++++++++---- 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/VERSION b/VERSION index 2bf1c1c..f90b1af 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.1 +2.3.2 diff --git a/cmake/Modules/PTLBuildSettings.cmake b/cmake/Modules/PTLBuildSettings.cmake index 926cccc..1a0162f 100644 --- a/cmake/Modules/PTLBuildSettings.cmake +++ b/cmake/Modules/PTLBuildSettings.cmake @@ -50,10 +50,24 @@ endif() # -------------------------------------------------------------------------------------- # ptl_add_option(BUILD_STATIC_LIBS "Build static library" ON) ptl_add_option(BUILD_SHARED_LIBS "Build shared library" ON) -if((NOT BUILD_SHARED_LIBS) AND (NOT BUILD_STATIC_LIBS)) - message( - FATAL_ERROR - "Neither BUILD_STATIC_LIBS nor BUILD_SHARED_LIBS are set. One must be ON") + +if(NOT "${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}") + ptl_add_option(BUILD_OBJECT_LIBS "Build object library (only valid as subproject)" + OFF) + set(PTL_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) + set(PTL_BUILD_LIBS_ERROR_DESC + "BUILD_STATIC_LIBS, BUILD_SHARED_LIBS, and BUILD_OBJECT_LIBS are all OFF") +else() + set(BUILD_OBJECT_LIBS OFF) + set(PTL_EXCLUDE_FROM_ALL) + set(PTL_BUILD_LIBS_ERROR_DESC + "Neither BUILD_STATIC_LIBS nor BUILD_SHARED_LIBS are set") +endif() + +if((NOT BUILD_SHARED_LIBS) + AND (NOT BUILD_STATIC_LIBS) + AND (NOT BUILD_OBJECT_LIBS)) + message(FATAL_ERROR "${PTL_BUILD_LIBS_ERROR_DESC}. One must be ON") endif() # -------------------------------------------------------------------------------------- # diff --git a/cmake/Modules/PTLCMakeUtilities.cmake b/cmake/Modules/PTLCMakeUtilities.cmake index 9ae6ce1..bba6d36 100644 --- a/cmake/Modules/PTLCMakeUtilities.cmake +++ b/cmake/Modules/PTLCMakeUtilities.cmake @@ -84,15 +84,11 @@ function(ptl_build_library) set(LIB_OUTPUT_NAME ${LIB_TARGET_NAME}) endif() - add_library(${LIB_TARGET_NAME} ${LIB_TYPE} ${LIB_SOURCES}) + add_library(${LIB_TARGET_NAME} ${LIB_TYPE} ${PTL_EXCLUDE_FROM_ALL}) + add_library(${PROJECT_NAME}::${LIB_TARGET_NAME} ALIAS ${LIB_TARGET_NAME}) - set_target_properties( - ${LIB_TARGET_NAME} - PROPERTIES OUTPUT_NAME ${LIB_OUTPUT_NAME} - VERSION ${${PROJECT_NAME}_VERSION} - SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR} - WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_sources(${LIB_TARGET_NAME} PRIVATE ${LIB_SOURCES}) target_compile_definitions(${LIB_TARGET_NAME} PRIVATE $<$:DEBUG>) @@ -106,12 +102,21 @@ function(ptl_build_library) $<$:${${PROJECT_NAME}_CXX_FLAGS}>) endif() + set_target_properties( + ${LIB_TARGET_NAME} + PROPERTIES OUTPUT_NAME ${LIB_OUTPUT_NAME} + VERSION ${${PROJECT_NAME}_VERSION} + SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR} + WINDOWS_EXPORT_ALL_SYMBOLS ON) + # Install the targets and export libraries - install( - TARGETS ${LIB_TARGET_NAME} - EXPORT ${PROJECT_NAME}Targets - COMPONENT Development - ARCHIVE DESTINATION ${PTL_INSTALL_LIBDIR} - LIBRARY DESTINATION ${PTL_INSTALL_LIBDIR} - RUNTIME DESTINATION ${PTL_INSTALL_BINDIR}) + if(NOT "${LIB_TYPE}" STREQUAL "OBJECT") + install( + TARGETS ${LIB_TARGET_NAME} + EXPORT ${PROJECT_NAME}Targets + COMPONENT Development + ARCHIVE DESTINATION ${PTL_INSTALL_LIBDIR} + LIBRARY DESTINATION ${PTL_INSTALL_LIBDIR} + RUNTIME DESTINATION ${PTL_INSTALL_BINDIR} OPTIONAL) + endif() endfunction() diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index defe5d3..ac4a301 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,5 +1,5 @@ # -------------------------------------------------------------------------------------- # -# # General # # +# General # -------------------------------------------------------------------------------------- # # Locate sources and headers for this project - headers are included so they will show up # in IDEs @@ -8,7 +8,7 @@ file(GLOB_RECURSE ptl_headers ${CMAKE_CURRENT_LIST_DIR}/PTL/*.hh file(GLOB_RECURSE ptl_sources ${CMAKE_CURRENT_LIST_DIR}/*.cc) # -------------------------------------------------------------------------------------- # -# # Config, Version # # +# Config, Version # -------------------------------------------------------------------------------------- # configure_file(${PROJECT_SOURCE_DIR}/cmake/Templates/Config.hh.in @@ -22,9 +22,27 @@ configure_file(${PROJECT_SOURCE_DIR}/cmake/Templates/Version.hh.in list(APPEND ptl_headers ${CMAKE_CURRENT_BINARY_DIR}/PTL/Version.hh) # -------------------------------------------------------------------------------------- # -# # PTL Library # # +# PTL Library # -------------------------------------------------------------------------------------- # +if(BUILD_OBJECT_LIBS) + + ptl_build_library( + TYPE OBJECT + TARGET_NAME ptl-object + OUTPUT_NAME ptl + SOURCES ${ptl_headers} ${ptl_sources}) + + target_link_libraries(ptl-object PUBLIC Threads::Threads) + if(PTL_USE_TBB) + target_link_libraries(ptl-object PUBLIC TBB::tbb) + endif() + + target_include_directories( + ptl-object PUBLIC $ + $) +endif() + if(BUILD_SHARED_LIBS) ptl_build_library( @@ -82,7 +100,7 @@ if(BUILD_STATIC_LIBS) endif() # -------------------------------------------------------------------------------------- # -# # Installation # # +# Installation # -------------------------------------------------------------------------------------- # if(PTL_INSTALL_CONFIG)