This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch feature/export_headers in repository https://gitbox.apache.org/repos/asf/celix.git
commit 0e45c16994e0916a82ce213efb9cf160c564ca6d Author: Pepijn Noltes <pepijnnol...@gmail.com> AuthorDate: Sun Apr 16 19:59:40 2023 +0200 Refactor framework and utils object library for export headers --- libs/framework/CMakeLists.txt | 84 +++++++++++++++++++++--------- libs/utils/CMakeLists.txt | 117 ++++++++++++++++++++++++++++++------------ 2 files changed, 144 insertions(+), 57 deletions(-) diff --git a/libs/framework/CMakeLists.txt b/libs/framework/CMakeLists.txt index 3febe6be..302d7b83 100644 --- a/libs/framework/CMakeLists.txt +++ b/libs/framework/CMakeLists.txt @@ -36,32 +36,70 @@ set(SOURCES src/celix_framework_utils.c src/celix_module_private.h) add_library(framework_obj OBJECT ${SOURCES}) -target_include_directories(framework_obj PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> -) -target_include_directories(framework_obj PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include_deprecated) -target_compile_options(framework_obj PRIVATE -DUSE_FILE32API) -target_compile_options(framework_obj PRIVATE -Wno-deprecated-declarations) #note part of the api is deprecated, ignore this warning on own api -target_link_libraries(framework_obj PUBLIC Celix::utils ${CELIX_OPTIONAL_EXTRA_LIBS}) -target_link_libraries(framework_obj PUBLIC libuuid::libuuid CURL::libcurl ZLIB::ZLIB) -target_link_libraries(framework_obj PRIVATE ${CMAKE_DL_LIBS}) -celix_deprecated_utils_headers(framework_obj) -generate_export_header(framework_obj - BASE_NAME "CELIX_FRAMWORK" - EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/celix/gen/includes/framework/celix_framework_export.h") -target_include_directories(utils_obj PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/celix/gen/includes/framework>) +set(CELIX_FRAMEWORK_CMAKE_CONFIGURE_ALT_OPTION ON) +if (CELIX_FRAMEWORK_CMAKE_CONFIGURE_ALT_OPTION) + function (celix_configure_framework_target) + list(GET ARGN 0 FRAMEWORK_TARGET_NAME) -add_library(framework SHARED) -target_link_libraries(framework PUBLIC framework_obj) -set_target_properties(framework - PROPERTIES - C_VISIBILITY_PRESET hidden - "VERSION" "${CELIX_MAJOR}.${CELIX_MINOR}.${CELIX_MICRO}" - "SOVERSION" ${CELIX_MAJOR} - OUTPUT_NAME "celix_framework") + target_include_directories(${FRAMEWORK_TARGET_NAME} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/include_deprecated + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> + $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/celix/gen/includes/${FRAMEWORK_TARGET_NAME}>) + target_compile_options(${FRAMEWORK_TARGET_NAME} PRIVATE -DUSE_FILE32API) + target_compile_options(${FRAMEWORK_TARGET_NAME} PRIVATE -Wno-deprecated-declarations) #note part of the api is deprecated, ignore this warning on own api + target_link_libraries(${FRAMEWORK_TARGET_NAME} PUBLIC Celix::utils ${CELIX_OPTIONAL_EXTRA_LIBS}) + target_link_libraries(${FRAMEWORK_TARGET_NAME} PUBLIC libuuid::libuuid CURL::libcurl ZLIB::ZLIB) + target_link_libraries(${FRAMEWORK_TARGET_NAME} PRIVATE ${CMAKE_DL_LIBS}) + set_target_properties(${FRAMEWORK_TARGET_NAME} PROPERTIES C_VISIBILITY_PRESET hidden) + celix_deprecated_utils_headers(${FRAMEWORK_TARGET_NAME}) -celix_deprecated_utils_headers(framework) + generate_export_header(${FRAMEWORK_TARGET_NAME} + BASE_NAME "CELIX_FRAMEWORK" + EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/celix/gen/includes/${FRAMEWORK_TARGET_NAME}/celix_framework_export.h") + endfunction () + + celix_configure_framework_target(framework_obj) + + add_library(framework SHARED $<TARGET_OBJECTS:framework_obj>) + celix_configure_framework_target(framework) + set_target_properties(framework + PROPERTIES + "VERSION" "${CELIX_MAJOR}.${CELIX_MINOR}.${CELIX_MICRO}" + "SOVERSION" ${CELIX_MAJOR} + OUTPUT_NAME "celix_framework") +else () + target_include_directories(framework_obj PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> + ) + target_include_directories(framework_obj PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include_deprecated) + target_compile_options(framework_obj PRIVATE -DUSE_FILE32API) + target_compile_options(framework_obj PRIVATE -Wno-deprecated-declarations) #note part of the api is deprecated, ignore this warning on own api + target_link_libraries(framework_obj PUBLIC Celix::utils ${CELIX_OPTIONAL_EXTRA_LIBS}) + target_link_libraries(framework_obj PUBLIC libuuid::libuuid CURL::libcurl ZLIB::ZLIB) + target_link_libraries(framework_obj PRIVATE ${CMAKE_DL_LIBS}) + #Note visibility preset is also needed on OBJECT libraries, to work correctly + set_target_properties(framework_obj PROPERTIES C_VISIBILITY_PRESET hidden) + celix_deprecated_utils_headers(framework_obj) + + generate_export_header(framework_obj + BASE_NAME "CELIX_FRAMEWORK" + EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/celix/gen/includes/framework/celix_framework_export.h") + target_include_directories(utils_obj PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/celix/gen/includes/framework>) + + add_library(framework SHARED) + target_link_libraries(framework PUBLIC framework_obj) + set_target_properties(framework + PROPERTIES + C_VISIBILITY_PRESET hidden + "VERSION" "${CELIX_MAJOR}.${CELIX_MINOR}.${CELIX_MICRO}" + "SOVERSION" ${CELIX_MAJOR} + OUTPUT_NAME "celix_framework") + + celix_deprecated_utils_headers(framework) +endif () # By omitting OBJECTS DESTINATION, object files will NOT be installed. install(TARGETS framework framework_obj EXPORT celix LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework diff --git a/libs/utils/CMakeLists.txt b/libs/utils/CMakeLists.txt index 3623a29d..ead1a020 100644 --- a/libs/utils/CMakeLists.txt +++ b/libs/utils/CMakeLists.txt @@ -46,43 +46,92 @@ add_library(utils_obj OBJECT src/celix_convert_utils.c ${MEMSTREAM_SOURCES} ) -target_link_libraries(utils_obj PRIVATE libzip::libzip) -if (NOT OPEN_MEMSTREAM_EXISTS) - target_compile_definitions(utils_obj PUBLIC -DCELIX_UTILS_NO_MEMSTREAM_AVAILABLE) -endif () -if (ANDROID) - target_compile_definitions(utils_obj PRIVATE -DUSE_FILE32API) -endif () +set(CELIX_UTILS_CMAKE_CONFIGURE_ALT_OPTION ON) +if (CELIX_UTILS_CMAKE_CONFIGURE_ALT_OPTION) + function (celix_configure_utils_target) + list(GET ARGN 0 UTILS_TARGET_NAME) -if (NOT APPLE) - target_link_libraries(utils_obj PUBLIC -lrt) -endif () + target_link_libraries(${UTILS_TARGET_NAME} PRIVATE libzip::libzip) + #TODO if hidden is set to default, we have no issues + set_target_properties(${UTILS_TARGET_NAME} PROPERTIES C_VISIBILITY_PRESET hidden) + if (NOT OPEN_MEMSTREAM_EXISTS) + target_compile_definitions(${UTILS_TARGET_NAME} PUBLIC -DCELIX_UTILS_NO_MEMSTREAM_AVAILABLE) + endif () -target_include_directories(utils_obj PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> - $<BUILD_INTERFACE:${MEMSTREAM_INCLUDE_DIR}> - ) -target_include_directories(utils_obj PRIVATE src include_deprecated) -IF(UNIX AND NOT ANDROID) - target_link_libraries(utils_obj PRIVATE m pthread) -ELSEIF(ANDROID) - target_link_libraries(utils_obj PRIVATE m) -ENDIF() - -generate_export_header(utils_obj - BASE_NAME "CELIX_UTILS" - EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/celix/gen/includes/utils/celix_utils_export.h") -target_include_directories(utils_obj PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/celix/gen/includes/utils>) - -add_library(utils SHARED) -target_link_libraries(utils PUBLIC utils_obj) - -set_target_properties(utils - PROPERTIES - C_VISIBILITY_PRESET hidden - SOVERSION ${CELIX_MAJOR} - OUTPUT_NAME "celix_utils") + if (ANDROID) + target_compile_definitions(${UTILS_TARGET_NAME} PRIVATE -DUSE_FILE32API) + endif () + + if (NOT APPLE) + target_link_libraries(${UTILS_TARGET_NAME} PUBLIC -lrt) + endif () + + target_include_directories(${UTILS_TARGET_NAME} PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> + $<BUILD_INTERFACE:${MEMSTREAM_INCLUDE_DIR}> + $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/celix/gen/includes/${UTILS_TARGET_NAME}>) + target_include_directories(${UTILS_TARGET_NAME} PRIVATE src include_deprecated) + IF(UNIX AND NOT ANDROID) + target_link_libraries(${UTILS_TARGET_NAME} PRIVATE m pthread) + ELSEIF(ANDROID) + target_link_libraries(${UTILS_TARGET_NAME} PRIVATE m) + ENDIF() + + generate_export_header(${UTILS_TARGET_NAME} + BASE_NAME "CELIX_UTILS" + EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/celix/gen/includes/${UTILS_TARGET_NAME}/celix_utils_export.h") + endfunction () + + celix_configure_utils_target(utils_obj) + + add_library(utils SHARED $<TARGET_OBJECTS:utils_obj>) + celix_configure_utils_target(utils) + set_target_properties(utils + PROPERTIES + VERSION "${CELIX_MAJOR}.${CELIX_MINOR}.${CELIX_MICRO}" + SOVERSION ${CELIX_MAJOR} + OUTPUT_NAME "celix_utils") +else () + target_link_libraries(utils_obj PRIVATE libzip::libzip) + #Note visibility preset is also needed on OBJECT libraries, to work correctly + set_target_properties(utils_obj PROPERTIES C_VISIBILITY_PRESET hidden) + if (NOT OPEN_MEMSTREAM_EXISTS) + target_compile_definitions(utils_obj PUBLIC -DCELIX_UTILS_NO_MEMSTREAM_AVAILABLE) + endif () + + if (ANDROID) + target_compile_definitions(utils_obj PRIVATE -DUSE_FILE32API) + endif () + + if (NOT APPLE) + target_link_libraries(utils_obj PUBLIC -lrt) + endif () + + target_include_directories(utils_obj PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> + $<BUILD_INTERFACE:${MEMSTREAM_INCLUDE_DIR}> + ) + target_include_directories(utils_obj PRIVATE src include_deprecated) + IF(UNIX AND NOT ANDROID) + target_link_libraries(utils_obj PRIVATE m pthread) + ELSEIF(ANDROID) + target_link_libraries(utils_obj PRIVATE m) + ENDIF() + + add_library(utils SHARED) + target_link_libraries(utils PUBLIC utils_obj) + generate_export_header(utils + BASE_NAME "CELIX_UTILS" + EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/celix/gen/includes/utils/celix_utils_export.h") + target_include_directories(utils_obj PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/celix/gen/includes/utils>) + + set_target_properties(utils + PROPERTIES + C_VISIBILITY_PRESET hidden + SOVERSION ${CELIX_MAJOR} + OUTPUT_NAME "celix_utils") +endif () # By omitting OBJECTS DESTINATION, object files will NOT be installed. install(TARGETS utils utils_obj EXPORT celix LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework