1set(ALL_FILES_GLOB "*.deb" "*.ddeb") 2 3function(getPackageContent FILE RESULT_VAR) 4 execute_process(COMMAND ${CMAKE_COMMAND} -E env TZ=Etc/UTC ${DPKG_EXECUTABLE} -c "${FILE}" 5 OUTPUT_VARIABLE package_content_ 6 ERROR_QUIET 7 OUTPUT_STRIP_TRAILING_WHITESPACE) 8 9 set(${RESULT_VAR} "${package_content_}" PARENT_SCOPE) 10endfunction() 11 12function(getPackageNameGlobexpr NAME COMPONENT VERSION REVISION FILE_NO RESULT_VAR) 13 if(COMPONENT) 14 set(COMPONENT "-${COMPONENT}") 15 endif() 16 17 if(DEFINED EXPECTED_FILE_${FILE_NO}_FILENAME_GENERATOR_SPECIFIC_FORMAT) 18 set(GENERATOR_SPECIFIC_FORMAT "${EXPECTED_FILE_${FILE_NO}_FILENAME_GENERATOR_SPECIFIC_FORMAT}") 19 elseif(DEFINED EXPECTED_FILES_NAME_GENERATOR_SPECIFIC_FORMAT) 20 set(GENERATOR_SPECIFIC_FORMAT "${EXPECTED_FILES_NAME_GENERATOR_SPECIFIC_FORMAT}") 21 else() 22 set(GENERATOR_SPECIFIC_FORMAT FALSE) 23 endif() 24 25 if(GENERATOR_SPECIFIC_FORMAT) 26 set(${RESULT_VAR} "${NAME}${COMPONENT}_${VERSION}_*.deb" PARENT_SCOPE) 27 else() 28 set(${RESULT_VAR} "${NAME}-${VERSION}-*${COMPONENT}.deb" PARENT_SCOPE) 29 endif() 30endfunction() 31 32function(getPackageContentList FILE RESULT_VAR) 33 execute_process(COMMAND ${DPKG_EXECUTABLE} -c "${FILE}" 34 OUTPUT_VARIABLE package_content_ 35 ERROR_QUIET 36 OUTPUT_STRIP_TRAILING_WHITESPACE) 37 38 unset(items_) 39 string(REPLACE "\n" ";" package_content_ "${package_content_}") 40 foreach(i_ IN LISTS package_content_) 41 string(REGEX REPLACE "^.* \.(/[^$]*)$" "\\1" result_ "${i_}") 42 string(REGEX REPLACE "/$" "" result_ "${result_}") 43 list(APPEND items_ "${result_}") 44 endforeach() 45 46 set(${RESULT_VAR} "${items_}" PARENT_SCOPE) 47endfunction() 48 49function(toExpectedContentList FILE_NO CONTENT_VAR) 50 # add install prefix to expected paths 51 if(DEFINED EXPECTED_FILE_${FILE_NO}_PACKAGING_PREFIX) 52 set(EXPECTED_FILE_PACKAGING_PREFIX 53 "${EXPECTED_FILE_${FILE_NO}_PACKAGING_PREFIX}") 54 elseif(NOT DEFINED EXPECTED_FILE_PACKAGING_PREFIX) 55 # default CPackDeb packaging install prefix 56 set(EXPECTED_FILE_PACKAGING_PREFIX "/usr") 57 endif() 58 set(prepared_ "${EXPECTED_FILE_PACKAGING_PREFIX}") 59 foreach(part_ IN LISTS ${CONTENT_VAR}) 60 list(APPEND prepared_ "${EXPECTED_FILE_PACKAGING_PREFIX}${part_}") 61 endforeach() 62 63 set(${CONTENT_VAR} "${prepared_}" PARENT_SCOPE) 64endfunction() 65 66function(getMissingShlibsErrorExtra FILE RESULT_VAR) 67 execute_process(COMMAND ${DPKG_EXECUTABLE} -x "${FILE}" data_${PREFIX} 68 ERROR_VARIABLE err_) 69 70 if(err_) 71 set(error_extra " Extra: Could not unpack package content: '${err}'") 72 else() 73 cmake_policy(PUSH) 74 # Tell file(GLOB_RECURSE) not to follow directory symlinks 75 # even if the project does not set this policy to NEW. 76 cmake_policy(SET CMP0009 NEW) 77 file(GLOB_RECURSE FILE_PATHS_ LIST_DIRECTORIES false "${CMAKE_CURRENT_BINARY_DIR}/data_${PREFIX}/*") 78 cmake_policy(POP) 79 80 # get file info so that we can determine if file is executable or not 81 foreach(FILE_ IN LISTS FILE_PATHS_) 82 execute_process(COMMAND file "${FILE_}" 83 WORKING_DIRECTORY "${WDIR}" 84 OUTPUT_VARIABLE INSTALL_FILE_ 85 ERROR_VARIABLE err_) 86 87 if(NOT err_) 88 list(APPEND deb_install_files "${INSTALL_FILE_}") 89 else() 90 list(APPEND deb_install_files_errors "'${FILE_}': '${err_}'\n") 91 endif() 92 endforeach() 93 94 set(error_extra " Extra: install files '${deb_install_files}'") 95 96 if(deb_install_files_errors) 97 string(APPEND error_extra "; errors \"${deb_install_files_errors}\"") 98 endif() 99 100 if(READELF_EXECUTABLE) 101 string(APPEND error_extra "; readelf \"\n") 102 103 # Only dynamically linked ELF files are included 104 # Extract only file name infront of ":" 105 foreach(_FILE IN LISTS deb_install_files) 106 if(_FILE MATCHES "ELF.*shared object") 107 string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}") 108 109 execute_process(COMMAND ${READELF_EXECUTABLE} -d "${CMAKE_MATCH_1}" 110 WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}" 111 RESULT_VARIABLE result 112 OUTPUT_VARIABLE output 113 ERROR_VARIABLE err_ 114 OUTPUT_STRIP_TRAILING_WHITESPACE) 115 116 string(APPEND error_extra " name '${CMAKE_MATCH_1}'\n result '${result}'\n output '${output}'\n error '${err_}'\n") 117 endif() 118 endforeach() 119 120 string(APPEND error_extra "\"") 121 else() 122 string(APPEND error_extra "; error readelf missing") 123 endif() 124 endif() 125 126 set(${RESULT_VAR} "${error_extra}" PARENT_SCOPE) 127endfunction() 128 129function(verifyDebControl FILE PREFIX VERIFY_FILES) 130 execute_process(COMMAND ${DPKG_EXECUTABLE} --control "${FILE}" control_${PREFIX} 131 ERROR_VARIABLE err_) 132 133 if(err_) 134 message(FATAL_ERROR "Debian control verification failed for file: " 135 "'${FILE}'; error output: '${err_}'") 136 endif() 137 138 foreach(FILE_ IN LISTS VERIFY_FILES) 139 if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/control_${PREFIX}/${FILE_}") 140 if(FILE_ STREQUAL "shlibs") 141 getMissingShlibsErrorExtra("${FILE}" error_extra) 142 endif() 143 144 message(FATAL_ERROR "Expected Debian control file does not exist: '${FILE_}'${error_extra}") 145 endif() 146 147 file(READ "${CMAKE_CURRENT_BINARY_DIR}/control_${PREFIX}/${FILE_}" content_) 148 if(NOT content_ MATCHES "${${PREFIX}_${FILE_}}") 149 message(FATAL_ERROR "Unexpected content in for '${PREFIX}_${FILE_}'!" 150 " Content: '${content_}'") 151 endif() 152 153 execute_process(COMMAND ls -l "${CMAKE_CURRENT_BINARY_DIR}/control_${PREFIX}/${FILE_}" 154 OUTPUT_VARIABLE package_permissions_ 155 ERROR_VARIABLE package_permissions_error_ 156 OUTPUT_STRIP_TRAILING_WHITESPACE) 157 158 if(NOT package_permissions_error_) 159 if(NOT package_permissions_ MATCHES "${${PREFIX}_${FILE_}_permissions_regex}") 160 message(FATAL_ERROR "Unexpected file permissions for ${PREFIX}_${FILE_}: '${package_permissions_}'!") 161 endif() 162 else() 163 message(FATAL_ERROR "Listing file permissions failed (${package_permissions_error_})!") 164 endif() 165 endforeach() 166endfunction() 167 168function(getPackageInfo FILE RESULT_VAR) 169 execute_process(COMMAND ${DPKG_EXECUTABLE} -I ${FILE} 170 WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}" 171 OUTPUT_VARIABLE package_info_ 172 ERROR_QUIET 173 OUTPUT_STRIP_TRAILING_WHITESPACE) 174 175 set(${RESULT_VAR} "${package_info_}" PARENT_SCOPE) 176endfunction() 177