Moved all packaging logic into CMake, fixed SemVer, and implemented pipeline caching

This commit is contained in:
Brenden Davidson 2025-06-28 16:00:46 -05:00
parent 6be0ea36a1
commit 8c65477bb3
No known key found for this signature in database
GPG Key ID: EBED6775E0A324BD
7 changed files with 65 additions and 106 deletions

View File

@ -11,6 +11,7 @@ env:
APT_CACHE_DIRS: | APT_CACHE_DIRS: |
/var/cache/apt/ /var/cache/apt/
/var/lib/apt/lists/ /var/lib/apt/lists/
BUILD_DIR: build
jobs: jobs:
build: build:
@ -81,9 +82,15 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Cache CMakeCache.txt
uses: actions/cache@v4
with:
path: ${{ env.BUILD_DIR }}/CMakeCache.txt
key: ${{ matrix.name }}-${{ hashFiles('**/CMakeLists.txt,**/*.cmake') }}
- name: Configure (CMake) - name: Configure (CMake)
run: | run: |
${{ matrix.cmake-wrapper || '' }} cmake -S . -B build -GNinja \ ${{ matrix.cmake-wrapper || '' }} cmake -S . -B ${{ env.BUILD_DIR }} -GNinja \
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
-DISLE_USE_DX5=${{ !!matrix.dx5 }} \ -DISLE_USE_DX5=${{ !!matrix.dx5 }} \
-DISLE_BUILD_CONFIG=${{ matrix.config }} \ -DISLE_BUILD_CONFIG=${{ matrix.config }} \
@ -93,11 +100,11 @@ jobs:
-Werror=dev -Werror=dev
- name: Build (CMake) - name: Build (CMake)
run: cmake --build build --verbose run: cmake --build ${{ env.BUILD_DIR }} --verbose
- name: Package (CPack) - name: Package (CPack)
run: | run: |
cd build cd ${{ env.BUILD_DIR }}
cpack . cpack .
- name: Upload Artifact - name: Upload Artifact
@ -105,7 +112,7 @@ jobs:
with: with:
name: Release-${{ matrix.name }} name: Release-${{ matrix.name }}
path: | path: |
build/dist/isle-* ${{ env.BUILD_DIR }}/dist/isle-*
flatpak: flatpak:
name: "Flatpak (${{ matrix.arch }})" name: "Flatpak (${{ matrix.arch }})"
@ -128,14 +135,17 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Configure Package Scripts - name: Cache .flatpak-builder
run: cmake -S . -B build_config -GNinja -DCONFIGURE_FLATPAK=ON uses: actions/cache@v4
with:
path: .flatpak-builder
key: ${{ matrix.arch }}-${{ hashFiles('packaging/linux/flatpak/isledecomp.manifest.json.in') }}
- name: Build Flatpak - name: Build Flatpak
uses: flatpak/flatpak-github-actions/flatpak-builder@v6 uses: flatpak/flatpak-github-actions/flatpak-builder@v6
with: with:
bundle: ${{ env.APP_ID }}.${{ matrix.arch }}.flatpak bundle: ${{ env.APP_ID }}.${{ matrix.arch }}.flatpak
manifest-path: build_config/packaging/linux/${{ env.APP_ID }}.json manifest-path: packaging/linux//flatpak${{ env.APP_ID }}.json
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
release: release:

View File

@ -2,15 +2,6 @@ cmake_minimum_required(VERSION 3.25...4.0 FATAL_ERROR)
project(isle LANGUAGES CXX C VERSION 0.1) project(isle LANGUAGES CXX C VERSION 0.1)
option(CONFIGURE_FLATPAK "Configure required Flatpak data and exit" OFF)
if (NOT DEFINED ENV{FLATPAK_DEST})
add_subdirectory(packaging EXCLUDE_FROM_ALL)
endif()
if (CONFIGURE_FLATPAK)
# Exit early since the remaining configuration will otherwise fail
return()
endif()
if (EMSCRIPTEN) if (EMSCRIPTEN)
add_compile_options(-pthread) add_compile_options(-pthread)
add_link_options(-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=2gb -sUSE_PTHREADS=1 -sPROXY_TO_PTHREAD=1 -sPTHREAD_POOL_SIZE_STRICT=0 -sFORCE_FILESYSTEM=1 -sWASMFS=1 -sEXIT_RUNTIME=1) add_link_options(-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=2gb -sUSE_PTHREADS=1 -sPROXY_TO_PTHREAD=1 -sPTHREAD_POOL_SIZE_STRICT=0 -sFORCE_FILESYSTEM=1 -sWASMFS=1 -sEXIT_RUNTIME=1)
@ -652,6 +643,8 @@ if(EMSCRIPTEN)
) )
endif() endif()
add_subdirectory(packaging)
set(CPACK_PACKAGE_DIRECTORY "dist") set(CPACK_PACKAGE_DIRECTORY "dist")
set(CPACK_PACKAGE_FILE_NAME "isle-${PROJECT_VERSION}-${ISLE_PACKAGE_NAME}-${CMAKE_SYSTEM_PROCESSOR}") set(CPACK_PACKAGE_FILE_NAME "isle-${PROJECT_VERSION}-${ISLE_PACKAGE_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
if(MSVC) if(MSVC)

View File

@ -2,19 +2,27 @@ set(APP_ID "org.legoisland.Isle")
set(APP_NAME "Isle Portable") set(APP_NAME "Isle Portable")
set(APP_SUMMARY "Portable version of the LEGO Island Decompilation Project") set(APP_SUMMARY "Portable version of the LEGO Island Decompilation Project")
set(APP_SPDX "LGPL-3.0-or-later") set(APP_SPDX "LGPL-3.0-or-later")
set(QT_VERSION 6.8)
string(TIMESTAMP BUILD_DATE UTC) string(TIMESTAMP BUILD_DATE UTC)
# The following will need to be refined if we wish to post actual releases to a repo such as Flathub
if(DEFINED ENV{GITHUB_RUN_ATTEMPT})
# Use the sequential run# of the current pipeline when running in GH Actions
set(SEMANTIC_VERSION "${PROJECT_VERSION}~build$ENV{GITHUB_RUN_ATTEMPT}")
else()
# Don't worry about the build number for local builds
set(SEMANTIC_VERSION "${PROJECT_VERSION}")
endif()
# Following block sourced from https://jonathanhamberg.com/post/cmake-embedding-git-hash/ # Following block sourced from https://jonathanhamberg.com/post/cmake-embedding-git-hash/
# Get the latest abbreviated commit hash of the working branch # Get the latest abbreviated commit hash of the working branch
execute_process( # execute_process(
COMMAND git log -1 --format=%h # COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} # WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
OUTPUT_VARIABLE GIT_HASH # OUTPUT_VARIABLE GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE # OUTPUT_STRIP_TRAILING_WHITESPACE
) # )
# TODO: Generate minfied SVG icon and PNG variants if(LINUX)
add_subdirectory(linux)
add_subdirectory(linux EXCLUDE_FROM_ALL) endif()

View File

@ -1,8 +1,13 @@
if(DEFINED ENV{FLATPAK_DEST})
set(METADATA_ROOT "$ENV{FLATPAK_DEST}/share")
else()
set(METADATA_ROOT "/usr/share")
endif()
# Injects the required variables into the Desktop and MetaInfo files # Injects the required variables into the Desktop and MetaInfo files
configure_file(isledecomp.desktop.in "${APP_ID}.desktop" @ONLY) configure_file(isledecomp.desktop.in "${APP_ID}.desktop" @ONLY)
configure_file(isledecomp.metainfo.xml.in "${APP_ID}.metainfo.xml" @ONLY) configure_file(isledecomp.metainfo.xml.in "${APP_ID}.metainfo.xml" @ONLY)
# Injects the required variables into the Flatpak manifest install(FILES "../icons/isle.svg" RENAME "${APP_ID}.svg" DESTINATION "${METADATA_ROOT}/icons/hicolor/scalable/apps/")
if (CONFIGURE_FLATPAK) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${APP_ID}.desktop" DESTINATION "${METADATA_ROOT}/applications/")
configure_file(flatpak/isledecomp.manifest.json.in "${APP_ID}.json" ESCAPE_QUOTES @ONLY) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${APP_ID}.metainfo.xml" DESTINATION "${METADATA_ROOT}/metainfo/")
endif()

View File

@ -1,35 +0,0 @@
#!/usr/bin/env bash
# Install Desktop assets and Icons in a Flatpak build environment
APP_ID=$1
# Set up main constants
ICON_INSTALL_DIR="${FLATPAK_DEST}/share/icons/hicolor"
ICON_SIZES=(64 128) # TODO: Figure out why only the first element is being checked
# Rename and install SVG icon
mv icons/isle.svg "icons/${APP_ID}.svg"
install -Dm0644 "icons/${APP_ID}.svg" -t "${ICON_INSTALL_DIR}/scalable/apps/"
# Rename and install optional PNG icons
for size in $ICON_SIZES; do
icon="icons/${APP_ID}_${size}.png"
if [ ! -f "${icon}" ]; then
# Skip if icon doesn't exist
echo "\"${icon}\" not present. Skipping..."
continue
fi
mv "${icon}" "icons/${APP_ID}.png"
icon="icons/${APP_ID}.png"
size_sq="${size}x${size}"
target_dir="${ICON_INSTALL_DIR}/${size_sq}/apps/"
mkdir -p "${target_dir}"
install -Dm0644 "${icon}" -t "${target_dir}"
echo "Installed ${size_sq} icon"
done
# Install Desktop file and AppStream data
install -Dm0644 "${APP_ID}.desktop" -t "${FLATPAK_DEST}/share/applications/"
install -Dm0644 "${APP_ID}.metainfo.xml" -t "${FLATPAK_DEST}/share/metainfo/"

View File

@ -1,9 +1,9 @@
{ {
"id": "@APP_ID@", "id": "org.legoisland.Isle",
"runtime": "org.kde.Platform", "runtime": "org.kde.Platform",
"sdk": "org.kde.Sdk", "sdk": "org.kde.Sdk",
"runtime-version": "@QT_VERSION@", "runtime-version": "6.8",
"command": "isle", "command": "isle",
@ -16,7 +16,8 @@
"--device=input", "--device=input",
"--filesystem=/run/media/:ro", "--filesystem=/run/media/:ro",
"--filesystem=/media/:ro", "--filesystem=/media/:ro",
"--filesystem=/mnt/:ro" "--filesystem=/mnt/:ro",
"--filesystem=home:ro"
], ],
"modules": [ "modules": [
@ -30,47 +31,52 @@
"sources": [ "sources": [
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/3rdparty", "path": "../../../3rdparty",
"dest": "3rdparty/" "dest": "3rdparty/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/cmake", "path": "../../../cmake",
"dest": "cmake/" "dest": "cmake/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/CMake", "path": "../../../CMake",
"dest": "CMake/" "dest": "CMake/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/CONFIG", "path": "../../../CONFIG",
"dest": "CONFIG/" "dest": "CONFIG/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/ISLE", "path": "../../../ISLE",
"dest": "ISLE/" "dest": "ISLE/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/LEGO1", "path": "../../../LEGO1",
"dest": "LEGO1/" "dest": "LEGO1/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/miniwin", "path": "../../../miniwin",
"dest": "miniwin/" "dest": "miniwin/"
}, },
{ {
"type": "dir", "type": "dir",
"path": "@PROJECT_SOURCE_DIR@/util", "path": "../../../packaging",
"dest": "packaging/"
},
{
"type": "dir",
"path": "../../../util",
"dest": "util/" "dest": "util/"
}, },
{ {
"type": "file", "type": "file",
"path": "@PROJECT_SOURCE_DIR@/CMakeLists.txt" "path": "../../../CMakeLists.txt"
} }
], ],
"build-options": { "build-options": {
@ -78,34 +84,6 @@
"--share=network" "--share=network"
] ]
} }
},
{
"name": "desktop-assets",
"buildsystem": "simple",
"sources": [
{
"type": "dir",
"dest": "icons",
"path": "@CMAKE_CURRENT_SOURCE_DIR@/../icons/"
},
{
"type": "file",
"path": "./@APP_ID@.desktop"
},
{
"type": "file",
"path": "./@APP_ID@.metainfo.xml"
},
{
"type": "file",
"path": "@CMAKE_CURRENT_SOURCE_DIR@/flatpak/install_desktop_assets.sh",
"dest-filename": "fp_install.sh"
}
],
"build-commands": [
"chmod +x ./fp_install.sh",
"./fp_install.sh @APP_ID@"
]
} }
] ]
} }

View File

@ -84,6 +84,6 @@
</keywords> </keywords>
<releases> <releases>
<release version="@PROJECT_VERSION@+@GIT_HASH@" type="development" date="@BUILD_DATE@"/> <release version="@SEMANTIC_VERSION@" type="development" date="@BUILD_DATE@"/>
</releases> </releases>
</component> </component>