Skip to content

Commit 6af2daa

Browse files
committed
Implement FHS
1 parent d109416 commit 6af2daa

26 files changed

Lines changed: 868 additions & 1447 deletions

BUILDING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ BUILD_ARCHIVES - false|true, cpack will build ZIP package
158158
USE_STANDARD_INSTALLER_NAME - false|true, use standard Linux package naming
159159
USE_CCACHE - false|true, use ccache if available
160160
RESET_CACHE - false|true, reset ccache storage
161+
INCLUDE_DEP_LIB - false|true, bundle dependency libs into the Linux installer
161162

162163
Example of usage:
163164
PLATFORM=rpi DISTRO_NAME=debian DISTRO_VERSION=bullseye ARCHITECTURE=arm64 ./build.sh
@@ -224,3 +225,4 @@ Use -D prefix when configuring the build.
224225
* USE_SYSTEM_STB_LIBS = ON | OFF, prefer system stb libs
225226
* USE_STATIC_QT_PLUGINS = ON | OFF, embed static QT-plugins into the app
226227
* USE_STANDARD_INSTALLER_NAME = ON | OFF, use standard Linux package naming
228+
* ENABLE_DEPENDENCY_PACKAGING = ON | OFF, bundle dependency libs into the Linux installer

CMakeLists.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,21 @@ if(UNIX AND NOT APPLE)
554554
colorMe("USE_STANDARD_INSTALLER_NAME = " ${USE_STANDARD_INSTALLER_NAME})
555555

556556
colorMe("HYPERHDR_HAVE_DBUS = " ${HYPERHDR_HAVE_DBUS})
557+
558+
include(GNUInstallDirs)
559+
560+
option(ENABLE_DEPENDENCY_PACKAGING "Bundle dependency libraries" OFF)
561+
colorMe("ENABLE_DEPENDENCY_PACKAGING = " ${ENABLE_DEPENDENCY_PACKAGING})
562+
563+
if(ENABLE_DEPENDENCY_PACKAGING)
564+
SET ( PORTABLE_LIB_FOLDER "../${CMAKE_INSTALL_LIBDIR}/hyperhdr" )
565+
colorMe("PORTABLE_LIB_FOLDER = " ${PORTABLE_LIB_FOLDER})
566+
endif()
567+
568+
if (NOT USE_EMBEDDED_WEB_RESOURCES)
569+
file(RELATIVE_PATH WEB_REL_PATH "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_DATADIR}/hyperhdr/web")
570+
SET( WEB_RESOURCES_FOLDER "${WEB_REL_PATH}")
571+
endif()
557572
else()
558573
SET ( USE_STANDARD_INSTALLER_NAME OFF )
559574
endif()

HyperhdrConfig.h.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@
8888

8989
#cmakedefine HYPERHDR_HAVE_DBUS
9090

91+
#cmakedefine PORTABLE_LIB_FOLDER "@PORTABLE_LIB_FOLDER@"
92+
93+
#cmakedefine WEB_RESOURCES_FOLDER "@WEB_RESOURCES_FOLDER@"
94+
9195
// the hyperhdr build id string
9296
#define HYPERHDR_BUILD_ID "${HYPERHDR_BUILD_ID}"
9397
#define HYPERHDR_GIT_REMOTE "${HYPERHDR_GIT_REMOTE}"

build.sh

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ print_manual()
3434
printf "\n\n${GreenColor}Optional environmental options:${ColorReset}"
3535
printf "\n${CyanColor}BUILD_TYPE${ColorReset} - Release|Debug, default is Release version"
3636
printf "\n${CyanColor}BUILD_ARCHIVES${ColorReset} - false|true, cpack will build ZIP package"
37+
printf "\n${CyanColor}INCLUDE_DEP_LIB${ColorReset} - false|true, include dependent libraries in the installer"
3738
printf "\n${CyanColor}USE_STANDARD_INSTALLER_NAME${ColorReset} - false|true, use standard Linux package naming"
3839
printf "\n${CyanColor}USE_CCACHE${ColorReset} - false|true, use ccache if available"
3940
printf "\n${CyanColor}RESET_CACHE${ColorReset} - false|true, reset ccache storage"
@@ -74,6 +75,7 @@ fi
7475
[ -z "${USE_CCACHE}" ] && USE_CCACHE=true
7576
[ -z "${RESET_CACHE}" ] && RESET_CACHE=false
7677
[ -z "${BUILD_ARCHIVES}" ] && BUILD_ARCHIVES=true
78+
[ -z "${INCLUDE_DEP_LIB}" ] && INCLUDE_DEP_LIB=true
7779

7880

7981
printf "\n${GreenColor}PLATFORM${ColorReset} = ${YellowColor}${PLATFORM}${ColorReset}"
@@ -84,6 +86,7 @@ printf "\n${GreenColor}BUILD_TYPE${ColorReset} = ${YellowColor}${BUILD_TYPE}
8486
printf "\n${GreenColor}BUILD_ARCHIVES${ColorReset} = ${YellowColor}${BUILD_ARCHIVES}${ColorReset}"
8587
printf "\n${GreenColor}USE_CCACHE${ColorReset} = ${YellowColor}${USE_CCACHE}${ColorReset}"
8688
printf "\n${GreenColor}RESET_CACHE${ColorReset} = ${YellowColor}${RESET_CACHE}${ColorReset}"
89+
printf "\n${GreenColor}INCLUDE_DEP_LIB{ColorReset} = ${YellowColor}${INCLUDE_DEP_LIB}${ColorReset}"
8790
printf "\n${GreenColor}USE_STANDARD_INSTALLER_NAME${ColorReset} = ${YellowColor}${USE_STANDARD_INSTALLER_NAME}${ColorReset}"
8891
printf "\n\n"
8992

@@ -103,6 +106,14 @@ else
103106
ARCHIVE_OPTION=" ${ARCHIVE_OPTION} -DUSE_STANDARD_INSTALLER_NAME=OFF"
104107
fi
105108

109+
if [ ${INCLUDE_DEP_LIB} = true ]; then
110+
echo "Include dependent libraries in the installer"
111+
ARCHIVE_OPTION=" ${ARCHIVE_OPTION} -DENABLE_DEPENDENCY_PACKAGING=ON"
112+
else
113+
echo "Do not include dependent libraries in the installer"
114+
ARCHIVE_OPTION=" ${ARCHIVE_OPTION} -DENABLE_DEPENDENCY_PACKAGING=OFF"
115+
fi
116+
106117
echo "Platform: ${PLATFORM}, build type: ${BUILD_TYPE}, CI_NAME: $CI_NAME, docker: ${ARCHITECTURE}/${DISTRO_NAME}:${DISTRO_VERSION}, archive options: ${ARCHIVE_OPTION}, use ccache: ${USE_CCACHE}, reset ccache: ${RESET_CACHE}"
107118

108119
# clear ccache if neccesery
@@ -207,7 +218,15 @@ elif [[ "$CI_NAME" == 'linux' ]]; then
207218
chmod -R a+rw ${CI_BUILD_DIR}/deploy
208219
versionFile=`cat version`
209220
executeCommand="echo \"GLIBC version: \$(ldd --version | head -1 | sed 's/[^0-9]*\([.0-9]*\)$/\1/')\""
210-
executeCommand=${executeCommand}" && sed -i \"s/{GLIBC_VERSION}/\$(ldd --version | head -1 | sed 's/[^0-9]*\([.0-9]*\)$/\1/')/\" PKGBUILD && makepkg"
221+
executeCommand=${executeCommand}" && sed -i \"s/{GLIBC_VERSION}/\$(ldd --version | head -1 | sed 's/[^0-9]*\([.0-9]*\)$/\1/')/\" PKGBUILD"
222+
223+
if [ ${INCLUDE_DEP_LIB} = true ]; then
224+
executeCommand=${executeCommand}" && makepkg"
225+
else
226+
executeCommand=${executeCommand}" && sed -i 's|) #<depends>| alsa-lib flatbuffers libftdi gtk3 hicolor-icon-theme libayatana-appindicator libjpeg-turbo libusb libx11 libglvnd mesa openssl pipewire qt6-base qt6-serialport systemd-libs wayland xz zstd)|' PKGBUILD"
227+
executeCommand=${executeCommand}" && makepkg -d"
228+
fi
229+
211230
echo ${executeCommand}
212231
sed -i "s/{VERSION}/${versionFile}/" PKGBUILD
213232
sed -i "s/{BUILD_OPTION}/${BUILD_OPTION}/" PKGBUILD

cmake/installer_linux.cmake

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
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

Comments
 (0)