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 dc069f654f.
This commit is contained in:
Mike Gelfand 2022-11-12 21:01:57 +01:00 committed by GitHub
parent 55be67b2e6
commit 43acd7e3e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 108 additions and 85 deletions

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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 $<TARGET_BUNDLE_DIR:${TR_NAME}-mac>)
endif()
set(MAC_BUNDLE_NAME Transmission)
set_target_properties(${TR_NAME}-mac PROPERTIES

View File

@ -34,7 +34,9 @@
<key>CFBundleHelpBookName</key>
<string>Transmission Help</string>
<key>CFBundleIconFile</key>
<string>Transmission</string>
<string>@APPICON_NAME@</string>
<key>CFBundleIconName</key>
<string>@APPICON_NAME@</string>
<key>CFBundleIdentifier</key>
<string>org.m0k.transmission</string>
<key>CFBundleInfoDictionaryVersion</key>

View File

@ -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

View File

@ -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(

View File

@ -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")

View File

@ -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)