Build: fix build dependencies when sharing symbols

When a target is linked against code provided by a symbol provider we
need to ensure

- the symbol provider is built before generating the symbol share
- the symbol share is generated before the target
- the target is linked again when the symbol provider is updated

Change-Id: I4808ca0024c875270ad0683e9709d3db97de714b
Signed-off-by: Anubhav Raina <anubhav.raina@arm.com>
diff --git a/toolchain_IARARM.cmake b/toolchain_IARARM.cmake
index 5dfadda..527c971 100644
--- a/toolchain_IARARM.cmake
+++ b/toolchain_IARARM.cmake
@@ -266,11 +266,18 @@
     string(REPLACE ";" "" IAR_STEERING_FILE ${IAR_STEERING_FILE})
     file( GENERATE OUTPUT "$<TARGET_FILE_DIR:${target}>/iar_steering_file" CONTENT "${IAR_STEERING_FILE}")
 
-    add_custom_command(
-        TARGET ${target}
-        POST_BUILD
+    add_custom_target(${target}_shared_symbols
         COMMAND ${CMAKE_IAR_SYMEXPORT}
-        ARGS --edit $<TARGET_FILE_DIR:${target}>/iar_steering_file $<TARGET_FILE:${target}> $<TARGET_FILE_DIR:${target}>/${target}${CODE_SHARING_OUTPUT_FILE_SUFFIX}
+            --edit
+            $<TARGET_FILE_DIR:${target}>/iar_steering_file
+            $<TARGET_FILE:${target}>
+            $<TARGET_FILE_DIR:${target}>/${target}${CODE_SHARING_OUTPUT_FILE_SUFFIX}
+    )
+    # Ensure ${target} is built before $<TARGET_FILE:${target}> is used to generate ${target}_shared_symbols
+    add_dependencies(${target}_shared_symbols ${target})
+    # Allow the global clean target to rm the ${target}_shared_symbols created
+    set_target_properties(${target}_shared_symbols PROPERTIES
+        ADDITIONAL_CLEAN_FILES $<TARGET_FILE_DIR:${target}>/${target}${CODE_SHARING_OUTPUT_FILE_SUFFIX}
     )
 
     string(FIND "${KEEP_SYMBOL_LIST}" "*" wildcard)
@@ -301,7 +308,11 @@
             endif()
         endif()
 
-        add_dependencies(${target} ${symbol_provider})
+        # Ensure ${symbol_provider}_shared_symbols is built before ${target}
+        add_dependencies(${target} ${symbol_provider}_shared_symbols)
+        # ${symbol_provider}_shared_symbols - a custom target is always considered out-of-date
+        # To only link when necessary, depend on ${symbol_provider} instead
+        set_property(TARGET ${target} APPEND PROPERTY LINK_DEPENDS $<TARGET_OBJECTS:${symbol_provider}>)
         target_link_options(${target} PRIVATE LINKER:$<TARGET_FILE_DIR:${symbol_provider}>/${symbol_provider}${CODE_SHARING_INPUT_FILE_SUFFIX})
     endforeach()
 endmacro()