From 43acd7e3e4abac6bfa3977cfbd2be53edd189bd5 Mon Sep 17 00:00:00 2001 From: Mike Gelfand Date: Sat, 12 Nov 2022 21:01:57 +0100 Subject: [PATCH] Remove Xcode project in favor of CMake (#4147) * Compile images into an assets catalog * Optionally sign resulting Mac bundle * Move 3rd-party/utility/test targets to their own folders * Enable ARC via compile options unconditionally * Install base and localized resources into correct directory This seems like a Xcode quirk: if subdirectory containing the resource file matches the destination directory name (and probably if there's more than one resource file being installed there), the resulting folder structure then contains an extra subdirectory, i.e. Resources/dirname/dirname/resname. * Group source files for better structure in IDEs (Xcode, VS) * Remove Xcode project Using Xcode is still possible via "Xcode" CMake generator. * Use ad-hoc signature if one is not specified * Always use ad-hoc signature on link, leave proper signing to CPack * Install localized resources into correct directory (QL plugin) * Don't include CTest (we don't use additional targets it provides) * Revert "Remove Xcode project" This reverts commit dc069f654f10d5bc2f42652237c0b3fa411cb142. --- CMakeLists.txt | 2 +- cmake/TrMacros.cmake | 2 +- gtk/CMakeLists.txt | 2 + macosx/CMakeLists.txt | 155 +++++++++++++------------- macosx/Info.plist.in | 4 +- macosx/QuickLookPlugin/CMakeLists.txt | 8 +- qt/CMakeLists.txt | 14 ++- tests/gtest/CMakeLists.txt | 2 + tests/libtransmission/CMakeLists.txt | 4 + 9 files changed, 108 insertions(+), 85 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 643716132..0802e399b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -713,7 +713,6 @@ if(RUN_CLANG_TIDY) endif() if(ENABLE_TESTS) - include(CTest) enable_testing() add_subdirectory(tests) endif() @@ -793,6 +792,7 @@ if(GIT_FOUND) COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) + set_property(TARGET check-format format PROPERTY FOLDER "utility") endif() unset(TR_GIT_ROOT) endif() diff --git a/cmake/TrMacros.cmake b/cmake/TrMacros.cmake index 2e7d41831..a5e201f32 100644 --- a/cmake/TrMacros.cmake +++ b/cmake/TrMacros.cmake @@ -117,7 +117,7 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME) BUILD_BYPRODUCTS "${${ID}_LIBRARY}" ) - set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "ThirdParty") + set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "third-party") endif() endmacro() diff --git a/gtk/CMakeLists.txt b/gtk/CMakeLists.txt index 9bad254fa..c6894eb71 100644 --- a/gtk/CMakeLists.txt +++ b/gtk/CMakeLists.txt @@ -94,6 +94,8 @@ if(ENABLE_NLS) DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in VERBATIM ) + + source_group("Generated Files" FILES ${${PROJECT_NAME}_DESKTOP_FILE} ${${PROJECT_NAME}_METAINFO_FILE}) endif() set(${PROJECT_NAME}_SOURCES diff --git a/macosx/CMakeLists.txt b/macosx/CMakeLists.txt index 34713bc8c..63b3730c2 100644 --- a/macosx/CMakeLists.txt +++ b/macosx/CMakeLists.txt @@ -2,18 +2,14 @@ project(trmac) include_directories(${CMAKE_SOURCE_DIR}) -if(CMAKE_GENERATOR STREQUAL "Xcode") - set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC ON) -else() - add_definitions(-fobjc-arc) -endif() - -add_compile_options(-fmodules -fcxx-modules) +add_compile_options( + -fcxx-modules + -fmodules + -fobjc-arc) +find_program(ACTOOL_EXECUTABLE actool REQUIRED) +find_program(CODESIGN_EXECUTABLE codesign REQUIRED) find_program(IBTOOL_EXECUTABLE ibtool REQUIRED) -find_program(ICONUTIL_EXECUTABLE iconutil REQUIRED) -find_program(TIFFUTIL_EXECUTABLE tiffutil REQUIRED) -find_program(INSTALL_NAME_TOOL_EXECUTABLE install_name_tool REQUIRED) macro(tr_wrap_xib IFILE OFILE) get_filename_component(twx_nib_dir "${OFILE}" DIRECTORY) @@ -25,20 +21,9 @@ macro(tr_wrap_xib IFILE OFILE) WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} VERBATIM ) + source_group("Generated Files" FILES ${OFILE}) endmacro() -function(tr_tiff_from_pngs OFILE) - get_filename_component(ODIR "${OFILE}" DIRECTORY) - add_custom_command( - OUTPUT ${OFILE} - COMMAND ${CMAKE_COMMAND} -E make_directory ${ODIR} - COMMAND ${TIFFUTIL_EXECUTABLE} -cathidpicheck ${ARGN} -out ${OFILE} - DEPENDS ${ARGN} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - VERBATIM - ) -endfunction() - set(${PROJECT_NAME}_SOURCES AboutWindowController.mm AddMagnetWindowController.mm @@ -195,51 +180,22 @@ set(${PROJECT_NAME}_XIB_FILES StatusBar.xib URLSheetWindow.xib ) - -set(APPICONSET_DIR "${PROJECT_SOURCE_DIR}/Images/Images.xcassets/AppIcon.appiconset") -set(APPICON_FILE "${PROJECT_BINARY_DIR}/Transmission.icns") -add_custom_command( - OUTPUT "${APPICON_FILE}" - COMMAND "${CMAKE_COMMAND}" -E rm -rf - "${PROJECT_BINARY_DIR}/Transmission.iconset" - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${APPICONSET_DIR}" - "${PROJECT_BINARY_DIR}/Transmission.iconset" - COMMAND "${CMAKE_COMMAND}" -E rm - "${PROJECT_BINARY_DIR}/Transmission.iconset/Contents.json" - COMMAND "${ICONUTIL_EXECUTABLE}" - --convert icns - --output "${APPICON_FILE}" - "${PROJECT_BINARY_DIR}/Transmission.iconset" - DEPENDS - "${APPICONSET_DIR}/icon_128x128.png" - "${APPICONSET_DIR}/icon_128x128@2x.png" - "${APPICONSET_DIR}/icon_16x16.png" - "${APPICONSET_DIR}/icon_16x16@2x.png" - "${APPICONSET_DIR}/icon_256x256.png" - "${APPICONSET_DIR}/icon_256x256@2x.png" - "${APPICONSET_DIR}/icon_32x32.png" - "${APPICONSET_DIR}/icon_32x32@2x.png" - "${APPICONSET_DIR}/icon_512x512.png" - "${APPICONSET_DIR}/icon_512x512@2x.png" - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" - VERBATIM -) +source_group(Resources FILES ${${PROJECT_NAME}_XIB_FILES}) set(${PROJECT_NAME}_RESOURCES Defaults.plist Credits.rtf sparkle_dsa_pub.pem ../COPYING - "${APPICON_FILE}" Images/TransmissionDocument.icns ) +source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES}) set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) -set(${PROJECT_NAME}_HIDPI_IMAGES +set(${PROJECT_NAME}_IMAGESETS ActionHover Bandwidth CleanupTemplate @@ -247,8 +203,10 @@ set(${PROJECT_NAME}_HIDPI_IMAGES CreateLarge DownArrowGroupTemplate DownArrowTemplate + DownloadBadge EllipsisTemplate FavIcon + GearshapeTemplate Globe Groups InfoActivity @@ -293,38 +251,58 @@ set(${PROJECT_NAME}_HIDPI_IMAGES Transfers UpArrowGroupTemplate UpArrowTemplate + UploadBadge YingYangGroupTemplate YingYangTemplate ) -foreach(IMG ${${PROJECT_NAME}_HIDPI_IMAGES}) - set(IMG_DIR "Images/Images.xcassets/${IMG}.imageset") - list(APPEND ${PROJECT_NAME}_RESOURCES ${IMG_DIR}/${IMG}.png ${IMG_DIR}/${IMG}@2x.png) - if(COMBINE_HIDPI_ARTWORK) - list(APPEND ${PROJECT_NAME}_RESOURCES ${PROJECT_BINARY_DIR}/Images/${IMG}.tiff) - tr_tiff_from_pngs(${PROJECT_BINARY_DIR}/Images/${IMG}.tiff ${IMG_DIR}/${IMG}.png ${IMG_DIR}/${IMG}@2x.png) - set_source_files_properties(${PROJECT_BINARY_DIR}/Images/${IMG}.tiff PROPERTIES - MACOSX_PACKAGE_LOCATION Resources - ) - else() - set_source_files_properties(${IMG_DIR}/${IMG}.png ${IMG_DIR}/${IMG}@2x.png PROPERTIES - MACOSX_PACKAGE_LOCATION Resources - ) - endif() +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 ${PROJECT_NAME}_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() -set(${PROJECT_NAME}_LODPI_IMAGES - DownloadBadge - UploadBadge +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) -foreach(IMG ${${PROJECT_NAME}_LODPI_IMAGES}) - set(IMG_DIR "Images/Images.xcassets/${IMG}.imageset") - list(APPEND ${PROJECT_NAME}_RESOURCES ${IMG_DIR}/${IMG}.png) - set_source_files_properties(${IMG_DIR}/${IMG}.png PROPERTIES - MACOSX_PACKAGE_LOCATION Resources - ) -endforeach() +list(APPEND ${PROJECT_NAME}_RESOURCES ${COMPILED_IMAGE_ASSETS}) + +set_source_files_properties(${COMPILED_IMAGE_ASSETS} PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) set(${PROJECT_NAME}_LINGUAS da @@ -383,6 +361,7 @@ foreach(F ${${PROJECT_NAME}_LANG_XIB_FILES}) tr_wrap_xib("${F_XIB}" "${F_NIB}") list(APPEND ${PROJECT_NAME}_BASE_XIB_FILES "${F_XIB}") list(APPEND ${PROJECT_NAME}_BASE_NIB_FILES "${F_NIB}") + source_group(Resources/Base.lproj FILES ${F_XIB}) endforeach() foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) @@ -396,6 +375,7 @@ foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES}) list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) endforeach() + source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) endforeach() include_directories( @@ -414,13 +394,23 @@ add_library(vdkqueue STATIC VDKQueue/VDKQueue.h ) +set_property(TARGET vdkqueue PROPERTY FOLDER "third-party") + +set(BASE_NIB_FILES_RESOURCES_DIR Resources) +if(NOT CMAKE_GENERATOR STREQUAL Xcode) + string(APPEND BASE_NIB_FILES_RESOURCES_DIR /Base.lproj) +endif() set_source_files_properties(${${PROJECT_NAME}_BASE_NIB_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources/Base.lproj) + MACOSX_PACKAGE_LOCATION ${BASE_NIB_FILES_RESOURCES_DIR}) foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) list(APPEND ${PROJECT_NAME}_RESOURCES ${${PROJECT_NAME}_${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(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources/${LANG}.lproj) + MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) endforeach() add_executable(${TR_NAME}-mac MACOSX_BUNDLE @@ -447,6 +437,11 @@ target_link_libraries(${TR_NAME}-mac "-framework Security" ) +if(NOT CMAKE_GENERATOR STREQUAL Xcode) + add_custom_command(TARGET ${TR_NAME}-mac POST_BUILD + COMMAND ${CODESIGN_EXECUTABLE} -s - -o linker-signed $) +endif() + set(MAC_BUNDLE_NAME Transmission) set_target_properties(${TR_NAME}-mac PROPERTIES diff --git a/macosx/Info.plist.in b/macosx/Info.plist.in index fcb877c69..1e4f39fc9 100644 --- a/macosx/Info.plist.in +++ b/macosx/Info.plist.in @@ -34,7 +34,9 @@ CFBundleHelpBookName Transmission Help CFBundleIconFile - Transmission + @APPICON_NAME@ + CFBundleIconName + @APPICON_NAME@ CFBundleIdentifier org.m0k.transmission CFBundleInfoDictionaryVersion diff --git a/macosx/QuickLookPlugin/CMakeLists.txt b/macosx/QuickLookPlugin/CMakeLists.txt index e890d1407..8a4c81ef5 100644 --- a/macosx/QuickLookPlugin/CMakeLists.txt +++ b/macosx/QuickLookPlugin/CMakeLists.txt @@ -36,18 +36,24 @@ set(${PROJECT_NAME}_LANG_STRINGS_FILES set(${PROJECT_NAME}_RESOURCES style.css ) +source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES}) set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) set(${PROJECT_NAME}_${LANG}_STRINGS_FILES) + set(STRINGS_FILES_RESOURCES_DIR Resources) + if(NOT CMAKE_GENERATOR STREQUAL Xcode) + string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj) + endif() foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES}) list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) list(APPEND ${PROJECT_NAME}_RESOURCES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) set_source_files_properties(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources/${LANG}.lproj) + MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) endforeach() + source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) endforeach() add_library(${TR_NAME}-mac-ql MODULE diff --git a/qt/CMakeLists.txt b/qt/CMakeLists.txt index cefac82cf..4df2ff1c0 100644 --- a/qt/CMakeLists.txt +++ b/qt/CMakeLists.txt @@ -1,5 +1,10 @@ project(trqt) +set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Generated Files") +set_property(GLOBAL PROPERTY AUTOMOC_SOURCE_GROUP "Generated Files") +set_property(GLOBAL PROPERTY AUTORCC_SOURCE_GROUP "Generated Files") +set_property(GLOBAL PROPERTY AUTOUIC_SOURCE_GROUP "Generated Files") + set(${PROJECT_NAME}_SOURCES AboutDialog.cc AddData.cc @@ -120,7 +125,7 @@ set(${PROJECT_NAME}_HEADERS WatchDir.h ) -tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES +set(${PROJECT_NAME}_UI_FILES AboutDialog.ui DetailsDialog.ui LicenseDialog.ui @@ -134,13 +139,19 @@ tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES StatsDialog.ui TrackersDialog.ui ) +source_group(Ui FILES ${${PROJECT_NAME}_UI_FILES}) + +tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES ${${PROJECT_NAME}_UI_FILES}) +source_group("Generated Files" FILES ${${PROJECT_NAME}_UI_SOURCES}) set(${PROJECT_NAME}_QRC_FILES application.qrc) if(WIN32 OR APPLE) list(APPEND ${PROJECT_NAME}_QRC_FILES icons/Faenza/Faenza.qrc) endif() +source_group(Resources FILES ${${PROJECT_NAME}_QRC_FILES}) tr_qt_add_resources(${PROJECT_NAME}_QRC_SOURCES ${${PROJECT_NAME}_QRC_FILES}) +source_group("Generated Files" FILES ${${PROJECT_NAME}_QRC_SOURCES}) set(${PROJECT_NAME}_LINGUAS af @@ -188,6 +199,7 @@ endforeach() if(${PROJECT_NAME}_TS_FILES) tr_qt_add_translation(${PROJECT_NAME}_QM_FILES ${${PROJECT_NAME}_TS_FILES}) + source_group("Generated Files" FILES ${${PROJECT_NAME}_QM_FILES}) endif() include_directories( diff --git a/tests/gtest/CMakeLists.txt b/tests/gtest/CMakeLists.txt index 72fa17e5f..1cd714788 100644 --- a/tests/gtest/CMakeLists.txt +++ b/tests/gtest/CMakeLists.txt @@ -1,3 +1,5 @@ add_library(gtestall STATIC ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc) + +set_property(TARGET gtestall PROPERTY FOLDER "third-party") diff --git a/tests/libtransmission/CMakeLists.txt b/tests/libtransmission/CMakeLists.txt index 064e88b4d..134bf00bf 100644 --- a/tests/libtransmission/CMakeLists.txt +++ b/tests/libtransmission/CMakeLists.txt @@ -51,6 +51,8 @@ add_executable(libtransmission-test watchdir-test.cc web-utils-test.cc) +set_property(TARGET libtransmission-test PROPERTY FOLDER "tests") + target_compile_definitions(libtransmission-test PRIVATE -DLIBTRANSMISSION_TEST_ASSETS_DIR="${CMAKE_CURRENT_SOURCE_DIR}/assets" @@ -94,6 +96,8 @@ add_custom_command( add_executable(subprocess-test subprocess-test-program.cc) +set_property(TARGET subprocess-test PROPERTY FOLDER "tests") + target_include_directories(subprocess-test PRIVATE ${CMAKE_SOURCE_DIR}/libtransmission)