diff --git a/.gitignore b/.gitignore index 84c048a..70249de 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /build/ +/dist/ +/.flatpak-builder/ diff --git a/CMakeLists.txt b/CMakeLists.txt index ff8f2d2..2260068 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,8 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) +include(GNUInstallDirs) + find_package(Qt6 6.2 REQUIRED COMPONENTS Widgets Sql) qt_standard_project_setup() @@ -126,4 +128,46 @@ else() message(FATAL_ERROR "Vendored FreeRDP targets were not produced as expected.") endif() -install(TARGETS orbithub RUNTIME DESTINATION bin) +set_target_properties(orbithub PROPERTIES + BUILD_RPATH_USE_ORIGIN ON + INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/orbithub" + INSTALL_RPATH_USE_LINK_PATH ON +) + +install(TARGETS orbithub + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +set(ORBITHUB_PRIVATE_LIB_DESTINATION "${CMAKE_INSTALL_LIBDIR}/orbithub") +set(ORBITHUB_RUNTIME_TARGETS KodoTerm freerdp winpr) +if(TARGET freerdp-client) + list(APPEND ORBITHUB_RUNTIME_TARGETS freerdp-client) +endif() +foreach(runtime_target IN LISTS ORBITHUB_RUNTIME_TARGETS) + if(TARGET ${runtime_target}) + install(TARGETS ${runtime_target} + RUNTIME DESTINATION ${ORBITHUB_PRIVATE_LIB_DESTINATION} + LIBRARY DESTINATION ${ORBITHUB_PRIVATE_LIB_DESTINATION} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + endif() +endforeach() + +install(FILES + packaging/linux/io.orbithub.OrbitHub.desktop + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications +) +install(FILES + packaging/linux/io.orbithub.OrbitHub.svg + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps +) +install(FILES + packaging/linux/io.orbithub.OrbitHub.svg + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps + RENAME orbithub.svg +) +install(FILES + packaging/linux/io.orbithub.OrbitHub.metainfo.xml + DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo +) +install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DATADIR}/licenses/orbithub) diff --git a/README.md b/README.md index d3ed21e..b0826c6 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,18 @@ cmake --build build ./build/orbithub ``` +## Packaging (Linux) + +```bash +./packaging/linux/build-deb.sh +``` + +Optional Flatpak bundle: + +```bash +./packaging/flatpak/build-flatpak.sh +``` + ## Dependencies Core dependencies: diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 8975bf5..48e87d4 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -84,3 +84,24 @@ If you already have `Qt 6` from the Qt installer and do not want vcpkg Qt, you c - Build output executable: - Linux/macOS: `build/orbithub` - Windows: `build\\orbithub.exe` + +## Linux Packaging + +Build a Debian package (`.deb`) from the current Linux build: + +```bash +./packaging/linux/build-deb.sh +``` + +Output path: +- `dist/orbithub__.deb` + +Build a Flatpak bundle: + +```bash +sudo apt-get install -y flatpak flatpak-builder +./packaging/flatpak/build-flatpak.sh +``` + +Output path: +- `dist/flatpak/io.orbithub.OrbitHub.flatpak` diff --git a/packaging/flatpak/build-flatpak.sh b/packaging/flatpak/build-flatpak.sh new file mode 100755 index 0000000..8309a3f --- /dev/null +++ b/packaging/flatpak/build-flatpak.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +MANIFEST="$ROOT_DIR/packaging/flatpak/io.orbithub.OrbitHub.yml" +DIST_DIR="${1:-$ROOT_DIR/dist/flatpak}" +BUILD_DIR="$DIST_DIR/build" +REPO_DIR="$DIST_DIR/repo" +BUNDLE="$DIST_DIR/io.orbithub.OrbitHub.flatpak" + +if ! command -v flatpak-builder >/dev/null 2>&1; then + echo "flatpak-builder is required. Install it first:" >&2 + echo " sudo apt-get install -y flatpak-builder" >&2 + exit 1 +fi + +mkdir -p "$DIST_DIR" + +flatpak-builder \ + --force-clean \ + --repo="$REPO_DIR" \ + "$BUILD_DIR" \ + "$MANIFEST" + +flatpak build-bundle "$REPO_DIR" "$BUNDLE" io.orbithub.OrbitHub +echo "Created $BUNDLE" diff --git a/packaging/flatpak/io.orbithub.OrbitHub.yml b/packaging/flatpak/io.orbithub.OrbitHub.yml new file mode 100644 index 0000000..cfe3388 --- /dev/null +++ b/packaging/flatpak/io.orbithub.OrbitHub.yml @@ -0,0 +1,21 @@ +app-id: io.orbithub.OrbitHub +runtime: org.kde.Platform +runtime-version: "6.8" +sdk: org.kde.Sdk +command: orbithub +finish-args: + - --share=network + - --share=ipc + - --socket=fallback-x11 + - --socket=wayland + - --device=dri + - --filesystem=home +modules: + - name: orbithub + buildsystem: cmake-ninja + builddir: true + config-opts: + - -DCMAKE_BUILD_TYPE=Release + sources: + - type: dir + path: ../.. diff --git a/packaging/linux/build-deb.sh b/packaging/linux/build-deb.sh new file mode 100755 index 0000000..58d598a --- /dev/null +++ b/packaging/linux/build-deb.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +BUILD_DIR="${1:-$ROOT_DIR/build}" +DIST_DIR="${2:-$ROOT_DIR/dist}" +STAGE_DIR="$DIST_DIR/deb-staging" +PKG_ROOT="$STAGE_DIR/orbithub" + +if [[ ! -f "$BUILD_DIR/CMakeCache.txt" ]]; then + echo "Build directory not configured: $BUILD_DIR" >&2 + echo "Run: cmake -S \"$ROOT_DIR\" -B \"$BUILD_DIR\" -G Ninja" >&2 + exit 1 +fi + +mkdir -p "$DIST_DIR" +rm -rf "$STAGE_DIR" +mkdir -p "$PKG_ROOT/DEBIAN" + +VERSION="$(sed -n 's/^CMAKE_PROJECT_VERSION:STATIC=//p' "$BUILD_DIR/CMakeCache.txt" | head -n1)" +ARCH="$(dpkg --print-architecture)" + +if [[ -z "$VERSION" ]]; then + echo "Unable to determine project version from $BUILD_DIR/CMakeCache.txt" >&2 + exit 1 +fi + +cmake --build "$BUILD_DIR" -j +cmake --install "$BUILD_DIR" --prefix "$PKG_ROOT/usr" + +cat > "$PKG_ROOT/DEBIAN/control" < +Depends: libc6, libstdc++6, libqt6core6, libqt6gui6, libqt6widgets6, libqt6sql6, libssl3, zlib1g, openssh-client +Description: OrbitHub remote session manager + OrbitHub is a native desktop application for managing connection profiles + and opening SSH and RDP sessions in a tabbed interface. +EOF + +cat > "$PKG_ROOT/DEBIAN/postinst" <<'EOF' +#!/bin/sh +set -e +if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database -q /usr/share/applications || true +fi +if command -v gtk-update-icon-cache >/dev/null 2>&1; then + gtk-update-icon-cache -q /usr/share/icons/hicolor || true +fi +EOF +chmod 0755 "$PKG_ROOT/DEBIAN/postinst" + +cat > "$PKG_ROOT/DEBIAN/postrm" <<'EOF' +#!/bin/sh +set -e +if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database -q /usr/share/applications || true +fi +if command -v gtk-update-icon-cache >/dev/null 2>&1; then + gtk-update-icon-cache -q /usr/share/icons/hicolor || true +fi +EOF +chmod 0755 "$PKG_ROOT/DEBIAN/postrm" + +OUTPUT_DEB="$DIST_DIR/orbithub_${VERSION}_${ARCH}.deb" +fakeroot dpkg-deb --build "$PKG_ROOT" "$OUTPUT_DEB" >/dev/null +echo "Created $OUTPUT_DEB" diff --git a/packaging/linux/io.orbithub.OrbitHub.desktop b/packaging/linux/io.orbithub.OrbitHub.desktop new file mode 100644 index 0000000..dc20725 --- /dev/null +++ b/packaging/linux/io.orbithub.OrbitHub.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=OrbitHub +GenericName=Remote Session Manager +Comment=Manage SSH and RDP sessions in one native app +Exec=orbithub +Icon=orbithub +Terminal=false +Categories=Network;RemoteAccess;Utility; +StartupNotify=true diff --git a/packaging/linux/io.orbithub.OrbitHub.metainfo.xml b/packaging/linux/io.orbithub.OrbitHub.metainfo.xml new file mode 100644 index 0000000..8dda93a --- /dev/null +++ b/packaging/linux/io.orbithub.OrbitHub.metainfo.xml @@ -0,0 +1,16 @@ + + + io.orbithub.OrbitHub + OrbitHub + Unified remote session manager for SSH and RDP + MIT + MIT + +

OrbitHub is a native desktop app for organizing connection profiles and launching SSH and RDP sessions in one tabbed interface.

+
+ io.orbithub.OrbitHub.desktop + https://git.firebugit.com/ksmith/orbithub + + orbithub + +
diff --git a/packaging/linux/io.orbithub.OrbitHub.svg b/packaging/linux/io.orbithub.OrbitHub.svg new file mode 100644 index 0000000..1a0379b --- /dev/null +++ b/packaging/linux/io.orbithub.OrbitHub.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + +