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

Reply via email to