# minimum macOS target support if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS MACOS_SUPPORT_MINIMUM) message(FATAL_ERROR "Targeting macOS versions before ${MACOS_SUPPORT_MINIMUM} is not supported for the macOS project, please adjust CMAKE_OSX_DEPLOYMENT_TARGET (${CMAKE_OSX_DEPLOYMENT_TARGET})") endif() find_program(ACTOOL_EXECUTABLE actool REQUIRED) find_program(CODESIGN_EXECUTABLE codesign REQUIRED) set(MAC_BUNDLE_NAME Transmission) add_compile_options( $<$:-fmodules> $<$:-fcxx-modules> # equivalent of XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES for this directory $<$:-fobjc-arc> # equivalent of XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES for this directory $<$:-fobjc-weak> # GNU extensions are good practice in Objective-C $<$:-Wno-gnu> # Our #warnings are good practice in IDE development, not in command-line compilation $<$>,$>:-Wno-\#warnings>) add_link_options( # equivalent of XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING YES for this directory $<$:-dead_strip>) add_subdirectory(QuickLookPlugin) add_subdirectory(VDKQueue) add_executable(${TR_NAME}-mac MACOSX_BUNDLE) target_sources(${TR_NAME}-mac PRIVATE AboutWindowController.h AboutWindowController.mm AddMagnetWindowController.h AddMagnetWindowController.mm AddWindowController.h AddWindowController.mm Badger.h Badger.mm BadgeView.h BadgeView.mm BlocklistDownloader.h BlocklistDownloader.mm BlocklistDownloaderViewController.h BlocklistDownloaderViewController.mm BlocklistScheduler.h BlocklistScheduler.mm BonjourController.h BonjourController.mm ButtonToolbarItem.h ButtonToolbarItem.mm CocoaCompatibility.h ColorTextField.h ColorTextField.mm Controller.h Controller.mm CreatorWindowController.h CreatorWindowController.mm DefaultAppHelper.h DefaultAppHelper.mm DragOverlayView.h DragOverlayView.mm DragOverlayWindow.h DragOverlayWindow.mm ExpandedPathToIconTransformer.h ExpandedPathToIconTransformer.mm ExpandedPathToPathTransformer.h ExpandedPathToPathTransformer.mm FileListNode.h FileListNode.mm FileNameCell.h FileNameCell.mm FileOutlineController.h FileOutlineController.mm FileOutlineView.h FileOutlineView.mm FilePriorityCell.h FilePriorityCell.mm FileRenameSheetController.h FileRenameSheetController.mm FilterBarController.h FilterBarController.mm FilterBarView.h FilterBarView.mm FilterButton.h FilterButton.mm GlobalOptionsPopoverViewController.h GlobalOptionsPopoverViewController.mm GroupCell.h GroupCell.mm GroupPopUpButtonCell.h GroupPopUpButtonCell.mm GroupsController.h GroupsController.mm GroupsPrefsController.h GroupsPrefsController.mm GroupToolbarItem.h GroupToolbarItem.mm InfoActivityViewController.h InfoActivityViewController.mm InfoFileViewController.h InfoFileViewController.mm InfoGeneralViewController.h InfoGeneralViewController.mm InfoOptionsViewController.h InfoOptionsViewController.mm InfoPeersViewController.h InfoPeersViewController.mm InfoTextField.h InfoTextField.mm InfoTrackersViewController.h InfoTrackersViewController.mm InfoViewController.h InfoWindowController.h InfoWindowController.mm main.mm MessageWindowController.h MessageWindowController.mm NSApplicationAdditions.h NSApplicationAdditions.mm NSDataAdditions.h NSDataAdditions.mm NSImageAdditions.h NSImageAdditions.mm NSKeyedUnarchiverAdditions.h NSKeyedUnarchiverAdditions.mm NSMutableArrayAdditions.h NSMutableArrayAdditions.mm NSStringAdditions.h NSStringAdditions.mm PeerProgressIndicatorCell.h PeerProgressIndicatorCell.mm PeerTableView.h PeerTableView.mm PiecesView.h PiecesView.mm PortChecker.h PortChecker.mm PredicateEditorRowTemplateAny.h PredicateEditorRowTemplateAny.mm PrefsController.h PrefsController.mm PrefsWindow.h PrefsWindow.mm PriorityPopUpButtonCell.h PriorityPopUpButtonCell.mm ProgressBarView.h ProgressBarView.mm ProgressGradients.h ProgressGradients.mm ShareToolbarItem.h ShareToolbarItem.mm ShareTorrentFileHelper.h ShareTorrentFileHelper.mm SmallTorrentCell.h SmallTorrentCell.mm SparkleProxy.mm StatsWindowController.h StatsWindowController.mm StatusBarController.h StatusBarController.mm StatusBarView.h StatusBarView.mm Toolbar.h Toolbar.mm Torrent.h Torrent.mm TorrentCell.h TorrentCell.mm TorrentCellActionButton.h TorrentCellActionButton.mm TorrentCellControlButton.h TorrentCellControlButton.mm TorrentCellRevealButton.h TorrentCellRevealButton.mm TorrentGroup.h TorrentGroup.mm TorrentTableView.h TorrentTableView.mm TrackerCell.h TrackerCell.mm TrackerNode.h TrackerNode.mm TrackerTableView.h TrackerTableView.mm URLSheetWindowController.h URLSheetWindowController.mm WebSeedTableView.h WebSeedTableView.mm) set(XIB_FILES AboutWindow.xib BlocklistStatusWindow.xib FileRenameSheetController.xib FilterBar.xib InfoFileView.xib InfoPeersView.xib InfoTrackersView.xib InfoWindow.xib MessageWindow.xib StatsWindow.xib StatusBar.xib URLSheetWindow.xib) set(RESOURCES Defaults.plist Credits.rtf sparkle_dsa_pub.pem ../COPYING Images/TransmissionDocument.icns) source_group(Resources FILES ${RESOURCES}) set_source_files_properties( ${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(IMAGESETS ActionHover Bandwidth CleanupTemplate CompleteCheck CreateLarge DownArrowGroupTemplate DownArrowTemplate DownloadBadge EllipsisTemplate FavIcon GearshapeTemplate Globe Groups InfoActivity InfoFiles InfoGeneral InfoOptions InfoPeers InfoTracker Lock Magnet PauseHover PauseOff PauseOn PinTemplate PriorityControlHigh PriorityControlLow PriorityControlNormal PriorityHighTemplate PriorityLowTemplate PriorityNormalTemplate Remote ResumeHover ResumeNoWaitHover ResumeNoWaitOff ResumeNoWaitOn ResumeOff ResumeOn RevealHover RevealOff RevealOn ToolbarCreateTemplate ToolbarFilterTemplate ToolbarInfoTemplate ToolbarOpenTemplate ToolbarOpenWebTemplate ToolbarPauseAllTemplate ToolbarPauseSelectedTemplate ToolbarRemoveTemplate ToolbarResumeAllTemplate ToolbarResumeSelectedTemplate TortoiseTemplate Transfers UpArrowGroupTemplate UpArrowTemplate UploadBadge YingYangGroupTemplate YingYangTemplate) set(APPICON_NAME AppIcon) set(IMAGE_ASSETS_DIR Images/Images.xcassets) set(APPICONSET_DIR "${IMAGE_ASSETS_DIR}/${APPICON_NAME}.appiconset") set(IMAGE_ASSETS ${IMAGE_ASSETS_DIR}/Contents.json ${APPICONSET_DIR}/Contents.json) foreach(IMG IN LISTS IMAGESETS) set(IMG_DIR "${IMAGE_ASSETS_DIR}/${IMG}.imageset") list(APPEND IMAGE_ASSETS ${IMG_DIR}/${IMG}.png ${IMG_DIR}/${IMG}@2x.png ${IMG_DIR}/Contents.json) endforeach() foreach(SIZE IN ITEMS 16 32 128 256 512) list(APPEND IMAGE_ASSETS ${APPICONSET_DIR}/icon_${SIZE}x${SIZE}.png ${APPICONSET_DIR}/icon_${SIZE}x${SIZE}@2x.png) endforeach() set(COMPILED_IMAGE_ASSETS "${CMAKE_CURRENT_BINARY_DIR}/${APPICON_NAME}.icns" "${CMAKE_CURRENT_BINARY_DIR}/Assets.car") add_custom_command( OUTPUT ${COMPILED_IMAGE_ASSETS} ${APPICON_NAME}.Info.plist COMMAND ${ACTOOL_EXECUTABLE} --compile "${CMAKE_CURRENT_BINARY_DIR}" --platform macosx --minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET} --app-icon ${APPICON_NAME} --output-partial-info-plist "${CMAKE_CURRENT_BINARY_DIR}/${APPICON_NAME}.Info.plist" ${IMAGE_ASSETS_DIR} DEPENDS ${IMAGE_ASSETS} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) source_group("Generated Files" FILES ${COMPILED_IMAGE_ASSETS} ${APPICON_NAME}.Info.plist) list(APPEND RESOURCES ${COMPILED_IMAGE_ASSETS}) set_source_files_properties( ${COMPILED_IMAGE_ASSETS} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(LINGUAS da de en es eu fr he hu it ja nl pl pt-BR pt-PT ru sv tr uk zh-CN zh-TW) if(ENABLE_NLS) set(ENABLED_LINGUAS ${LINGUAS}) else() set(ENABLED_LINGUAS en) endif() set(BASE_XIB_FILES AddMagnetWindow.xib AddWindow.xib Creator.xib GlobalOptionsPopover.xib GroupRules.xib InfoActivityView.xib InfoGeneralView.xib InfoOptionsView.xib MainMenu.xib PrefsWindow.xib) list(TRANSFORM BASE_XIB_FILES PREPEND Base.lproj/) set(LANG_STRINGS_FILES InfoPlist.strings Localizable.strings) foreach(LANG ${ENABLED_LINGUAS}) set(${LANG}_STRINGS_FILES) if(NOT LANG STREQUAL "en") foreach(F ${BASE_XIB_FILES}) get_filename_component(F_BASE "${F}" NAME_WE) list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F_BASE}.strings) endforeach() endif() foreach(F ${LANG_STRINGS_FILES}) list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) endforeach() source_group(Resources/${LANG}.lproj FILES ${${LANG}_STRINGS_FILES}) endforeach() foreach(LANG ${ENABLED_LINGUAS}) list(APPEND RESOURCES ${${LANG}_STRINGS_FILES}) set(STRINGS_FILES_RESOURCES_DIR Resources) if(NOT CMAKE_GENERATOR STREQUAL Xcode) string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj) endif() set_source_files_properties( ${${LANG}_STRINGS_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) endforeach() target_sources(${TR_NAME}-mac PRIVATE ${RESOURCES}) tr_target_xib_files(${TR_NAME}-mac ${XIB_FILES} ${BASE_XIB_FILES}) find_library(SPARKLE_FRAMEWORK Sparkle PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATHS) target_link_libraries(${TR_NAME}-mac PRIVATE ${TR_NAME} fmt::fmt-header-only vdkqueue ${SPARKLE_FRAMEWORK} "-framework AppKit" "-framework Carbon" "-framework Foundation" "-framework IOKit" "-framework Quartz" "-framework Security" "-weak_framework UserNotifications") if(NOT CMAKE_GENERATOR STREQUAL Xcode) add_custom_command( TARGET ${TR_NAME}-mac POST_BUILD COMMAND ${CODESIGN_EXECUTABLE} -s - $) endif() set_target_properties( ${TR_NAME}-mac PROPERTIES INSTALL_RPATH "@executable_path;@executable_path/../Frameworks" MACOSX_BUNDLE_GUI_IDENTIFIER "org.m0k.transmission" MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in OUTPUT_NAME ${MAC_BUNDLE_NAME}) install( TARGETS ${TR_NAME}-mac DESTINATION Applications) install( DIRECTORY TransmissionHelp DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources) tr_install_web(Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources) install(CODE "list(APPEND CMAKE_MODULE_PATH \"${PROJECT_SOURCE_DIR}/cmake\") include(TrMacros) include(GetPrerequisites) tr_fixup_bundle_item( \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\" \"Contents/MacOS/${MAC_BUNDLE_NAME}\" \"${CMAKE_CURRENT_SOURCE_DIR}\")")