You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2023/07/25 18:00:59 UTC
[celix] 01/01: Refactor celix_container_bundles_dir to use add_custom_target
This is an automated email from the ASF dual-hosted git repository.
pnoltes pushed a commit to branch hotfix/container_bundle_copies_do_not_trigger
in repository https://gitbox.apache.org/repos/asf/celix.git
commit 4430292423efdaba7a18060558fc904b5c54328f
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Tue Jul 25 20:00:51 2023 +0200
Refactor celix_container_bundles_dir to use add_custom_target
---
cmake/cmake_celix/ContainerPackaging.cmake | 88 ++++++++++++++----------------
1 file changed, 42 insertions(+), 46 deletions(-)
diff --git a/cmake/cmake_celix/ContainerPackaging.cmake b/cmake/cmake_celix/ContainerPackaging.cmake
index 35a80ec1..b86ef710 100644
--- a/cmake/cmake_celix/ContainerPackaging.cmake
+++ b/cmake/cmake_celix/ContainerPackaging.cmake
@@ -25,10 +25,10 @@ if (NOT TARGET celix-containers)
)
set_target_properties(celix-containers PROPERTIES "CONTAINER_DEPLOYMENTS" "") #initial empty deps list
- get_directory_property(CLEANFILES ADDITIONAL_MAKE_CLEAN_FILES)
+ get_directory_property(CLEANFILES ADDITIONAL_CLEAN_FILES)
list(APPEND CLEANFILES "${CMAKE_BINARY_DIR}/deploy")
list(APPEND CLEANFILES "${CMAKE_BINARY_DIR}/celix")
- set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CLEANFILES}")
+ set_directory_properties(PROPERTIES ADDITIONAL_CLEAN_FILES "${CLEANFILES}")
endif ()
#####
@@ -293,7 +293,7 @@ $<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_EMBEDDED_PROPERTIES>,\\n\
else ()
#LAUNCHER already set
add_custom_target(${CONTAINER_TARGET}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAUNCHER} ${CONTAINER_LOC}/${CONTAINER_NAME}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAUNCHER} ${CONTAINER_LOC}/${CONTAINER_NAME}
)
endif ()
@@ -351,14 +351,6 @@ $<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_RUNTIME_PROPERTIES>,
set(LIB_PATH_NAME "LD_LIBRARY_PATH")
endif()
-
- #add a custom target which can depend on generation expressions
- add_custom_target(${CONTAINER_TARGET}-deps
- DEPENDS
- $<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_TARGET_DEPS>
- )
- add_dependencies(${CONTAINER_TARGET} ${CONTAINER_TARGET}-deps)
-
if (CONTAINER_NO_COPY)
set(CONTAINER_COPY FALSE)
elseif (CONTAINER_COPY)
@@ -369,7 +361,6 @@ $<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_RUNTIME_PROPERTIES>,
##### Container Target Properties #####
#internal use
- set_target_properties(${CONTAINER_TARGET} PROPERTIES "CONTAINER_TARGET_DEPS" "") #target deps for the container.
set_target_properties(${CONTAINER_TARGET} PROPERTIES "CONTAINER_BUNDLES_LEVEL_0" "") #bundles to deploy for the container for startup level 0
set_target_properties(${CONTAINER_TARGET} PROPERTIES "CONTAINER_BUNDLES_LEVEL_1" "") #bundles to deploy for the container for startup level 1
set_target_properties(${CONTAINER_TARGET} PROPERTIES "CONTAINER_BUNDLES_LEVEL_2" "") #bundles to deploy for the container for startup level 2
@@ -404,9 +395,9 @@ $<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_RUNTIME_PROPERTIES>,
#ensure the container dir will be deleted during clean
- get_directory_property(CLEANFILES ADDITIONAL_MAKE_CLEAN_FILES)
+ get_directory_property(CLEANFILES ADDITIONAL_CLEAN_FILES)
list(APPEND CLEANFILES "$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_LOC>")
- set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CLEANFILES}")
+ set_directory_properties(PROPERTIES ADDITIONAL_CLEAN_FILES "${CLEANFILES}")
endfunction()
@@ -443,56 +434,61 @@ function(celix_container_bundles_dir)
endif()
get_target_property(CONTAINER_LOC ${CONTAINER_TARGET} "CONTAINER_LOC")
- get_target_property(DEPS ${CONTAINER_TARGET} "CONTAINER_TARGET_DEPS")
+
+ set(DEST_DIR "${CONTAINER_LOC}/${BD_DIR_NAME}")
+ get_target_property(CLEAN_FILES ${CONTAINER_TARGET} "ADDITIONAL_CLEAN_FILES")
+ if (NOT ${DEST_DIR} IN_LIST CLEAN_FILES)
+ list(APPEND CLEAN_FILES ${DEST_DIR})
+ set_target_properties(${CONTAINER_TARGET} PROPERTIES "ADDITIONAL_CLEAN_FILES" "${CLEAN_FILES}")
+ endif()
foreach(BUNDLE IN ITEMS ${BD_BUNDLES})
if (IS_ABSOLUTE ${BUNDLE} AND EXISTS ${BUNDLE})
- get_filename_component(BUNDLE_FILENAME ${BUNDLE} NAME)
- set(OUT "${CONTAINER_LOC}/${BD_DIR_NAME}/${BUNDLE_FILENAME}")
- add_custom_command(OUTPUT ${OUT}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BUNDLE} ${OUT}
- COMMENT "Copying (file) bundle '${BUNDLE}' to '${CONTAINER_LOC}/${BD_DIR_NAME}'"
- )
+ get_filename_component(BUNDLE_FILENAME ${BUNDLE} NAME)
+ string(MAKE_C_IDENTIFIER ${BUNDLE_FILENAME} BUNDLE_ID) #Create id with no special chars
+ set(DEST "${DEST_DIR}/${BUNDLE_FILENAME}")
elseif (TARGET ${BUNDLE})
get_target_property(TARGET_TYPE ${BUNDLE} TYPE)
if (TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
#ignore
else ()
- get_target_property(IMP ${BUNDLE} BUNDLE_IMPORTED)
- if (IMP) #An imported bundle target -> handle target without DEPENDS
+ get_target_property(IMPORTED_TARGET ${BUNDLE} BUNDLE_IMPORTED)
+ get_target_property(ALIASED_TARGET ${BUNDLE} ALIASED_TARGET)
+ if (IMPORTED_TARGET) #An imported bundle target -> handle target without DEPENDS
_celix_extract_imported_bundle_info(${BUNDLE}) #extracts BUNDLE_FILE and BUNDLE_FILENAME
- string(MAKE_C_IDENTIFIER ${BUNDLE} BUNDLE_ID) #Create id with no special chars (e.g. for target like Celix::shell)
- set(OUT "${CMAKE_BINARY_DIR}/celix/gen/containers/${CONTAINER_TARGET}/copy-bundle-for-target-${BUNDLE_ID}.timestamp")
- set(DEST "${CONTAINER_LOC}/${BD_DIR_NAME}/${BUNDLE_FILENAME}")
- add_custom_command(OUTPUT ${OUT}
- COMMAND ${CMAKE_COMMAND} -E touch ${OUT}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${CONTAINER_LOC}/${BD_DIR_NAME}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different "${BUNDLE_FILE}" ${DEST}
- COMMENT "Copying (imported) bundle '${BUNDLE}' to '${CONTAINER_LOC}/${BD_DIR_NAME}'"
- )
+ string(MAKE_C_IDENTIFIER ${BUNDLE} BUNDLE_ID) #Create id with no special chars
+ set(DEST "${DEST_DIR}/${BUNDLE_FILENAME}")
+ elseif (ALIASED_TARGET) #An alias target use the aliased target
+ string(MAKE_C_IDENTIFIER ${ALIASED_TARGET} BUNDLE_ID) #Create id with no special chars
+ set(BUNDLE_FILE "$<TARGET_PROPERTY:${ALIASED_TARGET},BUNDLE_FILE>")
+ celix_get_bundle_filename(${ALIASED_TARGET} BUNDLE_FILENAME)
+ set(DEST "${DEST_DIR}/${BUNDLE_FILENAME}")
+ set(DEPS ${ALIASED_TARGET}_bundle) #Note white-box knowledge of celix_bundle custom target
else() #Assuming a bundle target (library or add_custom_target)
- string(MAKE_C_IDENTIFIER ${BUNDLE} BUNDLE_ID) #Create id with no special chars (e.g. for target like Celix::shell)
- set(OUT "${CMAKE_BINARY_DIR}/celix/gen/containers/${CONTAINER_TARGET}/copy-bundle-for-target-${BUNDLE_ID}.timestamp")
- set(DEST "${CONTAINER_LOC}/${BD_DIR_NAME}/$<TARGET_PROPERTY:${BUNDLE},BUNDLE_FILENAME>")
- add_custom_command(OUTPUT ${OUT}
- COMMAND ${CMAKE_COMMAND} -E touch ${OUT}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${CONTAINER_LOC}/${BD_DIR_NAME}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_PROPERTY:${BUNDLE},BUNDLE_FILE>" ${DEST}
- COMMENT "Copying (target) bundle '${BUNDLE}' to '${CONTAINER_LOC}/${BD_DIR_NAME}'"
- DEPENDS $<TARGET_PROPERTY:${BUNDLE},BUNDLE_CREATE_BUNDLE_TARGET>
- )
+ string(MAKE_C_IDENTIFIER ${BUNDLE} BUNDLE_ID) #Create id with no special chars
+ set(BUNDLE_FILE "$<TARGET_PROPERTY:${BUNDLE},BUNDLE_FILE>")
+ celix_get_bundle_filename(${BUNDLE} BUNDLE_FILENAME)
+ set(DEST "${DEST_DIR}/${BUNDLE_FILENAME}")
+ set(DEPS ${BUNDLE}_bundle) #Note white-box knowledge of celix_bundle custom target
endif ()
endif ()
else ()
message(FATAL_ERROR "Cannot add bundle in container ${CONTAINER_TARGET}. Provided bundle is not a abs path to an existing file nor a cmake target (${BUNDLE}).")
endif ()
- if (OUT)
- list(APPEND DEPS "${OUT}")
+ if (BUNDLE_ID AND DEST AND BUNDLE_FILE)
+ add_custom_target(${CONTAINER_TARGET}_copy_bundle_${BUNDLE_ID}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BUNDLE_FILE} ${DEST}
+ BYPRODUCTS ${DEST}
+ DEPENDS ${DEPS}
+ )
+ add_dependencies(${CONTAINER_TARGET} ${CONTAINER_TARGET}_copy_bundle_${BUNDLE_ID})
+
+ get_target_property(CLEAN_FILES ${CONTAINER_TARGET} "ADDITIONAL_CLEAN_FILES")
+ list(APPEND CLEAN_FILES ${DEST})
+ set_target_properties(${CONTAINER_TARGET} PROPERTIES "ADDITIONAL_CLEAN_FILES" "${CLEAN_FILES}")
endif ()
endforeach()
-
- set_target_properties(${CONTAINER_TARGET} PROPERTIES "CONTAINER_TARGET_DEPS" "${DEPS}")
endfunction()
function(deploy_bundles)