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 <[email protected]>
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()