From b7934ae15507211640f6ac7797e8330b9db66a23 Mon Sep 17 00:00:00 2001 From: coco875 Date: Tue, 10 Dec 2024 23:51:47 +0100 Subject: [PATCH] configure the app image --- .gitignore | 3 +- CMakeLists.txt | 17 +++++- Starship.desktop | 9 ++++ cmake/configure-packaging.cmake | 29 +++++++++++ cmake/packaging.cmake | 89 ++++++++++++++++++++++++++++++++ logo.png | Bin 0 -> 12110 bytes 6 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 Starship.desktop create mode 100644 cmake/configure-packaging.cmake create mode 100644 cmake/packaging.cmake create mode 100644 logo.png diff --git a/.gitignore b/.gitignore index 197cd865..4f7d42c5 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,5 @@ Starship.log *.sav *.lib *.pdb -dumps/ \ No newline at end of file +dumps/ +_packages/* diff --git a/CMakeLists.txt b/CMakeLists.txt index e14777e0..b922be65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -555,4 +555,19 @@ add_custom_target( WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${TORCH_EXECUTABLE} pack port starship.otr COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/starship.otr" "${CMAKE_BINARY_DIR}/starship.otr" -) \ No newline at end of file +) + +set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES) +set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/Starship.desktop") +set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_ICON_FILE "${CMAKE_SOURCE_DIR}/logo.png") + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(CPACK_GENERATOR "External") +elseif(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") + set(CPACK_GENERATOR "ZIP") +elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(CPACK_GENERATOR "Bundle") +endif() + +set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/configure-packaging.cmake) +include(cmake/packaging.cmake) \ No newline at end of file diff --git a/Starship.desktop b/Starship.desktop new file mode 100644 index 00000000..566ac94f --- /dev/null +++ b/Starship.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Name=2SHIP +Exec=Starship +Terminal=false +Icon=logo +Type=Application +Categories=Game; +X-AppImage-Integrate=false \ No newline at end of file diff --git a/cmake/configure-packaging.cmake b/cmake/configure-packaging.cmake new file mode 100644 index 00000000..8d6869bd --- /dev/null +++ b/cmake/configure-packaging.cmake @@ -0,0 +1,29 @@ +set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) +set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 0) +set(CPACK_COMPONENTS_ALL "Starship") + +if (CPACK_GENERATOR STREQUAL "External") + list(APPEND CPACK_COMPONENTS_ALL "extractor" "appimage") +endif() + +if (CPACK_GENERATOR MATCHES "DEB|RPM") +# https://unix.stackexchange.com/a/11552/254512 +set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/ship/bin")#/${CMAKE_PROJECT_VERSION}") +set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 0) +elseif (CPACK_GENERATOR MATCHES "ZIP") +set(CPACK_PACKAGING_INSTALL_PREFIX "") +endif() + +if (CPACK_GENERATOR MATCHES "External") +set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) +SET(CPACK_MONOLITHIC_INSTALL 1) +set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/bin") +endif() + +if (CPACK_GENERATOR MATCHES "Bundle") + set(CPACK_BUNDLE_NAME "Starship") + set(CPACK_BUNDLE_PLIST "macosx/Info.plist") + set(CPACK_BUNDLE_ICON "macosx/Starship.icns") + set(CPACK_BUNDLE_STARTUP_COMMAND "macosx/Starship-macos.sh") + set(CPACK_BUNDLE_APPLE_CERT_APP "-") +endif() \ No newline at end of file diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake new file mode 100644 index 00000000..a32192d4 --- /dev/null +++ b/cmake/packaging.cmake @@ -0,0 +1,89 @@ +# these are cache variables, so they could be overwritten with -D, + +set(CPACK_PACKAGE_NAME "${PROJECT_NAME}" + CACHE STRING "The resulting package name" +) + +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simple C++ application" + CACHE STRING "Package description for the package metadata" +) +set(CPACK_PACKAGE_VENDOR "Some Company") + +set(CPACK_VERBATIM_VARIABLES YES) + +set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME}) +SET(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_SOURCE_DIR}/_packages") + +set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) +set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + +set(CPACK_PACKAGE_CONTACT "YOUR@E-MAIL.net") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "YOUR NAME") + +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md") +set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") +set(CPACK_SYSTEM_NAME ${LSB_RELEASE_CODENAME_SHORT}) +# package name for deb +# if set, then instead of some-application-0.9.2-Linux.deb +# you'll get some-application_0.9.2_amd64.deb (note the underscores too) +#set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) +execute_process(COMMAND dpkg --print-architecture OUTPUT_VARIABLE ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE) +set( CPACK_DEBIAN_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}-${ARCHITECTURE}.deb ) +# if you want every group to have its own package, +# although the same happens if this is not sent (so it defaults to ONE_PER_GROUP) +# and CPACK_DEB_COMPONENT_INSTALL is set to YES +set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)#ONE_PER_GROUP) +# without this you won't be able to pack only specified component +set(CPACK_DEB_COMPONENT_INSTALL YES) + +set(CPACK_EXTERNAL_ENABLE_STAGING YES) +set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${PROJECT_BINARY_DIR}/appimage-generate.cmake") + +file(GENERATE + OUTPUT "${PROJECT_BINARY_DIR}/appimage-generate.cmake" + CONTENT [[ +include(CMakePrintHelpers) +cmake_print_variables(CPACK_TEMPORARY_DIRECTORY) +cmake_print_variables(CPACK_TOPLEVEL_DIRECTORY) +cmake_print_variables(CPACK_PACKAGE_DIRECTORY) +cmake_print_variables(CPACK_PACKAGE_FILE_NAME) + +find_program(LINUXDEPLOY_EXECUTABLE + NAMES linuxdeploy linuxdeploy-x86_64.AppImage + PATHS ${CPACK_PACKAGE_DIRECTORY}/linuxdeploy) + +if (NOT LINUXDEPLOY_EXECUTABLE) + message(STATUS "Downloading linuxdeploy") + set(LINUXDEPLOY_EXECUTABLE ${CPACK_PACKAGE_DIRECTORY}/linuxdeploy/linuxdeploy) + file(DOWNLOAD + https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + ${LINUXDEPLOY_EXECUTABLE} + INACTIVITY_TIMEOUT 10 + LOG ${CPACK_PACKAGE_DIRECTORY}/linuxdeploy/download.log + STATUS LINUXDEPLOY_DOWNLOAD) + execute_process(COMMAND chmod +x ${LINUXDEPLOY_EXECUTABLE} COMMAND_ECHO STDOUT) +endif() + +execute_process( + COMMAND + NO_STRIP=true ${CMAKE_COMMAND} -E env + OUTPUT=${CPACK_PACKAGE_FILE_NAME}.appimage + VERSION=$,${CPACK_PACKAGE_VERSION},0.1.0> + ${LINUXDEPLOY_EXECUTABLE} + --appimage-extract-and-run + --appdir=${CPACK_TEMPORARY_DIRECTORY} + --executable=$ + $<$>:--desktop-file=$> + $<$>:--icon-file=$> + --output=appimage + --verbosity=2 +) +]]) + +endif() + +include(CPack) \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..56ddadf1a10f692e756aac3e2caa8ced823fef84 GIT binary patch literal 12110 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 literal 0 HcmV?d00001