@@ -16,9 +16,24 @@ add_subdirectory(util)
1616# Executable Targets
1717qt_add_executable (
1818 memento
19- "$<$<BOOL :${WIN32} >:${PROJECT_SOURCE_DIR} /res /appicon .rc >"
2019 main.cpp
2120)
21+ if (WIN32 )
22+ target_sources (
23+ memento
24+ PRIVATE "${PROJECT_SOURCE_DIR} /res/appicon.rc"
25+ )
26+ endif ()
27+ if (APPLE AND MEMENTO_BUNDLE)
28+ target_sources (
29+ memento
30+ PRIVATE ${PROJECT_SOURCE_DIR} /res/memento.icns
31+ )
32+ set_source_files_properties (
33+ "${PROJECT_SOURCE_DIR} /res/memento.icns"
34+ PROPERTIES MACOSX_PACKAGE_LOCATION "Resources"
35+ )
36+ endif ()
2237configure_file (
2338 qml/util/Features.qml.in
2439 "${PROJECT_SOURCE_DIR} /src/qml/util/Features.qml"
@@ -95,10 +110,13 @@ target_include_directories(memento PRIVATE ${MEMENTO_INCLUDE_DIRS})
95110target_compile_options (memento PRIVATE ${MEMENTO_COMPILER_FLAGS} )
96111set_target_properties (
97112 memento PROPERTIES
113+ OUTPUT_NAME "$<$<BOOL :${MEMENTO_BUNDLE} >:Memento >$<$<NOT :$<BOOL :${MEMENTO_BUNDLE} >>:memento >"
114+ MACOSX_BUNDLE_BUNDLE_NAME Memento
98115 MACOSX_BUNDLE_GUI_IDENTIFIER io.ripose_jp.Memento
99116 MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
100117 MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR}
101- MACOSX_BUNDLE TRUE
118+ MACOSX_BUNDLE ${MEMENTO_BUNDLE}
119+ MACOSX_BUNDLE_ICON_FILE memento.icns
102120 WIN32_EXECUTABLE ${MEMENTO_WIN32_EXECUTABLE}
103121)
104122target_link_libraries (
@@ -132,6 +150,104 @@ install(
132150 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
133151 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
134152)
153+ if (APPLE AND MEMENTO_BUNDLE)
154+ # BundleUtilities walks the actual linked dependency graph from the bundle.
155+ # These directories are only search hints so it can resolve @rpath entries
156+ # back to the exact libraries CMake found on this machine.
157+ set (
158+ MEMENTO_BUNDLE_LIBRARY_HINTS
159+ "${JsonC_LIBRARY} "
160+ "${libzip_LIBRARY} "
161+ "${mpv_LIBRARY} "
162+ )
163+ if (MEMENTO_MECAB_SUPPORT)
164+ list (APPEND MEMENTO_BUNDLE_LIBRARY_HINTS "${MeCab_LIBRARY} " )
165+ endif ()
166+ if (MEMENTO_OCR_SUPPORT AND MEMENTO_SYSTEM_MOCR)
167+ list (APPEND MEMENTO_BUNDLE_LIBRARY_HINTS "${mocr_LIBRARY} " "${mocrxx_LIBRARY} " )
168+ endif ()
169+ list (REMOVE_DUPLICATES MEMENTO_BUNDLE_LIBRARY_HINTS)
170+
171+ set (MEMENTO_BUNDLE_LIBRARY_DIRS "" )
172+ foreach (MEMENTO_BUNDLE_LIBRARY_HINT IN LISTS MEMENTO_BUNDLE_LIBRARY_HINTS)
173+ get_filename_component (
174+ MEMENTO_BUNDLE_LIBRARY_DIR "${MEMENTO_BUNDLE_LIBRARY_HINT} " DIRECTORY
175+ )
176+ list (APPEND MEMENTO_BUNDLE_LIBRARY_DIRS "${MEMENTO_BUNDLE_LIBRARY_DIR} " )
177+ endforeach ()
178+ list (REMOVE_DUPLICATES MEMENTO_BUNDLE_LIBRARY_DIRS)
179+
180+ # On macOS, use macdeployqt directly. It is the native Qt deployment tool
181+ # for bundles and, unlike the generic install helper, copies QML plugins
182+ # into their final bundle layout instead of relying on staging symlinks.
183+ find_program (MEMENTO_MACDEPLOYQT_EXECUTABLE macdeployqt REQUIRED )
184+ configure_file (
185+ "${PROJECT_SOURCE_DIR} /cmake/DeployQtMacOS.cmake.in"
186+ "${PROJECT_BINARY_DIR} /DeployQtMacOS.cmake"
187+ @ONLY
188+ )
189+ install (SCRIPT "${PROJECT_BINARY_DIR} /DeployQtMacOS.cmake" )
190+
191+ configure_file (
192+ "${PROJECT_SOURCE_DIR} /cmake/BundleMacOS.cmake.in"
193+ "${PROJECT_BINARY_DIR} /BundleMacOS.cmake"
194+ @ONLY
195+ )
196+ install (SCRIPT "${PROJECT_BINARY_DIR} /BundleMacOS.cmake" )
197+
198+ if (MEMENTO_MECAB_SUPPORT)
199+ configure_file (
200+ "${PROJECT_SOURCE_DIR} /cmake/CopyMeCabDictionaryMacOS.cmake.in"
201+ "${PROJECT_BINARY_DIR} /CopyMeCabDictionaryMacOS.cmake"
202+ @ONLY
203+ )
204+ install (SCRIPT "${PROJECT_BINARY_DIR} /CopyMeCabDictionaryMacOS.cmake" )
205+ endif ()
206+
207+ add_custom_target (
208+ memento_bundle
209+ COMMAND
210+ "${CMAKE_COMMAND} "
211+ -DMEMENTO_BUNDLE_PATH=$<TARGET_BUNDLE_DIR:memento>
212+ -P "${PROJECT_BINARY_DIR} /DeployQtMacOS.cmake"
213+ COMMAND
214+ "${CMAKE_COMMAND} "
215+ -DMEMENTO_BUNDLE_PATH=$<TARGET_BUNDLE_DIR:memento>
216+ -P "${PROJECT_BINARY_DIR} /BundleMacOS.cmake"
217+ DEPENDS memento
218+ COMMENT "Bundling dependencies into Memento.app"
219+ VERBATIM
220+ )
221+ if (MEMENTO_MECAB_SUPPORT)
222+ add_custom_command (
223+ TARGET memento_bundle
224+ POST_BUILD
225+ COMMAND
226+ "${CMAKE_COMMAND} "
227+ -DMEMENTO_BUNDLE_PATH=$<TARGET_BUNDLE_DIR:memento>
228+ -P "${PROJECT_BINARY_DIR} /CopyMeCabDictionaryMacOS.cmake"
229+ VERBATIM
230+ )
231+ endif ()
232+
233+ if (MEMENTO_CODESIGN_IDENTITY)
234+ configure_file (
235+ "${PROJECT_SOURCE_DIR} /cmake/SignMacOS.cmake.in"
236+ "${PROJECT_BINARY_DIR} /SignMacOS.cmake"
237+ @ONLY
238+ )
239+ install (SCRIPT "${PROJECT_BINARY_DIR} /SignMacOS.cmake" )
240+ add_custom_command (
241+ TARGET memento_bundle
242+ POST_BUILD
243+ COMMAND
244+ "${CMAKE_COMMAND} "
245+ -DMEMENTO_BUNDLE_PATH=$<TARGET_BUNDLE_DIR:memento>
246+ -P "${PROJECT_BINARY_DIR} /SignMacOS.cmake"
247+ VERBATIM
248+ )
249+ endif ()
250+ endif ()
135251if (UNIX AND NOT APPLE )
136252 install (
137253 FILES "${PROJECT_SOURCE_DIR} /res/memento.desktop"
0 commit comments