1# prevent older policies from interfearing with this script
2cmake_policy(PUSH)
3cmake_policy(VERSION ${CMAKE_VERSION})
4
5message(STATUS "=============================================================================")
6message(STATUS "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)")
7message(STATUS "")
8
9if(NOT CPackComponentsForAll_BINARY_DIR)
10  message(FATAL_ERROR "CPackComponentsForAll_BINARY_DIR not set")
11endif()
12
13if(NOT CPackGen)
14  message(FATAL_ERROR "CPackGen not set")
15endif()
16
17message("CMAKE_CPACK_COMMAND = ${CMAKE_CPACK_COMMAND}")
18if(NOT CMAKE_CPACK_COMMAND)
19  message(FATAL_ERROR "CMAKE_CPACK_COMMAND not set")
20endif()
21
22if(NOT CPackComponentWay)
23  message(FATAL_ERROR "CPackComponentWay not set")
24endif()
25
26set(expected_file_mask "")
27# The usual default behavior is to expect a single file
28# Then some specific generators (Archive, RPM, ...)
29# May produce several numbers of files depending on
30# CPACK_COMPONENT_xxx values
31set(expected_count 1)
32set(config_type $ENV{CMAKE_CONFIG_TYPE})
33set(config_args )
34if(config_type)
35  set(config_args -C ${config_type})
36endif()
37set(config_verbose )
38
39if(CPackGen MATCHES "ZIP")
40    set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.zip")
41    if(${CPackComponentWay} STREQUAL "default")
42        set(expected_count 1)
43    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
44        set(expected_count 3)
45    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
46        set(expected_count 4)
47    elseif(${CPackComponentWay} STREQUAL "AllInOne")
48        set(expected_count 1)
49    endif()
50elseif(CPackGen MATCHES "RPM")
51    set(config_verbose -D "CPACK_RPM_PACKAGE_DEBUG=1")
52    set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.rpm")
53    if(${CPackComponentWay} STREQUAL "default")
54        set(expected_count 1)
55    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
56        set(expected_count 3)
57    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
58        set(expected_count 4)
59    elseif(${CPackComponentWay} STREQUAL "AllInOne")
60        set(expected_count 1)
61    endif()
62elseif(CPackGen MATCHES "DEB")
63    set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/mylib*_1.0.2_*.deb")
64    if(${CPackComponentWay} STREQUAL "default")
65        set(expected_count 1)
66    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
67        set(expected_count 3)
68    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
69        set(expected_count 4)
70    elseif(${CPackComponentWay} STREQUAL "AllInOne")
71        set(expected_count 1)
72    endif()
73elseif(CPackGen MATCHES "NuGet")
74    set(config_verbose -D "CPACK_NUGET_PACKAGE_DEBUG=1")
75    set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib*1.0.2.nupkg")
76    if(${CPackComponentWay} STREQUAL "default")
77        set(expected_count 1)
78    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
79        set(expected_count 3)
80    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
81        set(expected_count 4)
82    elseif(${CPackComponentWay} STREQUAL "AllInOne")
83        set(expected_count 1)
84    endif()
85endif()
86
87if(CPackGen MATCHES "DragNDrop")
88    set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.dmg")
89    if(${CPackComponentWay} STREQUAL "default")
90        set(expected_count 1)
91        set(expect_dmg_sla 1)
92    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
93        set(expected_count 3)
94    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
95        set(expected_count 4)
96    elseif(${CPackComponentWay} STREQUAL "AllInOne")
97        set(expected_count 1)
98        set(expect_dmg_sla 1)
99    endif()
100endif()
101
102# clean-up previously CPack generated files
103if(expected_file_mask)
104  file(GLOB expected_file "${expected_file_mask}")
105  if(expected_file)
106    file(REMOVE ${expected_file})
107  endif()
108endif()
109
110message("config_args = ${config_args}")
111message("config_verbose = ${config_verbose}")
112execute_process(COMMAND ${CMAKE_CPACK_COMMAND} ${config_verbose} -G ${CPackGen} ${config_args}
113    RESULT_VARIABLE CPack_result
114    OUTPUT_VARIABLE CPack_output
115    ERROR_VARIABLE CPack_error
116    WORKING_DIRECTORY ${CPackComponentsForAll_BINARY_DIR})
117
118string(REPLACE "\n" "\n cpack-out> " cpack_out "\n${CPack_output}")
119string(REPLACE "\n" "\n cpack-err> " cpack_err "\n${CPack_error}")
120string(REPLACE "\n" "\n cpack-res> " cpack_res "\n${CPack_result}")
121string(CONCAT output_error_message
122  "CPack output:${cpack_out}\n"
123  "CPack error:${cpack_err}\n"
124  "CPack result:${cpack_res}\n"
125  )
126
127if(CPack_result)
128  message(FATAL_ERROR "error: CPack execution went wrong!,\n${output_error_message}")
129else ()
130  message(STATUS "CPack_output=${CPack_output}")
131endif()
132
133# Now verify if the number of expected file is OK
134# - using expected_file_mask and
135# - expected_count
136if(expected_file_mask)
137  file(GLOB expected_file "${expected_file_mask}")
138
139  message(STATUS "expected_count='${expected_count}'")
140  message(STATUS "expected_file='${expected_file}'")
141  message(STATUS "expected_file_mask='${expected_file_mask}'")
142
143  if(NOT expected_file)
144    message(FATAL_ERROR "error: expected_file does not exist: CPackComponentsForAll test fails.\n${output_error_message}")
145  endif()
146
147  list(LENGTH expected_file actual_count)
148  message(STATUS "actual_count='${actual_count}'")
149  if(NOT actual_count EQUAL expected_count)
150    message(FATAL_ERROR "error: expected_count=${expected_count} does not match actual_count=${actual_count}: CPackComponents test fails.\n${output_error_message}")
151  endif()
152
153  if(expect_dmg_sla)
154    execute_process(COMMAND hdiutil udifderez -xml "${expected_file}" OUTPUT_VARIABLE out ERROR_VARIABLE err RESULT_VARIABLE res)
155    if(NOT res EQUAL 0)
156      string(REPLACE "\n" "\n  " err "  ${err}")
157      message(FATAL_ERROR "error: running 'hdiutil udifderez -xml' on\n  ${expected_file}\nfailed with:\n${err}")
158    endif()
159    foreach(key "LPic" "STR#" "TEXT")
160      if(NOT out MATCHES "<key>${key}</key>")
161        string(REPLACE "\n" "\n  " out "  ${out}")
162        message(FATAL_ERROR "error: running 'hdiutil udifderez -xml' on\n  ${expected_file}\ndid not show '${key}' key:\n${out}")
163      endif()
164    endforeach()
165    foreach(line
166        # LPic first and last base64 lines
167        "\tAAIAEQADAAEAAAAAAAIAAAAIAAMAAAABAAQAAAAEAAUAAAAOAAYA\n"
168        "\tAA0AAABbAAQAAAAzAA8AAQAMABAAAAALAA4AAA==\n"
169        # STR# first and last base64 lines
170        "\tAAkHRW5nbGlzaAVBZ3JlZQhEaXNhZ3JlZQVQcmludAdTYXZlLi4u\n"
171        "\tdGVkIGEgcHJpbnRlci4=\n"
172        # TEXT first and last base64 lines
173        "\tTElDRU5TRQ0tLS0tLS0tDVRoaXMgaXMgYW4gaW5zdGFsbGVyIGNy\n"
174        "\tTm8gbGljZW5zZSBwcm92aWRlZC4NDQ==\n"
175        )
176      if(NOT out MATCHES "${line}")
177        string(REPLACE "\n" "\n  " out "  ${out}")
178        message(FATAL_ERROR "error: running 'hdiutil udifderez -xml' on\n  ${expected_file}\ndid not show '${line}':\n${out}")
179      endif()
180    endforeach()
181  endif()
182endif()
183
184# Validate content
185if(CPackGen MATCHES "RPM")
186  find_program(RPM_EXECUTABLE rpm)
187  if(NOT RPM_EXECUTABLE)
188    message(FATAL_ERROR "error: missing rpm executable required by the test")
189  endif()
190
191  set(CPACK_RPM_PACKAGE_SUMMARY "default summary")
192  set(CPACK_RPM_HEADERS_PACKAGE_SUMMARY "headers summary")
193  set(CPACK_RPM_HEADERS_PACKAGE_DESCRIPTION "headers description")
194  set(CPACK_COMPONENT_APPLICATIONS_DESCRIPTION
195    "An extremely useful application that makes use of MyLib")
196  set(CPACK_COMPONENT_LIBRARIES_DESCRIPTION
197    "Static libraries used to build programs with MyLib")
198  set(LIB_SUFFIX "6?4?")
199
200  # test package info
201  if(${CPackComponentWay} STREQUAL "IgnoreGroup")
202    # set gnu install prefixes to what they are set during rpm creation
203    # CMAKE_SIZEOF_VOID_P is not set here but lib is prefix of lib64 so
204    # relocation path test won't fail on OSes with lib64 library location
205    include(GNUInstallDirs)
206    set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/foo/bar")
207
208    foreach(check_file ${expected_file})
209      string(REGEX MATCH ".*libraries.*" check_file_libraries_match ${check_file})
210      string(REGEX MATCH ".*headers.*" check_file_headers_match ${check_file})
211      string(REGEX MATCH ".*applications.*" check_file_applications_match ${check_file})
212      string(REGEX MATCH ".*Unspecified.*" check_file_Unspecified_match ${check_file})
213
214      execute_process(COMMAND ${RPM_EXECUTABLE} -pqi ${check_file}
215          OUTPUT_VARIABLE check_file_content
216          ERROR_QUIET
217          OUTPUT_STRIP_TRAILING_WHITESPACE)
218
219      execute_process(COMMAND ${RPM_EXECUTABLE} -pqa ${check_file}
220          RESULT_VARIABLE check_package_architecture_result
221          OUTPUT_VARIABLE check_package_architecture
222          ERROR_QUIET
223          OUTPUT_STRIP_TRAILING_WHITESPACE)
224
225      execute_process(COMMAND ${RPM_EXECUTABLE} -pql ${check_file}
226          OUTPUT_VARIABLE check_package_content
227          ERROR_QUIET
228          OUTPUT_STRIP_TRAILING_WHITESPACE)
229
230      set(whitespaces "[\\t\\n\\r ]*")
231
232      if(check_file_libraries_match)
233        set(check_file_match_expected_summary ".*${CPACK_RPM_PACKAGE_SUMMARY}.*")
234        set(check_file_match_expected_description ".*${CPACK_COMPONENT_LIBRARIES_DESCRIPTION}.*")
235        set(check_file_match_expected_relocation_path "Relocations${whitespaces}:${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX}${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/other_relocatable${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}${LIB_SUFFIX}/inside_relocatable_two/depth_two/different_relocatable")
236        set(check_file_match_expected_architecture "") # we don't explicitly set this value so it is different on each platform - ignore it
237        set(spec_regex "*libraries*")
238        set(check_content_list "^/usr/foo/bar/lib${LIB_SUFFIX}
239/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one
240/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two
241/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/depth_three
242/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/depth_three/symlink_parentdir_path
243/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/symlink_outside_package
244/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/symlink_outside_wdr
245/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/symlink_relocatable_subpath
246/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/symlink_samedir_path
247/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/symlink_samedir_path_current_dir
248/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/depth_two/symlink_samedir_path_longer
249/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_one/symlink_subdir_path
250/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_two
251/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_two/depth_two
252/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_two/depth_two/different_relocatable
253/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_two/depth_two/different_relocatable/bar
254/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_two/depth_two/symlink_other_relocatable_path
255/usr/foo/bar/lib${LIB_SUFFIX}/inside_relocatable_two/depth_two/symlink_to_non_relocatable_path
256/usr/foo/bar/lib${LIB_SUFFIX}/libmylib.a
257/usr/foo/bar/non_relocatable
258/usr/foo/bar/non_relocatable/depth_two
259/usr/foo/bar/non_relocatable/depth_two/symlink_from_non_relocatable_path
260/usr/foo/bar/other_relocatable
261/usr/foo/bar/other_relocatable/depth_two(\n.*\.build-id.*)*$")
262      elseif(check_file_headers_match)
263        set(check_file_match_expected_summary ".*${CPACK_RPM_HEADERS_PACKAGE_SUMMARY}.*")
264        set(check_file_match_expected_description ".*${CPACK_RPM_HEADERS_PACKAGE_DESCRIPTION}.*")
265        set(check_file_match_expected_relocation_path "Relocations${whitespaces}:${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
266        set(check_file_match_expected_architecture "noarch")
267        set(spec_regex "*headers*")
268        set(check_content_list "^/usr/foo/bar\n/usr/foo/bar/include\n/usr/foo/bar/include/mylib.h(\n.*\.build-id.*)*$")
269      elseif(check_file_applications_match)
270        set(check_file_match_expected_summary ".*${CPACK_RPM_PACKAGE_SUMMARY}.*")
271        set(check_file_match_expected_description ".*${CPACK_COMPONENT_APPLICATIONS_DESCRIPTION}.*")
272        set(check_file_match_expected_relocation_path "Relocations${whitespaces}:${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
273        set(check_file_match_expected_architecture "armv7hl")
274        set(spec_regex "*applications*")
275        set(check_content_list "^/usr/foo/bar
276/usr/foo/bar/bin
277/usr/foo/bar/bin/mylibapp(\n.*\.build-id.*)*$")
278      elseif(check_file_Unspecified_match)
279        set(check_file_match_expected_summary ".*${CPACK_RPM_PACKAGE_SUMMARY}.*")
280        set(check_file_match_expected_description ".*DESCRIPTION.*")
281        set(check_file_match_expected_relocation_path "Relocations${whitespaces}:${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
282        set(check_file_match_expected_architecture "") # we don't explicitly set this value so it is different on each platform - ignore it
283        set(spec_regex "*Unspecified*")
284        set(check_content_list "^/usr/foo/bar
285/usr/foo/bar/bin
286/usr/foo/bar/bin/@in@_@path@@with
287/usr/foo/bar/bin/@in@_@path@@with/@and
288/usr/foo/bar/bin/@in@_@path@@with/@and/@
289/usr/foo/bar/bin/@in@_@path@@with/@and/@/@in_path@
290/usr/foo/bar/bin/@in@_@path@@with/@and/@/@in_path@/mylibapp2
291/usr/foo/bar/share
292/usr/foo/bar/share/man
293/usr/foo/bar/share/man/mylib
294/usr/foo/bar/share/man/mylib/man3
295/usr/foo/bar/share/man/mylib/man3/mylib.1
296/usr/foo/bar/share/man/mylib/man3/mylib.1/mylib
297/usr/foo/bar/share/man/mylib/man3/mylib.1/mylib2(\n.*\.build-id.*)*$")
298      else()
299        message(FATAL_ERROR "error: unexpected rpm package '${check_file}'")
300      endif()
301
302      #######################
303      # test package info
304      #######################
305      string(REGEX MATCH ${check_file_match_expected_summary} check_file_match_summary ${check_file_content})
306
307      if(NOT check_file_match_summary)
308        message(FATAL_ERROR "error: '${check_file}' rpm package summary does not match expected value - regex '${check_file_match_expected_summary}'; RPM output: '${check_file_content}'")
309      endif()
310
311      string(REGEX MATCH ${check_file_match_expected_description} check_file_match_description ${check_file_content})
312
313      if(NOT check_file_match_description)
314        message(FATAL_ERROR "error: '${check_file}' rpm package description does not match expected value - regex '${check_file_match_expected_description}'; RPM output: '${check_file_content}'")
315      endif()
316
317      string(REGEX MATCH ${check_file_match_expected_relocation_path} check_file_match_relocation_path ${check_file_content})
318
319      if(NOT check_file_match_relocation_path)
320        file(GLOB_RECURSE spec_file "${CPackComponentsForAll_BINARY_DIR}/${spec_regex}.spec")
321
322        if(spec_file)
323          file(READ ${spec_file} spec_file_content)
324        endif()
325
326        message(FATAL_ERROR "error: '${check_file}' rpm package relocation path does not match expected value - regex '${check_file_match_expected_relocation_path}'; RPM output: '${check_file_content}'; generated spec file: '${spec_file_content}'")
327      endif()
328
329      #######################
330      # test package architecture
331      #######################
332      string(REGEX MATCH "Architecture${whitespaces}:" check_info_contains_arch ${check_file_content})
333      if(check_info_contains_arch) # test for rpm versions that contain architecture in package info (e.g. 4.11.x)
334        string(REGEX MATCH "Architecture${whitespaces}:${whitespaces}${check_file_match_expected_architecture}" check_file_match_architecture ${check_file_content})
335        if(NOT check_file_match_architecture)
336          message(FATAL_ERROR "error: '${check_file}' Architecture does not match expected value - '${check_file_match_expected_architecture}'; RPM output: '${check_file_content}'; generated spec file: '${spec_file_content}'")
337        endif()
338      elseif(NOT check_package_architecture_result) # test result only on platforms that support -pqa rpm query
339        # test for rpm versions that do not contain architecture in package info (e.g. 4.8.x)
340        string(REGEX MATCH ".*${check_file_match_expected_architecture}" check_file_match_architecture "${check_package_architecture}")
341        if(NOT check_file_match_architecture)
342          message(FATAL_ERROR "error: '${check_file}' Architecture does not match expected value - '${check_file_match_expected_architecture}'; RPM output: '${check_package_architecture}'; generated spec file: '${spec_file_content}'")
343        endif()
344      # else rpm version too old (e.g. 4.4.x) - skip test
345      endif()
346
347      #######################
348      # test package content
349      #######################
350      string(REGEX MATCH "${check_content_list}" expected_content_list "${check_package_content}")
351
352      if(NOT expected_content_list)
353        file(GLOB_RECURSE spec_file "${CPackComponentsForAll_BINARY_DIR}/${spec_regex}.spec")
354
355        if(spec_file)
356          file(READ ${spec_file} spec_file_content)
357        endif()
358
359        message(FATAL_ERROR "error: '${check_file}' rpm package content does not match expected value - regex '${check_content_list}'; RPM output: '${check_package_content}'; generated spec file: '${spec_file_content}'")
360      endif()
361
362      # validate permissions user and group
363      execute_process(COMMAND ${RPM_EXECUTABLE} -pqlv ${check_file}
364          OUTPUT_VARIABLE check_file_content
365          ERROR_QUIET
366          OUTPUT_STRIP_TRAILING_WHITESPACE)
367
368      if(check_file_libraries_match)
369        set(check_file_match_expected_permissions ".*-rwx------.*user.*defgrp.*")
370      elseif(check_file_headers_match)
371        set(check_file_match_expected_permissions ".*-rwxr--r--.*defusr.*defgrp.*")
372      elseif(check_file_applications_match)
373        set(check_file_match_expected_permissions ".*-rwxr--r--.*defusr.*group.*")
374      elseif(check_file_Unspecified_match)
375        set(check_file_match_expected_permissions ".*-rwxr--r--.*defusr.*defgrp.*")
376      else()
377        message(FATAL_ERROR "error: unexpected rpm package '${check_file}'")
378      endif()
379
380      string(REGEX MATCH "${check_file_match_expected_permissions}" check_file_match_permissions "${check_file_content}")
381
382      if(NOT check_file_match_permissions)
383          message(FATAL_ERROR "error: '${check_file}' rpm package permissions do not match expected value - regex '${check_file_match_expected_permissions}'")
384      endif()
385    endforeach()
386
387    #######################
388    # verify generated symbolic links
389    #######################
390    file(GLOB_RECURSE symlink_files RELATIVE "${CPackComponentsForAll_BINARY_DIR}" "${CPackComponentsForAll_BINARY_DIR}/*/symlink_*")
391
392    foreach(check_symlink IN LISTS symlink_files)
393      get_filename_component(symlink_name "${check_symlink}" NAME)
394      execute_process(COMMAND ls -la "${check_symlink}"
395                WORKING_DIRECTORY "${CPackComponentsForAll_BINARY_DIR}"
396                OUTPUT_VARIABLE SYMLINK_POINT_
397                OUTPUT_STRIP_TRAILING_WHITESPACE)
398
399      if("${symlink_name}" STREQUAL "symlink_samedir_path"
400          OR "${symlink_name}" STREQUAL "symlink_samedir_path_current_dir"
401          OR "${symlink_name}" STREQUAL "symlink_samedir_path_longer")
402        string(REGEX MATCH "^.*${whitespaces}->${whitespaces}depth_three$" check_symlink "${SYMLINK_POINT_}")
403      elseif("${symlink_name}" STREQUAL "symlink_subdir_path")
404        string(REGEX MATCH "^.*${whitespaces}->${whitespaces}depth_two/depth_three$" check_symlink "${SYMLINK_POINT_}")
405      elseif("${symlink_name}" STREQUAL "symlink_parentdir_path")
406        string(REGEX MATCH "^.*${whitespaces}->${whitespaces}../$" check_symlink "${SYMLINK_POINT_}")
407      elseif("${symlink_name}" STREQUAL "symlink_to_non_relocatable_path")
408        string(REGEX MATCH "^.*${whitespaces}->${whitespaces}${CPACK_PACKAGING_INSTALL_PREFIX}/non_relocatable/depth_two$" check_symlink "${SYMLINK_POINT_}")
409      elseif("${symlink_name}" STREQUAL "symlink_outside_package")
410        string(REGEX MATCH "^.*${whitespaces}->${whitespaces}outside_package$" check_symlink "${SYMLINK_POINT_}")
411      elseif("${symlink_name}" STREQUAL "symlink_outside_wdr")
412        string(REGEX MATCH "^.*${whitespaces}->${whitespaces}/outside_package_wdr$" check_symlink "${SYMLINK_POINT_}")
413      elseif("${symlink_name}" STREQUAL "symlink_other_relocatable_path"
414          OR "${symlink_name}" STREQUAL "symlink_from_non_relocatable_path"
415          OR "${symlink_name}" STREQUAL "symlink_relocatable_subpath")
416        # these links were not changed - post install script only - ignore them
417      else()
418        message(FATAL_ERROR "error: unexpected rpm symbolic link '${check_symlink}'")
419      endif()
420
421      if(NOT check_symlink)
422        message(FATAL_ERROR "symlink points to unexpected location '${SYMLINK_POINT_}'")
423      endif()
424    endforeach()
425
426    # verify post install symlink relocation script
427    file(GLOB_RECURSE spec_file "${CPackComponentsForAll_BINARY_DIR}/*libraries*.spec")
428    file(READ ${spec_file} spec_file_content)
429    file(READ "${CMAKE_CURRENT_LIST_DIR}/symlink_postinstall_expected.txt" symlink_postinstall_expected)
430    # prepare regex
431    string(STRIP "${symlink_postinstall_expected}" symlink_postinstall_expected)
432    string(REPLACE "[" "\\[" symlink_postinstall_expected "${symlink_postinstall_expected}")
433    string(REPLACE "$" "\\$" symlink_postinstall_expected "${symlink_postinstall_expected}")
434    string(REPLACE "lib" "lib${LIB_SUFFIX}" symlink_postinstall_expected "${symlink_postinstall_expected}")
435    # compare
436    string(REGEX MATCH ".*${symlink_postinstall_expected}.*" symlink_postinstall_expected_matches "${spec_file_content}")
437    if(NOT symlink_postinstall_expected_matches)
438      message(FATAL_ERROR "error: unexpected rpm symbolic link postinstall script! generated spec file: '${spec_file_content}'")
439    endif()
440  endif()
441endif()
442
443cmake_policy(POP)
444