macro(getFileMetadata_ FILE RESULT_VAR) if(GENERATOR_TYPE STREQUAL "TGZ") # getPackageContent defined for archives omit the metadata (non-verbose) execute_process(COMMAND ${CMAKE_COMMAND} -E env TZ=Etc/UTC ${CMAKE_COMMAND} -E tar -xtvf ${FILE} OUTPUT_VARIABLE ${RESULT_VAR} ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) else() getPackageContent("${FILE}" ${RESULT_VAR}) endif() endmacro() function(checkContentTimestamp FILE REGEX) getFileMetadata_("${FILE}" METADATA_) if(NOT METADATA_ MATCHES "${REGEX}") string(REPLACE "\n" "\n " metadata_indented "${METADATA_}") message(FATAL_ERROR "Wrong timestamps in file:\n" " ${FILE}\n" "Expected timestamps to match:\n" " ${REGEX}\n" "Actual timestamps:\n" " ${metadata_indented}") endif() endfunction() function(checkTimestamp FILE_NAME) file(READ ${FILE_NAME} ACTUAL_TIMESTAMP OFFSET 4 LIMIT 4 HEX) if(NOT ACTUAL_TIMESTAMP STREQUAL "00000000") message(FATAL_ERROR "${FILE_NAME} contains a timestamp [0x${ACTUAL_TIMESTAMP}]") endif() endfunction() # Expected timestamp is UNIX time 123456789 if(GENERATOR_TYPE STREQUAL "TGZ") set(EXPECTED_TIMESTAMP "29 Nov +1973") set(EXPECTED_FILES foo/ foo/CMakeLists.txt) else() set(EXPECTED_TIMESTAMP "1973-11-29 21:33") set(EXPECTED_FILES ./usr/ ./usr/foo/ ./usr/foo/CMakeLists.txt) endif() set(EXPECTED_METADATA) foreach(FILE ${EXPECTED_FILES}) list(APPEND EXPECTED_METADATA ".* ${EXPECTED_TIMESTAMP} ${FILE}") endforeach() list(JOIN EXPECTED_METADATA ".*" EXPECTED_REGEX) checkContentTimestamp("${FOUND_FILE_1}" "${EXPECTED_REGEX}") if(GENERATOR_TYPE STREQUAL "TGZ") checkTimestamp("${FOUND_FILE_1}") else() execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${FOUND_FILE_1}") checkTimestamp("data.tar.gz") checkTimestamp("control.tar.gz") endif()