Escape coverage target dependencies

Output file paths are used as a suffix in the name of custom accessory
targets. The target name must not contain slashes so they are being
replaced by dashes.

Change-Id: I2cf7acc61e7a5691733db47d508c3d10602e05e1
Signed-off-by: Imre Kis <imre.kis@arm.com>
diff --git a/cmake/Coverage.cmake b/cmake/Coverage.cmake
index efdba3b..0c93f85 100644
--- a/cmake/Coverage.cmake
+++ b/cmake/Coverage.cmake
@@ -39,6 +39,23 @@
 add_custom_target(coverage)
 add_custom_target(coverage_report)
 
+# Adds a file to the dependency list of the target by inserting an accessory
+# custom target. The name of the custom target is properly escaped.
+function(add_coverage_dependency)
+	set(_OPTIONS_ARGS)
+	set(_ONE_VALUE_ARGS TARGET DEPENDS)
+	set(_MULTI_VALUE_ARGS)
+	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
+
+	set(TARGET ${_MY_PARAMS_TARGET})
+	set(DEPENDS ${_MY_PARAMS_DEPENDS})
+
+	string(REGEX REPLACE "\\/" "_" CUSTOM_TARGET_SUFFIX ${DEPENDS})
+
+	add_custom_target(${TARGET}_target_${CUSTOM_TARGET_SUFFIX} DEPENDS ${DEPENDS})
+	add_dependencies(${TARGET} ${TARGET}_target_${CUSTOM_TARGET_SUFFIX})
+endfunction()
+
 # Generates LCOV coverage info file by processing the .gcda and .gcno files.
 # The function also maps coverage of the c-picker generated files to the original source lines
 # Global dependencies:
@@ -50,7 +67,7 @@
 	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
 
 	set(TEST_NAME ${_MY_PARAMS_NAME})
-	set(TEMP_FILE temp_${_MY_PARAMS_OUTPUT_FILE})
+	set(TEMP_FILE ${_MY_PARAMS_OUTPUT_FILE}_temp)
 	set(OUTPUT_FILE ${_MY_PARAMS_OUTPUT_FILE})
 
 	# Collecting information from .gcda and .gcno files into an lcov .info file
@@ -68,6 +85,11 @@
 			--output ${OUTPUT_FILE}
 			--mapping-path ${CPICKER_CACHE_PATH}
 	)
+
+	add_coverage_dependency(
+		TARGET coverage
+		DEPENDS ${OUTPUT_FILE}
+	)
 endfunction()
 
 # Filters coverage info of files from the matching directory
@@ -77,20 +99,26 @@
 	set(_MULTI_VALUE_ARGS)
 	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
 
+	set(INPUT_FILE ${_MY_PARAMS_INPUT_FILE})
+	set(OUTPUT_FILE ${_MY_PARAMS_OUTPUT_FILE})
+	set(INCLUDE_DIRECTORY ${_MY_PARAMS_INCLUDE_DIRECTORY})
+
 	# The pattern must be an absolute path ending with an asterisk
-	get_filename_component(INCLUDE_DIRECTORY_ABSPATH "${_MY_PARAMS_INCLUDE_DIRECTORY}" ABSOLUTE)
+	get_filename_component(INCLUDE_DIRECTORY_ABSPATH "${INCLUDE_DIRECTORY}" ABSOLUTE)
 	set(INCLUDE_DIRECTORY_ABSPATH "${INCLUDE_DIRECTORY_ABSPATH}/*")
 
 	add_custom_command(
-		OUTPUT ${_MY_PARAMS_OUTPUT_FILE}
+		OUTPUT ${OUTPUT_FILE}
 		COMMAND ${LCOV_COMMAND}
-			--extract ${_MY_PARAMS_INPUT_FILE} \"${INCLUDE_DIRECTORY_ABSPATH}\"
-			--output-file ${_MY_PARAMS_OUTPUT_FILE}
-		DEPENDS ${_MY_PARAMS_INPUT_FILE}
+			--extract ${INPUT_FILE} \"${INCLUDE_DIRECTORY_ABSPATH}\"
+			--output-file ${OUTPUT_FILE}
+		DEPENDS ${INPUT_FILE}
 	)
 
-	add_custom_target(coverage_target_${_MY_PARAMS_OUTPUT_FILE} DEPENDS ${_MY_PARAMS_OUTPUT_FILE})
-	add_dependencies(coverage coverage_target_${_MY_PARAMS_OUTPUT_FILE})
+	add_coverage_dependency(
+		TARGET coverage
+		DEPENDS ${OUTPUT_FILE}
+	)
 endfunction()
 
 # Generated an HTML report from the LCOV info file
@@ -100,14 +128,19 @@
 	set(_MULTI_VALUE_ARGS)
 	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
 
+	set(INPUT_FILE ${_MY_PARAMS_INPUT_FILE})
+	set(OUTPUT_DIRECTORY ${_MY_PARAMS_OUTPUT_DIRECTORY})
+
 	add_custom_command(
-		OUTPUT ${_MY_PARAMS_OUTPUT_DIRECTORY}
-		COMMAND genhtml ${_MY_PARAMS_INPUT_FILE}
+		OUTPUT ${OUTPUT_DIRECTORY}
+		COMMAND genhtml ${INPUT_FILE}
 			--show-details
-			--output-directory ${_MY_PARAMS_OUTPUT_DIRECTORY}
-		DEPENDS ${_MY_PARAMS_INPUT_FILE}
+			--output-directory ${OUTPUT_DIRECTORY}
+		DEPENDS ${INPUT_FILE}
 	)
 
-	add_custom_target(coverage_report_target_${_MY_PARAMS_INPUT_FILE} DEPENDS ${_MY_PARAMS_OUTPUT_DIRECTORY})
-	add_dependencies(coverage_report coverage_report_target_${_MY_PARAMS_INPUT_FILE})
+	add_coverage_dependency(
+		TARGET coverage_report
+		DEPENDS ${OUTPUT_DIRECTORY}
+	)
 endfunction()