From 5f94ba5303044450e8c2a8e701f2cc106538e574 Mon Sep 17 00:00:00 2001 From: Qijia Liu Date: Tue, 3 Nov 2026 13:45:55 -0500 Subject: [PATCH] Generate the app icon from its SVG source --- .github/workflows/build.yml | 2 ++ assets/simstore.svg | 36 ++++++++++++++++++++++++++++++++++++ cmake/Info.plist.in | 2 ++ src/CMakeLists.txt | 26 ++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 assets/simstore.svg diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 825f948..beafee7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,6 +20,8 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false + - name: Install SVG renderer + run: brew install librsvg - name: Build run: | cmake --preset release diff --git a/assets/simstore.svg b/assets/simstore.svg new file mode 100644 index 0000000..dae79d1 --- /dev/null +++ b/assets/simstore.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmake/Info.plist.in b/cmake/Info.plist.in index 6b6f017..9bcfb3a 100644 --- a/cmake/Info.plist.in +++ b/cmake/Info.plist.in @@ -8,6 +8,8 @@ ${MACOSX_BUNDLE_EXECUTABLE_NAME} CFBundleIdentifier ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 297a9c4..340720e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,31 @@ add_executable(SimStore MACOSX_BUNDLE SimStoreApp.swift ContentView.swift ) + +find_program(RSVG_CONVERT_EXECUTABLE rsvg-convert REQUIRED) +find_program(ICONUTIL_EXECUTABLE iconutil REQUIRED) +set(ICONSET_DIR "${CMAKE_CURRENT_BINARY_DIR}/simstore.iconset") +set(ICON_FILE "${CMAKE_CURRENT_BINARY_DIR}/simstore.icns") +set(ICON_COMMANDS) +foreach(SIZE 16 32 128 256 512) + math(EXPR RETINA_SIZE "${SIZE} * 2") + list(APPEND ICON_COMMANDS + COMMAND "${RSVG_CONVERT_EXECUTABLE}" --width "${SIZE}" --height "${SIZE}" + --output "${ICONSET_DIR}/icon_${SIZE}x${SIZE}.png" "${PROJECT_SOURCE_DIR}/assets/simstore.svg" + COMMAND "${RSVG_CONVERT_EXECUTABLE}" --width "${RETINA_SIZE}" --height "${RETINA_SIZE}" + --output "${ICONSET_DIR}/icon_${SIZE}x${SIZE}@2x.png" "${PROJECT_SOURCE_DIR}/assets/simstore.svg" + ) +endforeach() +add_custom_command(OUTPUT "${ICON_FILE}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${ICONSET_DIR}" + ${ICON_COMMANDS} + COMMAND "${ICONUTIL_EXECUTABLE}" --convert icns --output "${ICON_FILE}" "${ICONSET_DIR}" + DEPENDS "${PROJECT_SOURCE_DIR}/assets/simstore.svg" + VERBATIM +) +set_source_files_properties("${ICON_FILE}" PROPERTIES MACOSX_PACKAGE_LOCATION Resources) +target_sources(SimStore PRIVATE "${ICON_FILE}") + # Preserve the SDK version in LC_BUILD_VERSION when invoking swiftc directly. target_link_options(SimStore PRIVATE "SHELL:-Xclang-linker -isysroot -Xclang-linker \"${CMAKE_OSX_SYSROOT}\"" @@ -10,6 +35,7 @@ set_target_properties(SimStore PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/cmake/Info.plist.in" MACOSX_BUNDLE_BUNDLE_NAME SimStore MACOSX_BUNDLE_GUI_IDENTIFIER io.simstore.SimStore + MACOSX_BUNDLE_ICON_FILE simstore.icns MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}" MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}" RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"