Swift compiler detection in CMake 3.21 only working if cmake_minimum_required is 3.20 earlier and check_language is not used
In CMake 3.21, the only way I can get compiler detection to work is if I set cmake_minimum_required
to 3.20 or earlier, and I enable Swift via the LANGUAGES
option for project()
instead of with enable_language().
Here is an example CMakeLists.txt I used:
if(TEST_NUMBER EQUAL 1)
message("cmake_minimum_required is 3.21. Enabling Swift via project(). In my testing this fails.")
cmake_minimum_required(VERSION 3.21)
project(TestSwiftCMake LANGUAGES Swift)
elseif(TEST_NUMBER EQUAL 2)
message("cmake_minimum_required is 3.20. Enabling Swift via project(). In my testing this succeeds.")
cmake_minimum_required(VERSION 3.20)
project(TestSwiftCMake LANGUAGES Swift)
elseif(TEST_NUMBER EQUAL 3)
message("cmake_minimum_required is 3.21. Enabling Swift via enable_language(). In my testing this fails.")
cmake_minimum_required(VERSION 3.21)
project(TestSwiftCMake LANGUAGES)
enable_language(Swift)
elseif(TEST_NUMBER EQUAL 4)
message("cmake_minimum_required is 3.20. Enabling Swift via enable_language(). In my testing this succeeds.")
cmake_minimum_required(VERSION 3.20)
project(TestSwiftCMake LANGUAGES)
enable_language(Swift)
elseif(TEST_NUMBER EQUAL 5)
message("cmake_minimum_required is 3.21. Enabling Swift via check_language() then enable_language(). In my testing this fails.")
cmake_minimum_required(VERSION 3.21)
project(TestSwiftCMake LANGUAGES)
include(CheckLanguage)
check_language(Swift)
if(CMAKE_Swift_COMPILER)
enable_language(Swift)
else()
message(FATAL_ERROR "Swift not found")
endif()
elseif(TEST_NUMBER EQUAL 6)
message("cmake_minimum_required is 3.20. Enabling Swift via check_language() then enable_language(). In my testing this fails.")
cmake_minimum_required(VERSION 3.20)
project(TestSwiftCMake LANGUAGES)
include(CheckLanguage)
check_language(Swift)
if(CMAKE_Swift_COMPILER)
enable_language(Swift)
else()
message(FATAL_ERROR "Swift not found")
endif()
else()
message(FATAL_ERROR "set TEST_NUMBER between 1 and 6")
endif()
Which I invoke with cmake -H/Users/remyjette/src/TestSwiftCMake -B/Users/remyjette/src/TestSwiftCMake/_build -GXcode -DTEST_NUMBER=N
, varying TEST_NUMBER
for each example (and deleting the build folder between attempts to ensure a clean run).
I've also attached the CMakeError.log for "TEST_NUMBER=1". The particularly odd thing to me is that the output message says ** BUILD SUCCEEDED **
and I see no obvious error messages in the log, but CMake treats it as a failure. swiftdetection_cmakeminimum3-21.txt
I am running macOS Big Sur 11.2.3 and Xcode 12.5. I'm also seeing this same failure in the GitHub Actions macos-10.15
agent on which I am using Xcode 12.3.