This is an automated email from the ASF dual-hosted git repository. pengzheng pushed a commit to branch hotfix/ensure-origin-rpath-for-bnd-activator-lib in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to refs/heads/hotfix/ensure-origin-rpath-for-bnd-activator-lib by this push: new eec29e2f [#607] make installed bundle use INSTALL_RPATH. eec29e2f is described below commit eec29e2f1bd45d8f708d4ef55a4d69144fe7fbad Author: PengZheng <howto...@gmail.com> AuthorDate: Sat Aug 5 19:48:40 2023 +0800 [#607] make installed bundle use INSTALL_RPATH. Install all libraries in bundle to a temporary directory to make them use INSTALL_RPATH. Then repackaging the bundle to be installed. --- cmake/cmake_celix/BundlePackaging.cmake | 320 +++++++++++++++++++------------- 1 file changed, 186 insertions(+), 134 deletions(-) diff --git a/cmake/cmake_celix/BundlePackaging.cmake b/cmake/cmake_celix/BundlePackaging.cmake index 6d1ee56d..4edeeccf 100644 --- a/cmake/cmake_celix/BundlePackaging.cmake +++ b/cmake/cmake_celix/BundlePackaging.cmake @@ -22,7 +22,7 @@ option(CELIX_USE_COMPRESSION_FOR_BUNDLE_ZIPS "Enables bundle compression" TRUE) if (CELIX_USE_COMPRESSION_FOR_BUNDLE_ZIPS) set(CELIX_JAR_COMMAND_ARGUMENTS -cfm) set(CELIX_ZIP_COMMAND_ARGUMENTS -rq) -else() +else () set(CELIX_JAR_COMMAND_ARGUMENTS -cfm0) set(CELIX_ZIP_COMMAND_ARGUMENTS -rq0) endif () @@ -30,16 +30,16 @@ endif () find_program(JAR_COMMAND jar NO_CMAKE_FIND_ROOT_PATH) -if(JAR_COMMAND AND NOT CELIX_USE_ZIP_INSTEAD_OF_JAR) +if (JAR_COMMAND AND NOT CELIX_USE_ZIP_INSTEAD_OF_JAR) message(STATUS "Using jar to create bundles") -else() +else () find_program(ZIP_COMMAND zip NO_CMAKE_FIND_ROOT_PATH) - if(ZIP_COMMAND) + if (ZIP_COMMAND) message(STATUS "Using zip to create bundles") - else() + else () message(FATAL_ERROR "A jar or zip command is needed to jar/zip bundles") - endif() -endif() + endif () +endif () ##### setup bundles/deploy target @@ -56,18 +56,18 @@ macro(extract_version_parts VERSION MAJOR MINOR PATCH) string(REGEX MATCH "^([0-9]+).*" TMP "${VERSION}") if (CMAKE_MATCH_1) set(MAJOR ${CMAKE_MATCH_1}) - endif() + endif () string(REGEX MATCH "^([0-9]+)\\.([0-9])+.*" TMP "${VERSION}") if (CMAKE_MATCH_2) set(MINOR ${CMAKE_MATCH_2}) - endif() + endif () string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+).*" TMP "${VERSION}") if (CMAKE_MATCH_3) set(PATCH ${CMAKE_MATCH_3}) - endif() + endif () endmacro() -function(set_library_version TARGET VERSION) +function(set_library_version TARGET VERSION) if (VERSION AND TARGET) extract_version_parts("${VERSION}" MAJOR MINOR PATCH) @@ -81,24 +81,24 @@ function(set_library_version TARGET VERSION) endfunction() function(check_lib LIB) - if(TARGET ${LIB}) + if (TARGET ${LIB}) #ok - elseif(IS_ABSOLUTE ${LIB} AND EXISTS ${LIB}) + elseif (IS_ABSOLUTE ${LIB} AND EXISTS ${LIB}) #ok - else() + else () message(FATAL_ERROR "Provided library (${LIB}) is not a target nor a absolute path to an existing library") - endif() + endif () endfunction() function(check_bundle BUNDLE) - if(TARGET ${BUNDLE}) + if (TARGET ${BUNDLE}) get_target_property(BUNDLE_FILE ${BUNDLE} "BUNDLE_FILE") - if(NOT BUNDLE_FILE) + if (NOT BUNDLE_FILE) message(FATAL_ERROR "Provided target must be a bundle target") - endif() - else() + endif () + else () message(FATAL_ERROR "first argument must be a target") - endif() + endif () endfunction() @@ -204,7 +204,7 @@ function(add_celix_bundle) endif () #setting defaults - if(NOT BUNDLE_VERSION) + if (NOT BUNDLE_VERSION) set(BUNDLE_VERSION "0.0.0") endif () if (NOT DEFINED BUNDLE_NAME) @@ -249,7 +249,7 @@ function(add_celix_bundle) ##### ####### Setting target for activator lib if neccesary #################### - if(BUNDLE_SOURCES) + if (BUNDLE_SOURCES) #create lib from sources add_library(${BUNDLE_TARGET_NAME} SHARED ${BUNDLE_SOURCES}) set_library_version(${BUNDLE_TARGET_NAME} ${BUNDLE_VERSION}) @@ -258,60 +258,60 @@ function(add_celix_bundle) "BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" ) target_link_libraries(${BUNDLE_TARGET_NAME} PRIVATE Celix::framework) - else() + else () add_custom_target(${BUNDLE_TARGET_NAME}) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_TARGET_IS_LIB" FALSE "BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" ) - endif() + endif () add_custom_target(${BUNDLE_TARGET_NAME}_bundle - DEPENDS "$<TARGET_PROPERTY:${BUNDLE_TARGET_NAME},BUNDLE_FILE>" + DEPENDS "$<TARGET_PROPERTY:${BUNDLE_TARGET_NAME},BUNDLE_FILE>" ) add_dependencies(${BUNDLE_TARGET_NAME}_bundle ${BUNDLE_TARGET_NAME}) add_dependencies(celix-bundles ${BUNDLE_TARGET_NAME}_bundle) ####################################################################### - + ##### MANIFEST configuration and generation ################## #Step1 configure the file so that the target name is present in in the template configure_file(${CELIX_CMAKE_DIRECTORY}/templates/Manifest.in ${BUNDLE_GEN_DIR}/MANIFEST.step1) #Step2 replace headers with target property values. Note this is done build time - file(GENERATE - OUTPUT "${BUNDLE_GEN_DIR}/MANIFEST.step2" - INPUT "${BUNDLE_GEN_DIR}/MANIFEST.step1" + file(GENERATE + OUTPUT "${BUNDLE_GEN_DIR}/MANIFEST.step2" + INPUT "${BUNDLE_GEN_DIR}/MANIFEST.step1" ) #Step3 The replaced values in step 2 can contain generator expresssion, generated again to resolve those. Note this is done build time - file(GENERATE - OUTPUT "${BUNDLE_GEN_DIR}/MANIFEST.MF" - INPUT "${BUNDLE_GEN_DIR}/MANIFEST.step2" - ) + file(GENERATE + OUTPUT "${BUNDLE_GEN_DIR}/MANIFEST.MF" + INPUT "${BUNDLE_GEN_DIR}/MANIFEST.step2" + ) ######################################################### ###### Packaging the bundle using using jar or zip and a content dir. Configuring dependencies ###### - if(JAR_COMMAND) + if (JAR_COMMAND) add_custom_command(OUTPUT ${BUNDLE_FILE} - COMMAND ${CMAKE_COMMAND} -E make_directory ${BUNDLE_CONTENT_DIR} - COMMAND ${JAR_COMMAND} ${CELIX_JAR_COMMAND_ARGUMENTS} ${BUNDLE_FILE} ${BUNDLE_GEN_DIR}/MANIFEST.MF -C ${BUNDLE_CONTENT_DIR} . - COMMENT "Packaging ${BUNDLE_TARGET_NAME}" - DEPENDS ${BUNDLE_TARGET_NAME} "$<TARGET_PROPERTY:${BUNDLE_TARGET_NAME},BUNDLE_DEPEND_TARGETS>" ${BUNDLE_GEN_DIR}/MANIFEST.MF - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${BUNDLE_CONTENT_DIR} + COMMAND ${JAR_COMMAND} ${CELIX_JAR_COMMAND_ARGUMENTS} ${BUNDLE_FILE} ${BUNDLE_GEN_DIR}/MANIFEST.MF -C ${BUNDLE_CONTENT_DIR} . + COMMENT "Packaging ${BUNDLE_TARGET_NAME}" + DEPENDS ${BUNDLE_TARGET_NAME} "$<TARGET_PROPERTY:${BUNDLE_TARGET_NAME},BUNDLE_DEPEND_TARGETS>" ${BUNDLE_GEN_DIR}/MANIFEST.MF + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - elseif(ZIP_COMMAND) + elseif (ZIP_COMMAND) file(MAKE_DIRECTORY ${BUNDLE_CONTENT_DIR}) add_custom_command(OUTPUT ${BUNDLE_FILE} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BUNDLE_GEN_DIR}/MANIFEST.MF META-INF/MANIFEST.MF - COMMAND ${ZIP_COMMAND} ${CELIX_ZIP_COMMAND_ARGUMENTS} ${BUNDLE_FILE} * - COMMENT "Packaging ${BUNDLE_TARGET_NAME}" - DEPENDS ${BUNDLE_TARGET_NAME} "$<TARGET_PROPERTY:${BUNDLE_TARGET_NAME},BUNDLE_DEPEND_TARGETS>" ${BUNDLE_GEN_DIR}/MANIFEST.MF - WORKING_DIRECTORY ${BUNDLE_CONTENT_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BUNDLE_GEN_DIR}/MANIFEST.MF META-INF/MANIFEST.MF + COMMAND ${ZIP_COMMAND} ${CELIX_ZIP_COMMAND_ARGUMENTS} ${BUNDLE_FILE} * + COMMENT "Packaging ${BUNDLE_TARGET_NAME}" + DEPENDS ${BUNDLE_TARGET_NAME} "$<TARGET_PROPERTY:${BUNDLE_TARGET_NAME},BUNDLE_DEPEND_TARGETS>" ${BUNDLE_GEN_DIR}/MANIFEST.MF + WORKING_DIRECTORY ${BUNDLE_CONTENT_DIR} ) - else() + else () message(FATAL_ERROR "A jar or zip command is needed to jar/zip bundles") - endif() + endif () ################################################################################### @@ -350,40 +350,41 @@ function(add_celix_bundle) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_PRIVATE_LIBS" "") #List of private libs. set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_IMPORT_LIBS" "") #List of libs to import set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_EXPORT_LIBS" "") #list of libs to export + set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_LIB_TARGETS" "") #list of all lib targets built within the project. set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_HEADERS" "") #Additional headers will be added (new line seperated) to the manifest ################################ ################################ - if(BUNDLE_SOURCES) + if (BUNDLE_SOURCES) celix_bundle_libs(${BUNDLE_TARGET_NAME} "PRIVATE" TRUE ${BUNDLE_TARGET_NAME}) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_ACTIVATOR" "$<TARGET_SONAME_FILE_NAME:${BUNDLE_TARGET_NAME}>") - if(APPLE) + if (APPLE) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES INSTALL_RPATH "@loader_path") set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES BUILD_RPATH "@loader_path") - else() + else () set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES INSTALL_RPATH "$ORIGIN") set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES BUILD_RPATH "$ORIGIN") - endif() + endif () if (NOT BUNDLE_DO_NOT_CONFIGURE_SYMBOL_VISIBILITY) celix_target_hide_symbols(${BUNDLE_TARGET_NAME}) endif () - elseif(BUNDLE_NO_ACTIVATOR) + elseif (BUNDLE_NO_ACTIVATOR) #do nothing - else() #ACTIVATOR + else () #ACTIVATOR celix_bundle_libs(${BUNDLE_TARGET_NAME} "PRIVATE" TRUE ${BUNDLE_ACTIVATOR}) - - if(TARGET ${BUNDLE_ACTIVATOR}) + + if (TARGET ${BUNDLE_ACTIVATOR}) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_ACTIVATOR" "$<TARGET_SONAME_FILE_NAME:${BUNDLE_ACTIVATOR}>") - elseif(IS_ABSOLUTE ${BUNDLE_ACTIVATOR} AND EXISTS ${BUNDLE_ACTIVATOR}) + elseif (IS_ABSOLUTE ${BUNDLE_ACTIVATOR} AND EXISTS ${BUNDLE_ACTIVATOR}) get_filename_component(ACT_NAME ${BUNDLE_ACTIVATOR} NAME) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_ACTIVATOR" "${ACT_NAME}") - else() + else () message(FATAL_ERROR "Provided library (${BUNDLE_ACTIVATOR}) is not a target nor a absolute path to an existing library") - endif() + endif () - endif() + endif () celix_bundle_private_libs(${BUNDLE_TARGET_NAME} ${BUNDLE_PRIVATE_LIBRARIES}) @@ -479,20 +480,21 @@ function(celix_bundle_libs) get_target_property(LIBS ${BUNDLE} "BUNDLE_${TYPE}_LIBS") get_target_property(DEPS ${BUNDLE} "BUNDLE_DEPEND_TARGETS") + get_target_property(LIB_TARGETS ${BUNDLE} "BUNDLE_LIB_TARGETS") - foreach(LIB IN ITEMS ${ARGN}) + foreach (LIB IN ITEMS ${ARGN}) string(MAKE_C_IDENTIFIER ${LIB} LIBID) - if(IS_ABSOLUTE ${LIB} AND EXISTS ${LIB}) - get_filename_component(LIB_NAME ${LIB} NAME) - set(OUT "${BUNDLE_DIR}/${LIB_NAME}") - add_custom_command(OUTPUT ${OUT} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LIB} ${OUT} - DEPENDS ${LIB} + if (IS_ABSOLUTE ${LIB} AND EXISTS ${LIB}) + get_filename_component(LIB_NAME ${LIB} NAME) + set(OUT "${BUNDLE_DIR}/${LIB_NAME}") + add_custom_command(OUTPUT ${OUT} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LIB} ${OUT} + DEPENDS ${LIB} ) if (ADD_TO_MANIFEST) list(APPEND LIBS ${LIB_NAME}) - endif() - list(APPEND DEPS ${OUT}) + endif () + list(APPEND DEPS ${OUT}) elseif (TARGET ${LIB}) get_target_property(TARGET_TYPE ${LIB} TYPE) #NOTE add_custom_command does not support generator expression in OUTPUT value (e.g. $<TARGET_FILE:${LIB}>) @@ -500,38 +502,48 @@ function(celix_bundle_libs) set(OUT "${BUNDLE_GEN_DIR}/lib-${LIBID}-copy-timestamp") if ("${TARGET_TYPE}" STREQUAL "STATIC_LIBRARY") add_custom_command(OUTPUT ${OUT} - COMMAND ${CMAKE_COMMAND} -E touch ${OUT} - COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:${LIB}>" "${BUNDLE_DIR}/$<TARGET_FILE_NAME:${LIB}>" - DEPENDS ${LIB} + COMMAND ${CMAKE_COMMAND} -E touch ${OUT} + COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:${LIB}>" "${BUNDLE_DIR}/$<TARGET_FILE_NAME:${LIB}>" + DEPENDS ${LIB} ) elseif ("${TARGET_TYPE}" STREQUAL "SHARED_LIBRARY") add_custom_command(OUTPUT ${OUT} - COMMAND ${CMAKE_COMMAND} -E touch ${OUT} - COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:${LIB}>" "${BUNDLE_DIR}/$<TARGET_SONAME_FILE_NAME:${LIB}>" - DEPENDS ${LIB} - ) - else() + COMMAND ${CMAKE_COMMAND} -E touch ${OUT} + COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:${LIB}>" "${BUNDLE_DIR}/$<TARGET_SONAME_FILE_NAME:${LIB}>" + DEPENDS ${LIB} + ) + get_target_property(IS_IMPORTED ${LIB} IMPORTED) + if (NOT IS_IMPORTED) + get_target_property(REAL_LIB_TARGET ${LIB} ALIASED_TARGET) + if (REAL_LIB_TARGET) + list(APPEND LIB_TARGETS ${REAL_LIB_TARGET}) + else () + list(APPEND LIB_TARGETS ${LIB}) + endif () + endif () + else () message(FATAL_ERROR "Unexpected target type (${TARGET_TYPE}) for target ${LIB}. Not a library") - endif() + endif () if (ADD_TO_MANIFEST) list(APPEND LIBS "$<TARGET_SONAME_FILE_NAME:${LIB}>") - endif() + endif () list(APPEND DEPS "${OUT}") #NOTE depending on ${OUT} not on $<TARGET_FILE:${LIB}>. - else() + else () message(FATAL_ERROR "Unexpected library argument '${LIB}'. Expected a absolute path to a library or a cmake library target") - endif() + endif () get_target_property(IS_LIB ${BUNDLE} "BUNDLE_TARGET_IS_LIB") if ("${LIB}" STREQUAL "${BUNDLE}") #ignore. Do not have to link against itself - elseif(IS_LIB) + elseif (IS_LIB) target_link_libraries(${BUNDLE} PRIVATE ${LIB}) - endif() - endforeach() + endif () + endforeach () set_target_properties(${BUNDLE} PROPERTIES "BUNDLE_${TYPE}_LIBS" "${LIBS}") set_target_properties(${BUNDLE} PROPERTIES "BUNDLE_DEPEND_TARGETS" "${DEPS}") + set_target_properties(${BUNDLE} PROPERTIES "BUNDLE_LIB_TARGETS" "${LIB_TARGETS}") endfunction() function(bundle_import_libs) @@ -555,16 +567,16 @@ function(celix_bundle_import_libs) get_target_property(LIBS ${BUNDLE} "BUNDLE_IMPORT_LIBS") - foreach(LIB IN ITEMS ${ARGN}) + foreach (LIB IN ITEMS ${ARGN}) message(WARNING "Bundle with import libs in Celix is not complete and still experimental.") - if(IS_ABSOLUTE ${LIB} AND EXISTS ${LIB}) + if (IS_ABSOLUTE ${LIB} AND EXISTS ${LIB}) list(APPEND LIBS ${LIB_NAME}) - else() + else () list(APPEND LIBS "$<TARGET_SONAME_FILE_NAME:${LIB}>") - endif() + endif () target_link_libraries(${BUNDLE} PRIVATE ${LIB}) - endforeach() + endforeach () set_target_properties(${BUNDLE} PROPERTIES "BUNDLE_IMPORT_LIBS" "${LIBS}") @@ -606,18 +618,18 @@ function(celix_bundle_files) list(GET ARGN 0 BUNDLE) list(REMOVE_AT ARGN 0) - set(OPTIONS ) + set(OPTIONS) set(ONE_VAL_ARGS DESTINATION) - set(MULTI_VAL_ARGS ) + set(MULTI_VAL_ARGS) cmake_parse_arguments(FILES "${OPTIONS}" "${ONE_VAL_ARGS}" "${MULTI_VAL_ARGS}" ${ARGN}) - get_target_property(BUNDLE_DIR ${BUNDLE} "BUNDLE_CONTENT_DIR") + get_target_property(BUNDLE_DIR ${BUNDLE} "BUNDLE_CONTENT_DIR") if (FILES_DESTINATION) set(DESTINATION "${BUNDLE_DIR}/${FILES_DESTINATION}") - else() + else () set(DESTINATION "${BUNDLE_DIR}") - endif() + endif () #message("call: files(COPY ${FILES_UNPARSED_ARGUMENTS} DESTINATION \"${DESTINATION}\"") file(COPY ${FILES_UNPARSED_ARGUMENTS} DESTINATION ${DESTINATION}) @@ -653,19 +665,19 @@ function(celix_bundle_add_dir) if (NOT DEFINED BUNDLE OR NOT DEFINED INPUT_DIR) message(FATAL_ERROR "celix_bundle_dir must have at least two arguments: BUNDLE_TARGET and INPUT_DIR!") - endif() + endif () - set(OPTIONS ) + set(OPTIONS) set(ONE_VAL_ARGS DESTINATION) - set(MULTI_VAL_ARGS ) + set(MULTI_VAL_ARGS) cmake_parse_arguments(COPY "${OPTIONS}" "${ONE_VAL_ARGS}" "${MULTI_VAL_ARGS}" ${ARGN}) get_target_property(BUNDLE_DIR ${BUNDLE} "BUNDLE_CONTENT_DIR") if (NOT DEFINED COPY_DESTINATION) set(DESTINATION "${BUNDLE_DIR}") - else() + else () set(DESTINATION "${BUNDLE_DIR}/${COPY_DESTINATION}") - endif() + endif () string(UUID COPY_ID NAMESPACE "661ee07c-842d-11e8-adfc-80fa5b02e11b" NAME "${INPUT_DIR}" TYPE MD5) @@ -673,10 +685,10 @@ function(celix_bundle_add_dir) if (IS_ABSOLUTE ${INPUT_DIR}) file(WRITE ${COPY_CMAKE_SCRIPT} "file(COPY ${INPUT_DIR} DESTINATION ${DESTINATION})") - else() + else () file(WRITE ${COPY_CMAKE_SCRIPT} "file(COPY ${CMAKE_CURRENT_LIST_DIR}/${INPUT_DIR} DESTINATION ${DESTINATION})") - endif() + endif () set(TIMESTAMP "${CMAKE_BINARY_DIR}/celix/gen/bundles/${BUNDLE}/copy-dir-${COPY_ID}.timestamp") file(GLOB DIR_FILES ${INPUT_DIR}) @@ -685,7 +697,7 @@ function(celix_bundle_add_dir) COMMAND ${CMAKE_COMMAND} -P ${COPY_CMAKE_SCRIPT} DEPENDS ${DIR_FILES} COMMENT "Copying dir ${INPUT_DIR} to ${DESTINATION}" - ) + ) get_target_property(DEPS ${BUNDLE} "BUNDLE_DEPEND_TARGETS") list(APPEND DEPS "${TIMESTAMP}") @@ -718,7 +730,7 @@ function(celix_bundle_add_files) list(GET ARGN 0 BUNDLE) list(REMOVE_AT ARGN 0) - set(OPTIONS ) + set(OPTIONS) set(ONE_VAL_ARGS DESTINATION) set(MULTI_VAL_ARGS FILES) cmake_parse_arguments(COPY "${OPTIONS}" "${ONE_VAL_ARGS}" "${MULTI_VAL_ARGS}" ${ARGN}) @@ -726,9 +738,9 @@ function(celix_bundle_add_files) get_target_property(BUNDLE_DIR ${BUNDLE} "BUNDLE_CONTENT_DIR") if (NOT DEFINED COPY_DESTINATION) set(DESTINATION "${BUNDLE_DIR}") - else() + else () set(DESTINATION "${BUNDLE_DIR}/${COPY_DESTINATION}") - endif() + endif () string(UUID COPY_ID NAMESPACE "661ee07c-842d-11e8-adfc-80fa5b02e11b" NAME "${COPY_FILES}" TYPE MD5) @@ -736,15 +748,15 @@ function(celix_bundle_add_files) set(COPY_CMAKE_SCRIPT "${CMAKE_BINARY_DIR}/celix/gen/bundles/${BUNDLE}/copy-files-${COPY_ID}.cmake") file(WRITE ${COPY_CMAKE_SCRIPT} "#Copy script, copies the file on a file per file base\n") - foreach(FILE IN ITEMS ${COPY_FILES}) + foreach (FILE IN ITEMS ${COPY_FILES}) if (IS_ABSOLUTE ${FILE}) file(APPEND ${COPY_CMAKE_SCRIPT} "file(COPY ${FILE} DESTINATION ${DESTINATION})\n") - else() + else () file(APPEND ${COPY_CMAKE_SCRIPT} "file(COPY ${CMAKE_CURRENT_LIST_DIR}/${FILE} DESTINATION ${DESTINATION})\n") - endif() - endforeach() + endif () + endforeach () add_custom_command(OUTPUT ${TIMESTAMP} COMMAND ${CMAKE_COMMAND} -E touch ${TIMESTAMP} COMMAND ${CMAKE_COMMAND} -P ${COPY_CMAKE_SCRIPT} @@ -781,9 +793,9 @@ function(celix_bundle_headers) get_target_property(HEADERS ${BUNDLE} "BUNDLE_HEADERS") - foreach(HEADER IN ITEMS ${ARGN}) + foreach (HEADER IN ITEMS ${ARGN}) list(APPEND HEADERS "${HEADER}") - endforeach() + endforeach () set_target_properties(${BUNDLE} PROPERTIES "BUNDLE_HEADERS" "${HEADERS}") endfunction() @@ -923,7 +935,7 @@ function(celix_get_bundle_filename) else () message(FATAL_ERROR "Provided argument is not a CMake target: ${ARGV0}") endif () -endfunction () +endfunction() #[[ Get bundle file (absolute path to a bundle) from a (imported) bundle @@ -955,7 +967,7 @@ function(celix_get_bundle_file) else () message(FATAL_ERROR "Provided argument is not a CMake target: ${ARGV0}") endif () -endfunction () +endfunction() function(install_bundle) message(DEPRECATION "install_bundle is deprecated, use install_celix_bundle instead.") @@ -992,24 +1004,64 @@ function(install_celix_bundle) list(GET ARGN 0 BUNDLE) list(REMOVE_AT ARGN 0) - set(OPTIONS ) + set(OPTIONS) set(ONE_VAL_ARGS PROJECT_NAME BUNDLE_NAME EXPORT) set(MULTI_VAL_ARGS HEADERS RESOURCES) cmake_parse_arguments(INSTALL "${OPTIONS}" "${ONE_VAL_ARGS}" "${MULTI_VAL_ARGS}" ${ARGN}) - + if (NOT DEFINED INSTALL_PROJECT_NAME) string(TOLOWER ${PROJECT_NAME} INSTALL_PROJECT_NAME) - endif() + endif () if (NOT DEFINED INSTALL_BUNDLE_NAME) set(INSTALL_BUNDLE_NAME ${BUNDLE}) - endif() + endif () - install(FILES "$<TARGET_PROPERTY:${BUNDLE},BUNDLE_FILE>" DESTINATION share/${INSTALL_PROJECT_NAME}/bundles COMPONENT ${BUNDLE}) + get_target_property(BUNDLE_CONTENT_DIR ${BUNDLE} "BUNDLE_CONTENT_DIR") + set(BUNDLE_INSTALL_DIR "${BUNDLE_CONTENT_DIR}_install") + # copy bundle content to prepare the bundle to be installed + install(CODE "file(COPY ${BUNDLE_CONTENT_DIR}/ DESTINATION ${BUNDLE_INSTALL_DIR})") + + # fix RPATH of shared objects in the bundle to be installed using CMake's internal RPATH rewrite + get_target_property(LIB_TARGETS ${BUNDLE} "BUNDLE_LIB_TARGETS") + get_target_property(BUNDLE_GEN_DIR ${BUNDLE} "BUNDLE_GEN_DIR") + foreach (LIB_TARGET ${LIB_TARGETS}) + install(TARGETS ${LIB_TARGET} LIBRARY DESTINATION ${BUNDLE_GEN_DIR} NAMELINK_SKIP COMPONENT ${BUNDLE}) + # JAR does not support symbolic links, so we only install soname file + install(FILES ${BUNDLE_GEN_DIR}/$<TARGET_FILE_NAME:${LIB_TARGET}> DESTINATION ${BUNDLE_INSTALL_DIR} + RENAME $<TARGET_SONAME_FILE_NAME:${LIB_TARGET}> COMPONENT ${BUNDLE}) + endforeach () + + # repackaging the bundle to be installed + get_target_property(BUNDLE_FILE ${BUNDLE} "BUNDLE_FILE") + set(BUNDLE_FILE_INSTALL "${BUNDLE_FILE}.install") + get_target_property(BUNDLE_FILE_NAME ${BUNDLE} "BUNDLE_FILE_NAME") + get_target_property(BUNDLE_GEN_DIR ${BUNDLE} "BUNDLE_GEN_DIR") + if (JAR_COMMAND) + install(CODE + "execute_process( + COMMAND ${JAR_COMMAND} ${CELIX_JAR_COMMAND_ARGUMENTS} ${BUNDLE_FILE_INSTALL} ${BUNDLE_GEN_DIR}/MANIFEST.MF -C ${BUNDLE_INSTALL_DIR} . + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + )" + ) + elseif (ZIP_COMMAND) + install(CODE + "execute_process( + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BUNDLE_GEN_DIR}/MANIFEST.MF META-INF/MANIFEST.MF + COMMAND ${ZIP_COMMAND} ${CELIX_ZIP_COMMAND_ARGUMENTS} ${BUNDLE_FILE_INSTALL} * + WORKING_DIRECTORY ${BUNDLE_INSTALL_DIR} + )" + ) + else () + message(FATAL_ERROR "A jar or zip command is needed to jar/zip bundles") + endif () + + install(FILES ${BUNDLE_FILE_INSTALL} DESTINATION share/${INSTALL_PROJECT_NAME}/bundles + RENAME "$<TARGET_PROPERTY:${BUNDLE},BUNDLE_FILENAME>" COMPONENT ${BUNDLE}) if (INSTALL_EXPORT) get_target_property(CURRENT_EXPORT_BUNDLES celix-bundles EXPORT_${INSTALL_EXPORT}_BUNDLES) - if (NOT CURRENT_EXPORT_BUNDLES) + if (NOT CURRENT_EXPORT_BUNDLES) set(CURRENT_EXPORT_BUNDLES ${BUNDLE}) else () list(APPEND CURRENT_EXPORT_BUNDLES ${BUNDLE}) @@ -1022,12 +1074,12 @@ function(install_celix_bundle) ) endif () - if(INSTALL_HEADERS) - install (FILES ${INSTALL_HEADERS} DESTINATION include/${INSTALL_PROJECT_NAME}/${INSTALL_BUNDLE_NAME} COMPONENT ${BUNDLE}) - endif() + if (INSTALL_HEADERS) + install(FILES ${INSTALL_HEADERS} DESTINATION include/${INSTALL_PROJECT_NAME}/${INSTALL_BUNDLE_NAME} COMPONENT ${BUNDLE}) + endif () if (INSTALL_RESOURCES) - install (FILES ${INSTALL_RESOURCES} DESTINATION share/${INSTALL_PROJECT_NAME}/${INSTALL_BUNDLE_NAME} COMPONENT ${BUNDLE}) - endif() + install(FILES ${INSTALL_RESOURCES} DESTINATION share/${INSTALL_PROJECT_NAME}/${INSTALL_BUNDLE_NAME} COMPONENT ${BUNDLE}) + endif () endfunction() @@ -1064,9 +1116,9 @@ function(install_celix_bundle_targets) list(GET ARGN 0 EXPORT_NAME) list(REMOVE_AT ARGN 0) - set(OPTIONS ) + set(OPTIONS) set(ONE_VAL_ARGS NAMESPACE DESTINATION FILE COMPONENT PROJECT_NAME) - set(MULTI_VAL_ARGS ) + set(MULTI_VAL_ARGS) cmake_parse_arguments(EXPORT "${OPTIONS}" "${ONE_VAL_ARGS}" "${MULTI_VAL_ARGS}" ${ARGN}) get_target_property(EXPORT_BUNDLES celix-bundles EXPORT_${EXPORT_NAME}_BUNDLES) @@ -1097,7 +1149,7 @@ function(install_celix_bundle_targets) if (NOT DEFINED EXPORT_PROJECT_NAME) string(TOLOWER ${PROJECT_NAME} EXPORT_PROJECT_NAME) - endif() + endif () if (NOT DEFINED EXPORT_DESTINATION) set(EXPORT_DESTINATION share/${EXPORT_PROJECT_NAME}/cmake) endif () @@ -1118,14 +1170,14 @@ function(install_celix_bundle_targets) file(APPEND "${CONF_IN_FILE}" "# Compute the installation prefix relative to this file. get_filename_component(_IMPORT_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH) ") - foreach(_VAR RANGE ${NR_OF_SUB_DIRS}) + foreach (_VAR RANGE ${NR_OF_SUB_DIRS}) file(APPEND "${CONF_IN_FILE}" "get_filename_component(_IMPORT_PREFIX \"\${_IMPORT_PREFIX}\" PATH) ") - endforeach() - file(APPEND "${CONF_IN_FILE}" " -") + endforeach () + file(APPEND "${CONF_IN_FILE}" " + ") - foreach(BUNDLE_TARGET IN LISTS EXPORT_BUNDLES) + foreach (BUNDLE_TARGET IN LISTS EXPORT_BUNDLES) set(TN "${EXPORT_NAMESPACE}${BUNDLE_TARGET}") file(APPEND "${CONF_IN_FILE}" " if (NOT TARGET ${TN}) @@ -1139,7 +1191,7 @@ set_target_properties(${TN} PROPERTIES BUNDLE_SYMBOLIC_NAME_${BUILD_TYPE} \"$<TARGET_PROPERTY:${BUNDLE_TARGET},BUNDLE_SYMBOLIC_NAME>\" ) ") - endforeach() + endforeach () file(GENERATE OUTPUT "${CONF_FILE}" INPUT "${CONF_IN_FILE}") @@ -1178,7 +1230,7 @@ _celix_extract_imported_bundle_info(<bundle_target>) Note this is considered a private function ]] -function (_celix_extract_imported_bundle_info) +function(_celix_extract_imported_bundle_info) set(BUNDLE ${ARGV0}) if (CMAKE_BUILD_TYPE) @@ -1241,4 +1293,4 @@ function (_celix_extract_imported_bundle_info) set(BUNDLE_FILE ${BF} PARENT_SCOPE) set(BUNDLE_FILENAME ${BFN} PARENT_SCOPE) set(BUNDLE_SYMBOLIC_NAME ${BSN} PARENT_SCOPE) -endfunction () +endfunction()