| 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() |