|
| 1 | +macro(InstallerLinux TARGET) |
| 2 | + include(GNUInstallDirs) |
| 3 | + |
| 4 | + if (EXISTS ${TARGET_FILE}) |
| 5 | + # Podstawowe pliki licencji |
| 6 | + install(FILES "${PROJECT_SOURCE_DIR}/LICENSE" DESTINATION "${CMAKE_INSTALL_DATADIR}/hyperhdr" COMPONENT "HyperHDR") |
| 7 | + install(FILES "${PROJECT_SOURCE_DIR}/3RD_PARTY_LICENSES" DESTINATION "${CMAKE_INSTALL_DATADIR}/hyperhdr" COMPONENT "HyperHDR") |
| 8 | + |
| 9 | + # Binarka główna |
| 10 | + install(TARGETS hyperhdr DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT "HyperHDR") |
| 11 | + |
| 12 | + # Plik serwisu (jako szablony dla postinst) |
| 13 | + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/service/hyperhdr@.service DESTINATION "/usr/lib/systemd/system" COMPONENT "HyperHDR") |
| 14 | + |
| 15 | + # Ikony i plik .desktop (Zgodne z FHS, np. /usr/share/applications i /usr/share/icons) |
| 16 | + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr-icon-32px.png |
| 17 | + DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/32x32/apps" RENAME "hyperhdr.png" COMPONENT "HyperHDR") |
| 18 | + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr_128.png |
| 19 | + DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps" RENAME "hyperhdr.png" COMPONENT "HyperHDR") |
| 20 | + install(FILES ${CMAKE_SOURCE_DIR}/cmake/linux/resources/hyperhdr.desktop |
| 21 | + DESTINATION "${CMAKE_INSTALL_DATADIR}/applications" COMPONENT "HyperHDR") |
| 22 | + |
| 23 | + # Web resources |
| 24 | + if (NOT USE_EMBEDDED_WEB_RESOURCES) |
| 25 | + if (NOT TARGET webserver-resources) |
| 26 | + message(FATAL_ERROR "Could not find compiled resources for the web server. Consider using USE_EMBEDDED_WEB_RESOURCES option" ) |
| 27 | + endif() |
| 28 | + get_target_property(webserver-resources-path webserver-resources OUTPUT_FILE) |
| 29 | + install(FILES ${webserver-resources-path} DESTINATION "${CMAKE_INSTALL_DATADIR}/hyperhdr/web" COMPONENT "HyperHDR" ) |
| 30 | + endif() |
| 31 | + |
| 32 | + # Optymalizacja: Pętla dla naszych wewnętrznych bibliotek |
| 33 | + set(CUSTOM_INTERNAL_LIBS smart-x11 smart-pipewire utils-image utils-zstd systray-widget ) |
| 34 | + foreach(custom_lib ${CUSTOM_INTERNAL_LIBS}) |
| 35 | + if (TARGET ${custom_lib}) |
| 36 | + install(TARGETS ${custom_lib} DESTINATION "${CMAKE_INSTALL_LIBDIR}/hyperhdr" COMPONENT "HyperHDR") |
| 37 | + endif() |
| 38 | + endforeach() |
| 39 | + |
| 40 | + # Pakowanie opcjonalnych zależności |
| 41 | + if (ENABLE_DEPENDENCY_PACKAGING) |
| 42 | + set(PREREQUISITE_LIBS "") |
| 43 | + |
| 44 | + # OpenSSL |
| 45 | + find_package(OpenSSL) |
| 46 | + if(OPENSSL_FOUND) |
| 47 | + foreach(openssl_lib ${OPENSSL_LIBRARIES}) |
| 48 | + include(GetPrerequisites) |
| 49 | + gp_append_unique(PREREQUISITE_LIBS ${openssl_lib}) |
| 50 | + get_filename_component(file_canonical ${openssl_lib} REALPATH) |
| 51 | + gp_append_unique(PREREQUISITE_LIBS ${file_canonical}) |
| 52 | + |
| 53 | + get_filename_component(rootLib ${openssl_lib} NAME) |
| 54 | + get_filename_component(rootPath ${openssl_lib} DIRECTORY) |
| 55 | + file(GLOB resultSSL "${rootPath}/${rootLib}*") |
| 56 | + foreach(targetlib ${resultSSL}) |
| 57 | + gp_append_unique(PREREQUISITE_LIBS ${targetlib}) |
| 58 | + endforeach() |
| 59 | + endforeach() |
| 60 | + else() |
| 61 | + message( WARNING "OpenSSL NOT found (https instance will not work)") |
| 62 | + endif() |
| 63 | + |
| 64 | + # Detect the Qt5 plugin directory |
| 65 | + if ( Qt5Core_FOUND ) |
| 66 | + get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) |
| 67 | + execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_PLUGINS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 68 | + elseif ( TARGET Qt${QT_VERSION_MAJOR}::qmake ) |
| 69 | + get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) |
| 70 | + execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_PLUGINS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 71 | + endif() |
| 72 | + |
| 73 | + # CEC lib |
| 74 | + if (ENABLE_CEC) |
| 75 | + find_library(XRANDR_LIBRARY NAMES Xrandr libXrandr libXrandr.so.2) |
| 76 | + if (XRANDR_LIBRARY) |
| 77 | + get_filename_component(resolvedXrandr ${XRANDR_LIBRARY} ABSOLUTE) |
| 78 | + list (APPEND cecFiles ${resolvedXrandr}) |
| 79 | + endif() |
| 80 | + |
| 81 | + foreach(resolved_file_in ${CEC_LIBRARIES}) |
| 82 | + unset(LIBCEC CACHE) |
| 83 | + find_library(LIBCEC NAMES ${resolved_file_in}) |
| 84 | + if (LIBCEC) |
| 85 | + get_filename_component(resolvedCec ${LIBCEC} ABSOLUTE) |
| 86 | + list (APPEND cecFiles ${resolvedCec}) |
| 87 | + endif() |
| 88 | + endforeach() |
| 89 | + |
| 90 | + foreach(cecFile ${cecFiles}) |
| 91 | + FILE(GLOB foundCec "${cecFile}*") |
| 92 | + foreach(installCec ${foundCec}) |
| 93 | + include(GetPrerequisites) |
| 94 | + gp_append_unique(PREREQUISITE_LIBS ${installCec}) |
| 95 | + endforeach() |
| 96 | + endforeach() |
| 97 | + endif() |
| 98 | + |
| 99 | + # Install CODE dla zależności |
| 100 | + install(CODE "set(TARGET_FILE \"${TARGET_FILE}\")" COMPONENT "HyperHDR") |
| 101 | + install(CODE "set(PREREQUISITE_LIBS \"${PREREQUISITE_LIBS}\")" COMPONENT "HyperHDR") |
| 102 | + install(CODE "set(QT_PLUGINS_DIR \"${QT_PLUGINS_DIR}\")" COMPONENT "HyperHDR") |
| 103 | + install(CODE "set(DEST_DIR \"${CMAKE_INSTALL_LIBDIR}/hyperhdr/external\")" COMPONENT "HyperHDR") |
| 104 | + |
| 105 | + install(CODE [[ |
| 106 | + set(SYSTEM_LIBS_SKIP |
| 107 | + "libc" "libglib-2" "libsystemd0" "libdl" "libexpat" "libfontconfig" "libgcc_s" |
| 108 | + "libm" "libpthread" "librt" "libstdc++" "libudev" "libz.so" "libxrender1" |
| 109 | + "libxi6" "libxext6" "libx11-xcb1" "libsm" "libice6" "libdrm2" "libxkbcommon0" |
| 110 | + "libwacom2" "libmtdev1" "libinput10" "libgudev-1.0-0" "libffi6" "libevdev2" |
| 111 | + "libuuid1" "libselinux1" "libmount1" "libblkid1" "libwayland" "libxcb-icccm4" |
| 112 | + "libxcb-image0" "libxcb-keysyms1" "libxcb-randr0" "libxcb-render-util0" |
| 113 | + "libxcb-render0" "libxcb-shape0" "libxcb-shm0" "libxcb-sync1" "libxcb-util0" |
| 114 | + "libxcb-xfixes0" "libxcb-xkb1" "libxkbcommon-x11-0" "ld-" "libasound" |
| 115 | + "libblkid" "libffi" "libgio-2" "libgmodule-2" "libgobject-2" "libidn2" |
| 116 | + "libnghttp" "libsystemd" "libpsl" "libunistring" "libssh" "libselinux" |
| 117 | + "libevent-2" "libldap" "libutils" |
| 118 | + ) |
| 119 | +
|
| 120 | + include(GetPrerequisites) |
| 121 | + if (NOT CMAKE_CROSSCOMPILING) |
| 122 | + file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR DEPENDENCIES EXECUTABLES ${TARGET_FILE}) |
| 123 | +
|
| 124 | + file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR SYS_DEPENDENCIES EXECUTABLES $<TARGET_FILE:systray-widget>) |
| 125 | + foreach(systrayLib ${SYS_DEPENDENCIES}) |
| 126 | + string(FIND ${systrayLib} "libayatana" _sysindex) |
| 127 | + string(FIND ${systrayLib} "libdbusmenu" _sysDBusindex) |
| 128 | + if (${_sysindex} GREATER -1 OR ${_sysDBusindex} GREATER -1) |
| 129 | + list(APPEND DEPENDENCIES ${systrayLib}) |
| 130 | + endif() |
| 131 | + endforeach() |
| 132 | + endif() |
| 133 | +
|
| 134 | + # Kopiowanie pluginów QT do lib/hyperhdr/external/plugins |
| 135 | + foreach(PLUGIN "tls") |
| 136 | + if(EXISTS ${QT_PLUGINS_DIR}/${PLUGIN}) |
| 137 | + file(GLOB files "${QT_PLUGINS_DIR}/${PLUGIN}/*openssl*") |
| 138 | + foreach(file ${files}) |
| 139 | + file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR QT_DEPENDENCIES EXECUTABLES ${file}) |
| 140 | + list(APPEND DEPENDENCIES ${QT_DEPENDENCIES}) |
| 141 | + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/${DEST_DIR}/plugins/${PLUGIN}" TYPE SHARED_LIBRARY FILES ${file}) |
| 142 | + message("Installing QT plugin: ${file} to ${CMAKE_INSTALL_PREFIX}/${DEST_DIR}/plugins/${PLUGIN}") |
| 143 | + endforeach() |
| 144 | + endif() |
| 145 | + endforeach() |
| 146 | +
|
| 147 | + foreach(DEPENDENCY ${DEPENDENCIES}) |
| 148 | + get_filename_component(resolved ${DEPENDENCY} NAME_WE) |
| 149 | + |
| 150 | + set(SKIP_LIB FALSE) |
| 151 | + foreach(myitem ${SYSTEM_LIBS_SKIP}) |
| 152 | + string(FIND ${resolved} ${myitem} _index) |
| 153 | + if (${_index} EQUAL 0) |
| 154 | + set(SKIP_LIB TRUE) |
| 155 | + break() |
| 156 | + endif() |
| 157 | + endforeach() |
| 158 | + |
| 159 | + if (SKIP_LIB) |
| 160 | + continue() |
| 161 | + else() |
| 162 | + gp_resolve_item("${TARGET_FILE}" "${DEPENDENCY}" "" "" resolved_file) |
| 163 | + get_filename_component(resolved_file ${resolved_file} ABSOLUTE) |
| 164 | + gp_append_unique(PREREQUISITE_LIBS ${resolved_file}) |
| 165 | + get_filename_component(file_canonical ${resolved_file} REALPATH) |
| 166 | + gp_append_unique(PREREQUISITE_LIBS ${file_canonical}) |
| 167 | + endif() |
| 168 | + endforeach() |
| 169 | +
|
| 170 | + # Kopiowanie i ew. patchowanie RPATH z zachowaniem nowych ścieżek FHS |
| 171 | + foreach(PREREQUISITE_LIB IN LISTS PREREQUISITE_LIBS) |
| 172 | + # 1. Instalacja pliku bezpośrednio do katalogu docelowego |
| 173 | + file(INSTALL FILES "${PREREQUISITE_LIB}" DESTINATION "${CMAKE_INSTALL_PREFIX}/${DEST_DIR}" TYPE SHARED_LIBRARY) |
| 174 | + message("Installing: ${PREREQUISITE_LIB} to ${CMAKE_INSTALL_PREFIX}/${DEST_DIR}") |
| 175 | + # 2. Sprawdzenie, czy plik nie jest dowiązaniem i czy to libproxy / libpxbackend |
| 176 | + if(NOT IS_SYMLINK "${PREREQUISITE_LIB}" AND "${PREREQUISITE_LIB}" MATCHES "libproxy|libpxbackend") |
| 177 | + get_filename_component(FILENAME "${PREREQUISITE_LIB}" NAME) |
| 178 | + set(INSTALLED_FILE "${CMAKE_INSTALL_PREFIX}/${DEST_DIR}/${FILENAME}") |
| 179 | + message("Patching RPATH: ${INSTALLED_FILE}") |
| 180 | + execute_process(COMMAND chrpath -d "${INSTALLED_FILE}" OUTPUT_VARIABLE outputResult) |
| 181 | + endif() |
| 182 | + endforeach() |
| 183 | + ]] COMPONENT "HyperHDR") |
| 184 | + endif() |
| 185 | + else() |
| 186 | + add_custom_command( |
| 187 | + TARGET ${TARGET} POST_BUILD |
| 188 | + COMMAND "${CMAKE_COMMAND}" "-DTARGET_FILE=$<TARGET_FILE:${TARGET}>" |
| 189 | + ARGS ${CMAKE_SOURCE_DIR} |
| 190 | + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} |
| 191 | + VERBATIM |
| 192 | + ) |
| 193 | + endif() |
| 194 | +endmacro() |
0 commit comments