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