Ver código fonte

:construction: building self contained macos bundle still WIP

Felix Bytow 1 ano atrás
pai
commit
f63b3a7c2e
5 arquivos alterados com 54 adições e 9 exclusões
  1. 31 5
      CMakeLists.txt
  2. 7 0
      FixupBundle.cmake.in
  3. 13 4
      cmake/ProjectHelpers.cmake
  4. 3 0
      game/AssetManager.cxx
  5. BIN
      snake-icon.icns

+ 31 - 5
CMakeLists.txt

@@ -31,8 +31,8 @@ FetchContent_Declare(
 FetchContent_MakeAvailable(SDL2 SDL2_image SDL2_ttf)
 
 configure_file(
-    ${CMAKE_CURRENT_SOURCE_DIR}/Config.hxx.in
-    ${CMAKE_CURRENT_BINARY_DIR}/Config.hxx
+    "${CMAKE_CURRENT_SOURCE_DIR}/Config.hxx.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/Config.hxx"
     @ONLY
 )
 
@@ -67,9 +67,11 @@ if (WIN32)
   target_sources(Snake PRIVATE windows-resources.rc)
 endif (WIN32)
 
-set_target_properties(Snake PROPERTIES
-    RUNTIME_OUTPUT_NAME snake
-)
+if ((NOT WIN32) AND (NOT APPLE))
+  set_target_properties(Snake PROPERTIES
+      RUNTIME_OUTPUT_NAME snake
+  )
+endif ()
 target_link_libraries(Snake PRIVATE
     SDL2::SDL2 SDL2::SDL2main
     SDL2_image::SDL2_image
@@ -98,6 +100,30 @@ elseif (APPLE)
   set_source_files_properties(${assets} PROPERTIES
       MACOSX_PACKAGE_LOCATION Resources/assets
   )
+  target_sources(Snake PRIVATE snake-icon.icns)
+  set_source_files_properties(snake-icon.icns PROPERTIES
+      MACOSX_PACKAGE_LOCATION Resources
+  )
+
+  get_dependency_location(SDL2_directory DEPENDENCY SDL2::SDL2)
+  string(REPLACE "Cellar/sdl2/2.28.5/lib" "lib" dependency_dir "${SDL2_directory}")
+
+  configure_file(
+      "${CMAKE_CURRENT_SOURCE_DIR}/FixupBundle.cmake.in"
+      "${CMAKE_CURRENT_BINARY_DIR}/FixupBundle.cmake"
+      @ONLY
+  )
+  install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/FixupBundle.cmake")
+
+  set(MACOSX_BUNDLE_BUNDLE_NAME "Snake")
+  set(MACOSX_BUNDLE_COPYRIGHT "Copyright © 2024, Felix Bytow <drako@drako.guru>")
+  set(MACOSX_BUNDLE_ICON_FILE snake-icon.icns)
+
+  #set(CPACK_GENERATOR DragNDrop)
+  #set(CPACK_PACKAGE_NAME "Snake")
+  #set(CPACK_PACKAGE_VENDOR "Draconic Bytes")
+  #set(CPACK_BUNDLE_APPLE_CERT_APP "Felix Bytow")
+  #include(CPack)
 else ()
   install(TARGETS Snake DESTINATION bin)
   install(FILES ${assets} DESTINATION share/snake/assets)

+ 7 - 0
FixupBundle.cmake.in

@@ -0,0 +1,7 @@
+include(BundleUtilities)
+
+set(dirs
+  "@dependency_dir@"
+)
+
+fixup_bundle("@CMAKE_CURRENT_BINARY_DIR@/Snake.app" "" "" "${dirs}")

+ 13 - 4
cmake/ProjectHelpers.cmake

@@ -1,14 +1,23 @@
 function(copy_dependency_dll)
   set(oneValueArgs TARGET DEPENDENCY)
-  cmake_parse_arguments(COPY_DEPENDENCY_DLL "" "${oneValueArgs}" "" ${ARGN})
+  cmake_parse_arguments(CDD "" "${oneValueArgs}" "" ${ARGN})
 
-  get_target_property(full_path ${COPY_DEPENDENCY_DLL_DEPENDENCY} IMPORTED_LOCATION)
+  get_target_property(full_path ${CDD_DEPENDENCY} IMPORTED_LOCATION)
   get_filename_component(lib_name "${full_path}" NAME)
 
   add_custom_command(
-      TARGET ${COPY_DEPENDENCY_DLL_TARGET}
+      TARGET ${CDD_TARGET}
       POST_BUILD
       COMMAND "${CMAKE_COMMAND}" -E copy "${full_path}" "${CMAKE_BINARY_DIR}/${lib_name}"
-      COMMENT "Copying ${COPY_DEPENDENCY_DLL_DEPENDENCY}..."
+      COMMENT "Copying ${CDD_DEPENDENCY}..."
   )
 endfunction()
+
+function(get_dependency_location result_var)
+  set(oneValueArgs DEPENDENCY)
+  cmake_parse_arguments(GDL "" "${oneValueArgs}" "" ${ARGN})
+
+  get_target_property(full_path ${GDL_DEPENDENCY} IMPORTED_LOCATION)
+  get_filename_component(${result_var} "${full_path}" DIRECTORY)
+  return(PROPAGATE ${result_var})
+endfunction()

+ 3 - 0
game/AssetManager.cxx

@@ -19,10 +19,12 @@ AssetManager::AssetManager(SDLRenderer& renderer)
   assert(instance_==nullptr);
 
   auto const current_path = fs::current_path();
+  auto const base_path = fs::path{SDL_GetBasePath()};
   std::array const asset_paths{
       current_path/"assets",
       current_path.parent_path()/"assets",
       current_path.parent_path()/"Resources"/"assets", // MacOS bundle
+      base_path/"assets", // MacOS bundle
       INSTALLED_ASSETS_PATH,
   };
 
@@ -30,6 +32,7 @@ AssetManager::AssetManager(SDLRenderer& renderer)
     return fs::exists(p);
   });
   if (it==std::end(asset_paths)) {
+    SDL_Log("Assets directory not found, current path: %s.", current_path.string().c_str());
     throw std::runtime_error("Assets directory not found.");
   }
 

BIN
snake-icon.icns