Skip to content

Commit 9f95b54

Browse files
author
Alexander Widerberg
committed
Lots of fixes regarding duplicate command line flags as well as letting CMake handle versioning itself without the toolchain intervening.
1 parent 4c74b22 commit 9f95b54

File tree

3 files changed

+107
-79
lines changed

3 files changed

+107
-79
lines changed
-217 KB
Binary file not shown.

example/example-lib/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ cmake_minimum_required (VERSION 3.2)
22
project (example-ios C CXX)
33
enable_testing()
44

5+
MESSAGE( STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )
6+
57
# Add some sanitary checks that the toolchain is actually working!
68
include(CheckCXXSymbolExists)
79
check_cxx_symbol_exists(kqueue sys/event.h HAVE_KQUEUE)

ios.toolchain.cmake

Lines changed: 105 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ set(USED_CMAKE_GENERATOR "${CMAKE_GENERATOR}" CACHE STRING "Expose CMAKE_GENERAT
133133

134134
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14")
135135
set(MODERN_CMAKE YES)
136-
message(STATUS "Merging integrated CMake 3.14+ iOS,tvOS,watchOS,macOS toolchain(s) with this toolchain!")
137136
endif()
138137

139138
# Get the Xcode version being used.
@@ -143,7 +142,6 @@ execute_process(COMMAND xcodebuild -version
143142
OUTPUT_STRIP_TRAILING_WHITESPACE)
144143
string(REGEX MATCH "Xcode [0-9\\.]+" XCODE_VERSION "${XCODE_VERSION}")
145144
string(REGEX REPLACE "Xcode ([0-9\\.]+)" "\\1" XCODE_VERSION "${XCODE_VERSION}")
146-
message(STATUS "Building with Xcode version: ${XCODE_VERSION}")
147145

148146
######## ALIASES (DEPRECATION WARNINGS)
149147

@@ -304,7 +302,6 @@ elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS")
304302
else()
305303
message(FATAL_ERROR "Invalid PLATFORM: ${PLATFORM_INT}")
306304
endif()
307-
message(STATUS "Configuring ${SDK_NAME} build for platform: ${PLATFORM_INT}, architecture(s): ${ARCHS}")
308305

309306
if(MODERN_CMAKE AND PLATFORM_INT MATCHES ".*COMBINED" AND NOT USED_CMAKE_GENERATOR MATCHES "Xcode")
310307
message(FATAL_ERROR "The COMBINED options only work with Xcode generator, -G Xcode")
@@ -322,18 +319,15 @@ if (NOT DEFINED CMAKE_OSX_SYSROOT_INT AND NOT DEFINED CMAKE_OSX_SYSROOT)
322319
"and see if that fixes the problem for you.")
323320
message(FATAL_ERROR "Invalid CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT} "
324321
"does not exist.")
325-
elseif(DEFINED CMAKE_OSX_SYSROOT)
326-
message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT} for platform: ${PLATFORM_INT} when checking compatibility")
327322
elseif(DEFINED CMAKE_OSX_SYSROOT_INT)
328-
message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT_INT} for platform: ${PLATFORM_INT}")
329323
set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "")
330324
endif()
331325

332326
# Set Xcode property for SDKROOT as well if Xcode generator is used
333327
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
334328
set(CMAKE_OSX_SYSROOT "${SDK_NAME}" CACHE INTERNAL "")
335329
if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM)
336-
set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM 123456789A CACHE INTERNAL "")
330+
set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "123456789A" CACHE INTERNAL "")
337331
endif()
338332
endif()
339333

@@ -350,6 +344,7 @@ if(NOT DEFINED DEPLOYMENT_TARGET)
350344
endif()
351345
message(STATUS "Using the default min-version since DEPLOYMENT_TARGET not provided!")
352346
endif()
347+
353348
# Use bitcode or not
354349
if(NOT DEFINED ENABLE_BITCODE AND NOT ARCHS MATCHES "((^|;|, )(i386|x86_64))+")
355350
# Unless specified, enable bitcode support by default
@@ -435,7 +430,6 @@ if(NOT CMAKE_INSTALL_NAME_TOOL)
435430
ERROR_QUIET
436431
OUTPUT_STRIP_TRAILING_WHITESPACE)
437432
set(CMAKE_INSTALL_NAME_TOOL ${CMAKE_INSTALL_NAME_TOOL_INT} CACHE STRING "" ${FORCE_CACHE})
438-
message(STATUS "Using install_name_tool: ${CMAKE_INSTALL_NAME_TOOL}")
439433
endif()
440434
# Get the version of Darwin (OS X) of the host.
441435
execute_process(COMMAND uname -r
@@ -454,7 +448,7 @@ if(MODERN_CMAKE)
454448
endif()
455449
# Provide flags for a combined FAT library build on newer CMake versions
456450
if(PLATFORM_INT MATCHES ".*COMBINED")
457-
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO CACHE INTERNAL "" ${FORCE_CACHE})
451+
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO" CACHE INTERNAL "" ${FORCE_CACHE})
458452
set(CMAKE_IOS_INSTALL_COMBINED YES CACHE INTERNAL "" ${FORCE_CACHE})
459453
message(STATUS "Will combine built (static) artifacts into FAT lib...")
460454
endif()
@@ -504,110 +498,140 @@ if(ARCHS MATCHES "((^|;|, )(arm64|arm64e|x86_64))+")
504498
else()
505499
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
506500
endif()
507-
message(STATUS "Using a data_ptr size of 8")
508501
else()
509502
set(CMAKE_C_SIZEOF_DATA_PTR 4)
510503
set(CMAKE_CXX_SIZEOF_DATA_PTR 4)
511504
set(CMAKE_SYSTEM_PROCESSOR "arm")
512-
message(STATUS "Using a data_ptr size of 4")
513505
endif()
514506

515-
message(STATUS "Building for minimum ${SDK_NAME} version: ${DEPLOYMENT_TARGET}"
516-
" (SDK version: ${SDK_VERSION})")
517507
# Note that only Xcode 7+ supports the newer more specific:
518508
# -m${SDK_NAME}-version-min flags, older versions of Xcode use:
519509
# -m(ios/ios-simulator)-version-min instead.
520-
if(PLATFORM_INT STREQUAL "OS" OR PLATFORM_INT STREQUAL "OS64")
521-
if(XCODE_VERSION VERSION_LESS 7.0)
510+
if(${CMAKE_VERSION} VERSION_LESS "3.11")
511+
if(PLATFORM_INT STREQUAL "OS" OR PLATFORM_INT STREQUAL "OS64")
512+
if(XCODE_VERSION VERSION_LESS 7.0)
513+
set(SDK_NAME_VERSION_FLAGS
514+
"-mios-version-min=${DEPLOYMENT_TARGET}")
515+
else()
516+
# Xcode 7.0+ uses flags we can build directly from SDK_NAME.
517+
set(SDK_NAME_VERSION_FLAGS
518+
"-m${SDK_NAME}-version-min=${DEPLOYMENT_TARGET}")
519+
endif()
520+
elseif(PLATFORM_INT STREQUAL "TVOS")
522521
set(SDK_NAME_VERSION_FLAGS
523-
"-mios-version-min=${DEPLOYMENT_TARGET}")
522+
"-mtvos-version-min=${DEPLOYMENT_TARGET}")
523+
elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS")
524+
set(SDK_NAME_VERSION_FLAGS
525+
"-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}")
526+
elseif(PLATFORM_INT STREQUAL "WATCHOS")
527+
set(SDK_NAME_VERSION_FLAGS
528+
"-mwatchos-version-min=${DEPLOYMENT_TARGET}")
529+
elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS")
530+
set(SDK_NAME_VERSION_FLAGS
531+
"-mwatchos-simulator-version-min=${DEPLOYMENT_TARGET}")
524532
else()
525-
# Xcode 7.0+ uses flags we can build directly from SDK_NAME.
533+
# SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min.
526534
set(SDK_NAME_VERSION_FLAGS
527-
"-m${SDK_NAME}-version-min=${DEPLOYMENT_TARGET}")
535+
"-mios-simulator-version-min=${DEPLOYMENT_TARGET}")
528536
endif()
529-
elseif(PLATFORM_INT STREQUAL "TVOS")
530-
set(SDK_NAME_VERSION_FLAGS
531-
"-mtvos-version-min=${DEPLOYMENT_TARGET}")
532-
elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS")
533-
set(SDK_NAME_VERSION_FLAGS
534-
"-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}")
535-
elseif(PLATFORM_INT STREQUAL "WATCHOS")
536-
set(SDK_NAME_VERSION_FLAGS
537-
"-mwatchos-version-min=${DEPLOYMENT_TARGET}")
538-
elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS")
539-
set(SDK_NAME_VERSION_FLAGS
540-
"-mwatchos-simulator-version-min=${DEPLOYMENT_TARGET}")
541537
else()
542-
# SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min.
543-
set(SDK_NAME_VERSION_FLAGS
544-
"-mios-simulator-version-min=${DEPLOYMENT_TARGET}")
538+
# Newer versions of CMake sets the version min flags correctly
539+
set(CMAKE_OSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} CACHE STRING
540+
"Set CMake deployment target" ${FORCE_CACHE})
545541
endif()
546-
message(STATUS "Version flags set to: ${SDK_NAME_VERSION_FLAGS}")
547-
set(CMAKE_OSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} CACHE STRING
548-
"Set CMake deployment target" ${FORCE_CACHE})
542+
549543

550544
if(ENABLE_BITCODE_INT)
551545
set(BITCODE "-fembed-bitcode")
552-
set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE bitcode CACHE INTERNAL "")
553-
message(STATUS "Enabling bitcode support.")
546+
set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE "bitcode" CACHE INTERNAL "")
547+
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "YES" CACHE INTERNAL "")
554548
else()
555549
set(BITCODE "")
556-
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO CACHE INTERNAL "")
557-
message(STATUS "Disabling bitcode support.")
550+
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" CACHE INTERNAL "")
558551
endif()
559552

560553
if(ENABLE_ARC_INT)
561554
set(FOBJC_ARC "-fobjc-arc")
562-
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES CACHE INTERNAL "")
563-
message(STATUS "Enabling ARC support.")
555+
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "YES" CACHE INTERNAL "")
564556
else()
565557
set(FOBJC_ARC "-fno-objc-arc")
566-
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO CACHE INTERNAL "")
567-
message(STATUS "Disabling ARC support.")
558+
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "NO" CACHE INTERNAL "")
568559
endif()
569560

570561
if(NOT ENABLE_VISIBILITY_INT)
571562
set(VISIBILITY "-fvisibility=hidden")
572-
set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES CACHE INTERNAL "")
573-
message(STATUS "Hiding symbols (-fvisibility=hidden).")
563+
set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES" CACHE INTERNAL "")
574564
else()
575565
set(VISIBILITY "")
576-
set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN NO CACHE INTERNAL "")
566+
set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "NO" CACHE INTERNAL "")
577567
endif()
578568

579-
#Check if Xcode generator is used, since that will handle these flags automagically
580-
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
581-
message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as generator.")
582-
else()
583-
set(CMAKE_C_FLAGS
584-
"${SDK_NAME_VERSION_FLAGS} ${BITCODE} -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_C_FLAGS}")
585-
# Hidden visibilty is required for C++ on iOS.
586-
set(CMAKE_CXX_FLAGS
587-
"${SDK_NAME_VERSION_FLAGS} ${BITCODE} ${VISIBILITY} -fvisibility-inlines-hidden -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_CXX_FLAGS}")
588-
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g ${CMAKE_CXX_FLAGS_DEBUG}")
589-
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -DNDEBUG -Os -ffast-math ${CMAKE_CXX_FLAGS_MINSIZEREL}")
590-
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} -DNDEBUG -O2 -g -ffast-math ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
591-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -ffast-math ${CMAKE_CXX_FLAGS_RELEASE}")
592-
set(CMAKE_C_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
593-
set(CMAKE_CXX_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
594-
SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp")
595-
596-
# In order to ensure that the updated compiler flags are used in try_compile()
597-
# tests, we have to forcibly set them in the CMake cache, not merely set them
598-
# in the local scope.
599-
list(APPEND VARS_TO_FORCE_IN_CACHE
600-
CMAKE_C_FLAGS
601-
CMAKE_CXX_FLAGS
602-
CMAKE_CXX_FLAGS_DEBUG
603-
CMAKE_CXX_FLAGS_RELWITHDEBINFO
604-
CMAKE_CXX_FLAGS_MINSIZEREL
605-
CMAKE_CXX_FLAGS_RELEASE
606-
CMAKE_C_LINK_FLAGS
607-
CMAKE_CXX_LINK_FLAGS)
608-
foreach(VAR_TO_FORCE ${VARS_TO_FORCE_IN_CACHE})
609-
set(${VAR_TO_FORCE} "${${VAR_TO_FORCE}}" CACHE STRING "")
610-
endforeach()
569+
if(NOT IOS_TOOLCHAIN_HAS_RUN)
570+
#Check if Xcode generator is used, since that will handle these flags automagically
571+
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
572+
message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as generator.")
573+
else()
574+
set(CMAKE_C_FLAGS
575+
"${SDK_NAME_VERSION_FLAGS} ${BITCODE} -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_C_FLAGS}")
576+
# Hidden visibilty is required for C++ on iOS.
577+
set(CMAKE_CXX_FLAGS
578+
"${SDK_NAME_VERSION_FLAGS} ${BITCODE} ${VISIBILITY} -fvisibility-inlines-hidden -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_CXX_FLAGS}")
579+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g ${CMAKE_CXX_FLAGS_DEBUG}")
580+
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -DNDEBUG -Os -ffast-math ${CMAKE_CXX_FLAGS_MINSIZEREL}")
581+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} -DNDEBUG -O2 -g -ffast-math ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
582+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -ffast-math ${CMAKE_CXX_FLAGS_RELEASE}")
583+
set(CMAKE_C_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
584+
set(CMAKE_CXX_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
585+
set(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp")
586+
587+
# In order to ensure that the updated compiler flags are used in try_compile()
588+
# tests, we have to forcibly set them in the CMake cache, not merely set them
589+
# in the local scope.
590+
set(VARS_TO_FORCE_IN_CACHE
591+
CMAKE_C_FLAGS
592+
CMAKE_CXX_FLAGS
593+
CMAKE_CXX_FLAGS_DEBUG
594+
CMAKE_CXX_FLAGS_RELWITHDEBINFO
595+
CMAKE_CXX_FLAGS_MINSIZEREL
596+
CMAKE_CXX_FLAGS_RELEASE
597+
CMAKE_C_LINK_FLAGS
598+
CMAKE_CXX_LINK_FLAGS)
599+
foreach(VAR_TO_FORCE ${VARS_TO_FORCE_IN_CACHE})
600+
set(${VAR_TO_FORCE} "${${VAR_TO_FORCE}}" CACHE STRING "" ${FORCE_CACHE})
601+
endforeach()
602+
endif()
603+
604+
## Print status messages to inform of the current state
605+
message(STATUS "Configuring ${SDK_NAME} build for platform: ${PLATFORM_INT}, architecture(s): ${ARCHS}")
606+
message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT_INT}")
607+
message(STATUS "Using minimum deployment version: ${DEPLOYMENT_TARGET}"
608+
" (SDK version: ${SDK_VERSION})")
609+
if(MODERN_CMAKE)
610+
message(STATUS "Merging integrated CMake 3.14+ iOS,tvOS,watchOS,macOS toolchain(s) with this toolchain!")
611+
endif()
612+
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
613+
message(STATUS "Using Xcode version: ${XCODE_VERSION}")
614+
endif()
615+
if(DEFINED SDK_NAME_VERSION_FLAGS)
616+
message(STATUS "Using version flags: ${SDK_NAME_VERSION_FLAGS}")
617+
endif()
618+
message(STATUS "Using a data_ptr size of: ${CMAKE_CXX_SIZEOF_DATA_PTR}")
619+
message(STATUS "Using install_name_tool: ${CMAKE_INSTALL_NAME_TOOL}")
620+
if(ENABLE_BITCODE_INT)
621+
message(STATUS "Enabling bitcode support.")
622+
else()
623+
message(STATUS "Disabling bitcode support.")
624+
endif()
625+
626+
if(ENABLE_ARC_INT)
627+
message(STATUS "Enabling ARC support.")
628+
else()
629+
message(STATUS "Disabling ARC support.")
630+
endif()
631+
632+
if(NOT ENABLE_VISIBILITY_INT)
633+
message(STATUS "Hiding symbols (-fvisibility=hidden).")
634+
endif()
611635
endif()
612636

613637
set(CMAKE_PLATFORM_HAS_INSTALLNAME 1)
@@ -630,6 +654,8 @@ set(CMAKE_FRAMEWORK_PATH
630654
${CMAKE_OSX_SYSROOT_INT}/System/Library/Frameworks
631655
${CMAKE_FRAMEWORK_PATH} CACHE STRING "Frameworks search paths" ${FORCE_CACHE})
632656

657+
set(IOS_TOOLCHAIN_HAS_RUN TRUE CACHE BOOL "Has the CMake toolchain run already?" ${FORCE_CACHE})
658+
633659
# By default, search both the specified iOS SDK and the remainder of the host filesystem.
634660
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
635661
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE STRING "" ${FORCE_CACHE})

0 commit comments

Comments
 (0)