summaryrefslogtreecommitdiffstats
path: root/cmake/sign.cmake.in
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/sign.cmake.in')
-rw-r--r--cmake/sign.cmake.in36
1 files changed, 36 insertions, 0 deletions
diff --git a/cmake/sign.cmake.in b/cmake/sign.cmake.in
new file mode 100644
index 00000000..50768a3d
--- /dev/null
+++ b/cmake/sign.cmake.in
@@ -0,0 +1,36 @@
+# If timestamping is used, it can (rarely) fail, when public timestamping service has issues.
+#
+# To handle the error gracefully and tranparently, we'll retry the signtool command,
+# second time without "/t URL" parameter
+SET(SIGNTOOL_PARAMETERS_NO_TIMESTAMP "@SIGNTOOL_PARAMETERS@")
+LIST(FIND SIGNTOOL_PARAMETERS_NO_TIMESTAMP /t idx)
+IF(NOT(idx EQUAL -1))
+ LIST(REMOVE_AT SIGNTOOL_PARAMETERS_NO_TIMESTAMP ${idx})
+ #remove the URL following /t , as well
+ LIST(REMOVE_AT SIGNTOOL_PARAMETERS_NO_TIMESTAMP ${idx})
+ENDIF()
+
+GET_FILENAME_COMPONENT(SIGNTOOL_DIR "@SIGNTOOL_EXECUTABLE@" DIRECTORY)
+GET_FILENAME_COMPONENT(SIGNTOOL_NAME "@SIGNTOOL_EXECUTABLE@" NAME)
+
+FILE(GLOB_RECURSE files "@CMAKE_BINARY_DIR@/*.signme")
+MESSAGE(STATUS "signing files")
+
+
+FOREACH(f ${files})
+ STRING(REPLACE ".signme" "" exe_location "${f}")
+
+ string (REPLACE ";" " " params "@SIGNTOOL_PARAMETERS@")
+
+ EXECUTE_PROCESS(COMMAND
+ cmd /c "${SIGNTOOL_NAME}" sign @SIGNTOOL_PARAMETERS@ "${exe_location}" 2>NUL
+ || "${SIGNTOOL_NAME}" sign ${SIGNTOOL_PARAMETERS_NO_TIMESTAMP} "${exe_location}"
+ WORKING_DIRECTORY ${SIGNTOOL_DIR}
+ RESULT_VARIABLE ERR)
+ IF(NOT ${ERR} EQUAL 0)
+ MESSAGE( "Error ${ERR} signing ${exe_location}")
+ ELSE()
+ FILE(REMOVE ${f})
+ ENDIF()
+
+ENDFOREACH()