Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Tests / RunCMake / CPack / DEB / Helpers.cmake
1 set(ALL_FILES_GLOB "*.deb" "*.ddeb")
2
3 function(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)
10 endfunction()
11
12 function(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()
30 endfunction()
31
32 function(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)
47 endfunction()
48
49 function(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)
64 endfunction()
65
66 function(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(CPACK_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 ${CPACK_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)
127 endfunction()
128
129 function(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()
166 endfunction()
167
168 function(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)
176 endfunction()