Helpers.cmake 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. set(ALL_FILES_GLOB "*.deb")
  2. function(getPackageContent FILE RESULT_VAR)
  3. execute_process(COMMAND ${DPKG_EXECUTABLE} -c "${FILE}"
  4. OUTPUT_VARIABLE package_content_
  5. ERROR_QUIET
  6. OUTPUT_STRIP_TRAILING_WHITESPACE)
  7. set(${RESULT_VAR} "${package_content_}" PARENT_SCOPE)
  8. endfunction()
  9. function(getMissingShlibsErrorExtra FILE RESULT_VAR)
  10. execute_process(COMMAND ${DPKG_EXECUTABLE} -x "${FILE}" data_${PREFIX}
  11. ERROR_VARIABLE err_)
  12. if(err_)
  13. set(error_extra " Extra: Could not unpack package content: '${err}'")
  14. else()
  15. cmake_policy(PUSH)
  16. # Tell file(GLOB_RECURSE) not to follow directory symlinks
  17. # even if the project does not set this policy to NEW.
  18. cmake_policy(SET CMP0009 NEW)
  19. file(GLOB_RECURSE FILE_PATHS_ LIST_DIRECTORIES false "${CMAKE_CURRENT_BINARY_DIR}/data_${PREFIX}/*")
  20. cmake_policy(POP)
  21. # get file info so that we can determine if file is executable or not
  22. foreach(FILE_ IN LISTS FILE_PATHS_)
  23. execute_process(COMMAND file "${FILE_}"
  24. WORKING_DIRECTORY "${WDIR}"
  25. OUTPUT_VARIABLE INSTALL_FILE_
  26. ERROR_VARIABLE err_)
  27. if(NOT err_)
  28. list(APPEND deb_install_files "${INSTALL_FILE_}")
  29. else()
  30. list(APPEND deb_install_files_errors "'${FILE_}': '${err_}'\n")
  31. endif()
  32. endforeach()
  33. set(error_extra " Extra: install files '${deb_install_files}'")
  34. if(deb_install_files_errors)
  35. string(APPEND error_extra "; errors \"${deb_install_files_errors}\"")
  36. endif()
  37. find_program(READELF_EXECUTABLE NAMES readelf)
  38. if(READELF_EXECUTABLE)
  39. string(APPEND error_extra "; readelf \"\n")
  40. # Only dynamically linked ELF files are included
  41. # Extract only file name infront of ":"
  42. foreach(_FILE IN LISTS deb_install_files)
  43. if(_FILE MATCHES "ELF.*shared object")
  44. string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}")
  45. execute_process(COMMAND ${READELF_EXECUTABLE} -d "${CMAKE_MATCH_1}"
  46. WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
  47. RESULT_VARIABLE result
  48. OUTPUT_VARIABLE output
  49. ERROR_VARIABLE err_
  50. OUTPUT_STRIP_TRAILING_WHITESPACE)
  51. string(APPEND error_extra " name '${CMAKE_MATCH_1}'\n result '${result}'\n output '${output}'\n error '${err_}'\n")
  52. endif()
  53. endforeach()
  54. string(APPEND error_extra "\"")
  55. else()
  56. string(APPEND error_extra "; error readelf missing")
  57. endif()
  58. endif()
  59. set(${RESULT_VAR} "${error_extra}" PARENT_SCOPE)
  60. endfunction()
  61. function(verifyDebControl FILE PREFIX VERIFY_FILES)
  62. execute_process(COMMAND ${DPKG_EXECUTABLE} --control "${FILE}" control_${PREFIX}
  63. ERROR_VARIABLE err_)
  64. if(err_)
  65. message(FATAL_ERROR "Debian control verification failed for file: "
  66. "'${FILE}'; error output: '${err_}'")
  67. endif()
  68. foreach(FILE_ IN LISTS VERIFY_FILES)
  69. if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/control_${PREFIX}/${FILE_}")
  70. if(FILE_ STREQUAL "shlibs")
  71. getMissingShlibsErrorExtra("${FILE}" error_extra)
  72. endif()
  73. message(FATAL_ERROR "Expected Debian control file does not exist: '${FILE_}'${error_extra}")
  74. endif()
  75. file(READ "${CMAKE_CURRENT_BINARY_DIR}/control_${PREFIX}/${FILE_}" content_)
  76. if(NOT content_ MATCHES "${${PREFIX}_${FILE_}}")
  77. message(FATAL_ERROR "Unexpected content in for '${PREFIX}_${FILE_}'!"
  78. " Content: '${content_}'")
  79. endif()
  80. execute_process(COMMAND ls -l "${CMAKE_CURRENT_BINARY_DIR}/control_${PREFIX}/${FILE_}"
  81. OUTPUT_VARIABLE package_permissions_
  82. ERROR_VARIABLE package_permissions_error_
  83. OUTPUT_STRIP_TRAILING_WHITESPACE)
  84. if(NOT package_permissions_error_)
  85. if(NOT package_permissions_ MATCHES "${${PREFIX}_${FILE_}_permissions_regex}")
  86. message(FATAL_ERROR "Unexpected file permissions for ${PREFIX}_${FILE_}: '${package_permissions_}'!")
  87. endif()
  88. else()
  89. message(FATAL_ERROR "Listing file permissions failed (${package_permissions_error_})!")
  90. endif()
  91. endforeach()
  92. endfunction()
  93. function(getPackageInfo FILE RESULT_VAR)
  94. execute_process(COMMAND ${DPKG_EXECUTABLE} -I ${FILE}
  95. WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
  96. OUTPUT_VARIABLE package_info_
  97. ERROR_QUIET
  98. OUTPUT_STRIP_TRAILING_WHITESPACE)
  99. set(${RESULT_VAR} "${package_info_}" PARENT_SCOPE)
  100. endfunction()