CMake macOS Xcode Environment
Related: GCC / Clang header clash on macOS
When macOS, Xcode, or Command Line Tools upgrades, build directories (including for CMake-based projects) often need to be refreshed. If the user has set custom environment variables concerning Xcode, they may need to be updated as well. Here are some important environment variables and CMake variables to check if problems occur after upgrading.
For a simple CMake project on macOS, CMakeCache.txt might include:
CMAKE_OSX_DEPLOYMENT_TARGET:STRING=
CMAKE_OSX_SYSROOT:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX*.sdk
- environment variable
MACOSX_DEPLOYMENT_TARGET
helps set CMAKE_OSX_DEPLOYMENT_TARGET - Environment variable
SDKROOT
helps set CMAKE_OSX_SYSROOT
Having multiple directories under the following is fine:
- /Library/Developer/CommandLineTools/SDKs
- /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
CMake can select the appropriate SDK by the user specifying environment variable SDKROOT
or
by
selecting the SDK:
xcode-select --switch
The XCode versions that Homebrew targets can be found in xcode.rb.
Workarounds
If Homebrew GCC breaks after upgrading Xcode or Command Line Tools, try specifying an older SDK.
For example, if g++-14 main.cpp -v
shows a different (older) SDK than CMake and it works, try specifying that SDK in environment variable SDKROOT
.
Note that the SDK version corresponds to macOS version, not the XCode version.
For example, if the latest SDK is MacOSX14.4.sdk
, try using MacOSX13.3.sdk
in “~/gcc.sh”:
export CC=gcc-14 CXX=g++-14 FC=gfortran-14
export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/
and then source ~/gcc.sh
before running cmake
with a fresh build directory.
If a CMake build step fails, try copy-pasting the command and removing the -isysroot
portion of the command.
This is a clear clue the older SDK is (at least temporarily) needed till Homebrew updates its GCC formula.
GCC will tell where included files are coming from by adding the gcc -H
flag.
This tells what to specify for environment variable SDKROOT
.