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)