diff options
author | Raffi Enficiaud <raffi.enficiaud@mines-paris.org> | 2015-04-21 20:48:37 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2015-04-23 13:03:10 (GMT) |
commit | 75b0e1679c39ca824a4c49d9e1a2ae2b5f04ae06 (patch) | |
tree | ad0adcba48eb69edc50c2d2c9718f1434e6e1597 /Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake | |
parent | fdfe4586a047d9b6cc64efdd22fbdc67e9f1193f (diff) | |
download | CMake-75b0e1679c39ca824a4c49d9e1a2ae2b5f04ae06.zip CMake-75b0e1679c39ca824a4c49d9e1a2ae2b5f04ae06.tar.gz CMake-75b0e1679c39ca824a4c49d9e1a2ae2b5f04ae06.tar.bz2 |
CPackDeb: Add basic package tests
Tests of generated component based deb packages with lintian and dpkg.
Also includes basic file name check.
Diffstat (limited to 'Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake')
-rw-r--r-- | Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake b/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake new file mode 100644 index 0000000..bd4f12a --- /dev/null +++ b/Tests/CPackComponentsDEB/RunCPackVerifyResult.cmake @@ -0,0 +1,192 @@ +# prevent older policies from interfearing with this script +cmake_policy(PUSH) +cmake_policy(VERSION ${CMAKE_VERSION}) + + +include(CMakeParseArguments) + +message(STATUS "=============================================================================") +message(STATUS "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)") +message(STATUS "") + +if(NOT CPackComponentsDEB_BINARY_DIR) + message(FATAL_ERROR "CPackComponentsDEB_BINARY_DIR not set") +endif() + +if(NOT CPackGen) + message(FATAL_ERROR "CPackGen not set") +endif() + +message("CMAKE_CPACK_COMMAND = ${CMAKE_CPACK_COMMAND}") +if(NOT CMAKE_CPACK_COMMAND) + message(FATAL_ERROR "CMAKE_CPACK_COMMAND not set") +endif() + +if(NOT CPackDEBConfiguration) + message(FATAL_ERROR "CPackDEBConfiguration not set") +endif() + +# run cpack with some options and returns the list of files generated +# -output_expected_file: list of files that match the pattern +function(run_cpack output_expected_file CPack_output_parent CPack_error_parent) + set(options ) + set(oneValueArgs "EXPECTED_FILE_MASK" "CONFIG_VERBOSE") + set(multiValueArgs "CONFIG_ARGS") + cmake_parse_arguments(run_cpack_deb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + + # clean-up previously CPack generated files + if(${run_cpack_deb_EXPECTED_FILE_MASK}) + file(GLOB expected_file "${${run_cpack_deb_EXPECTED_FILE_MASK}}") + if (expected_file) + file(REMOVE "${expected_file}") + endif() + endif() + + message("config_args = ${run_cpack_deb_CONFIG_ARGS}") + message("config_verbose = ${run_cpack_deb_CONFIG_VERBOSE}") + execute_process(COMMAND ${CMAKE_CPACK_COMMAND} ${run_cpack_deb_CONFIG_VERBOSE} -G ${CPackGen} ${run_cpack_deb_CONFIG_ARGS} + RESULT_VARIABLE CPack_result + OUTPUT_VARIABLE CPack_output + ERROR_VARIABLE CPack_error + WORKING_DIRECTORY ${CPackComponentsDEB_BINARY_DIR}) + + set(${CPack_output_parent} ${CPack_output} PARENT_SCOPE) + set(${CPack_error_parent} ${CPack_error} PARENT_SCOPE) + + if (CPack_result) + message(FATAL_ERROR "error: CPack execution went wrong!, CPack_output=${CPack_output}, CPack_error=${CPack_error}") + else () + message(STATUS "CPack_output=${CPack_output}") + endif() + + + if(run_cpack_deb_EXPECTED_FILE_MASK) + file(GLOB _output_expected_file "${run_cpack_deb_EXPECTED_FILE_MASK}") + set(${output_expected_file} "${_output_expected_file}" PARENT_SCOPE) + endif() +endfunction() + + + +# This function runs lintian on a .deb and returns its output +function(run_lintian lintian_output) + set(${lintian_output} "" PARENT_SCOPE) + + find_program(LINTIAN_EXECUTABLE lintian) + if(LINTIAN_EXECUTABLE) + set(options "") + set(oneValueArgs "FILENAME") + set(multiValueArgs "") + cmake_parse_arguments(run_lintian_deb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + + if(NOT run_lintian_deb_FILENAME) + message(FATAL_ERROR "error: run_lintian needs FILENAME to be set") + endif() + + # run lintian + execute_process(COMMAND ${LINTIAN_EXECUTABLE} ${run_lintian_deb_FILENAME} + WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}" + OUTPUT_VARIABLE LINTIAN_OUTPUT + RESULT_VARIABLE LINTIAN_RESULT + ERROR_VARIABLE LINTIAN_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE ) + + set(${lintian_output} "${LINTIAN_OUTPUT}" PARENT_SCOPE) + else() + message(FATAL_ERROR "run_lintian called without lintian executable being present") + endif() +endfunction() + + +# Higher level lintian check that parse the output for errors and required strings +function(lintian_check_specific_errors output_errors) + set(${output_errors} "" PARENT_SCOPE) + set(ERROR_ACC) + + set(options "") + set(oneValueArgs "FILENAME") + set(multiValueArgs "ERROR_REGEX_STRINGS") + cmake_parse_arguments(lintian_check_specific_errors_deb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + set(lintian_output) + run_lintian(lintian_output FILENAME ${lintian_check_specific_errors_deb_FILENAME}) + + message(STATUS "Lintian output is ''${lintian_output}'") + + # regex to avoid + foreach(_s IN LISTS lintian_check_specific_errors_deb_ERROR_REGEX_STRINGS) + + if("${_s}" STREQUAL "") + continue() + endif() + + string(REGEX MATCHALL "${_s}" "_TMP_CHECK_ERROR" "${lintian_output}") + + if(NOT "${_TMP_CHECK_ERROR}" STREQUAL "") + set(ERROR_ACC "${ERROR_ACC}\nlintian: ${_f}: output contains an undesirable regex:\n\t${_TMP_CHECK_ERROR}") + endif() + endforeach() + + set(${output_errors} "${ERROR_ACC}" PARENT_SCOPE) +endfunction() + + + + +# This function runs dpkg-deb on a .deb and returns its output +function(run_dpkgdeb dpkg_deb_output) + set(${dpkg_deb_output} "" PARENT_SCOPE) + + find_program(DPKGDEB_EXECUTABLE dpkg-deb) + if(DPKGDEB_EXECUTABLE) + + set(options "") + set(oneValueArgs "FILENAME") + set(multiValueArgs "") + cmake_parse_arguments(run_dpkgdeb_deb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + + if(NOT run_dpkgdeb_deb_FILENAME) + message(FATAL_ERROR "error: run_dpkgdeb needs FILENAME to be set") + endif() + + # run lintian + execute_process(COMMAND ${DPKGDEB_EXECUTABLE} -I ${run_dpkgdeb_deb_FILENAME} + WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}" + OUTPUT_VARIABLE DPKGDEB_OUTPUT + RESULT_VARIABLE DPKGDEB_RESULT + ERROR_VARIABLE DPKGDEB_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE ) + + set(${dpkg_deb_output} "${DPKGDEB_OUTPUT}" PARENT_SCOPE) + else() + message(FATAL_ERROR "run_dpkgdeb called without dpkg-deb executable being present") + endif() +endfunction() + + +# returns a particular line of the metadata of the .deb, for checking +# a previous call to run_dpkgdeb should provide the DPKGDEB_OUTPUT entry. +function(dpkgdeb_return_specific_metaentry output) + set(${output} "" PARENT_SCOPE) + + set(options "") + set(oneValueArgs "DPKGDEB_OUTPUT" "METAENTRY") + set(multiValueArgs "") + cmake_parse_arguments(dpkgdeb_return_specific_metaentry_deb "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + if(NOT dpkgdeb_return_specific_metaentry_deb_METAENTRY) + message(FATAL_ERROR "error: dpkgdeb_return_specific_metaentry needs METAENTRY to be set") + endif() + + string(REGEX MATCH "${dpkgdeb_return_specific_metaentry_deb_METAENTRY}([^\r\n]*)" _TMP_STR "${dpkgdeb_return_specific_metaentry_deb_DPKGDEB_OUTPUT}") + #message("################ _TMP_STR = ${CMAKE_MATCH_1} ##################") + if(NOT "${CMAKE_MATCH_1}" STREQUAL "") + string(STRIP "${CMAKE_MATCH_1}" _TMP_STR) + set(${output} "${_TMP_STR}" PARENT_SCOPE) + endif() +endfunction() + +cmake_policy(POP) |