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

Reply via email to