The full path to executables on the system Path (and cwd on Windows) are discovered by Python
shutil.which.
On Windows, environment variable PATHEXT is used to search filename suffixes if not specified at the input to shutil.which().
Shell aliases
are not found by shutil.which() since the shell is not invoked.
Instead append the directory of the desired executable to environment variable PATH, or specify it in shutil.which(..., path="/path/to/exe").
importshutil# None if executable not foundexe = shutil.which('ls')
Since shutil.which() returns None for non-found executable it is convenient for
pytest.mark.skipif
For programs not on PATH where the executable path is known:
As a complete C / C++ / Fortran compiler package, Gfortran doesn’t require additional flags or environment variables.
To use GCC compilers, source a script like:
p=$(brew --prefix gcc)/bin
v=14exportCC=$p/gcc-$vCXX=$p/g++-$vFC=$p/gfortran-$v# to avoid GCC include errors -- MacOSX15.sdk incompatable at the moment with Homebrew GCCexportSDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/
where v=14 is the major version number of the GCC compiler installed.
The SDKROOT line may be necessary when Homebrew GCC package hasn’t yet enabled the latest SDK–adjust to suite the system.
When a new compiler version or macOS version or Xcode SDK is released, it may be necessary to adjust the environment variables or flags temporarily until Homebrew updates the package.
CMake
find_program
does not generally consider NAMES parameter to have file suffixes unless manually specified.
For Windows, .com and .exe file suffixes are considered, with search order:
.com
.exe
no suffix
If on Windows and an executable “hello.exe” or “hello.com” exists, then CMake will find it.
CMake would NOT find “hello.exe” on non-Windows platforms, where no file suffix is expected.
The full path to executables on the system Path (and cwd on Windows) are found by find_program().
Shell aliases
are not found since the shell is not invoked.
Instead specify find_program(... HINTS /path/to/exe).
These techniques work with any versioned program or library.
Here we use Matlab as an example.
CMake
find_package with a version range
would be used to simply select from a known-working version range.
Many Matlab codes require a modern version of Matlab.
It’s possible to select from an arbitrary min…max range of Matlab versions with CMake
FindMatlab
as follows.
This technique works with other versioned programs and libraries as well.
Git typically works for HTTPS URLs using the default configuration.
If certificates are not working, try configuring Git with the system
SSL certificate location.
Several modern, currently-supported compiler families are free-to-use for C, C++ and Fortran.
GCC has broad support of modern standards on a very wide range of computing platforms.
GCC’s downside in some cases can be slower runtime performance than compilers having less broad language and platform support.
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:
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”:
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.
The Zoom app offers an option to play audio tones when muting or unmuting the microphone, providing enhanced accessibility for users with visual impairments or other disabilities.
This setting is OFF by default and can be enabled from the Zoom Workplace app under Settings then Audio.
When enabled, users will hear a tone, audible only to them, indicating the mute or unmute action.
When running CMake standalone scripts like
cmake -P script.cmake
this is the SCRIPTCMake role.
Not all
CMake information variables
are set in SCRIPT role, in particular, the CMAKE_HOST* and CMAKE_SYSTEM* variables are not set as they are in PROJECT role.
This is a workaround for cmake -P SCRIPT role to get the CMAKE_HOST_* variables.
It uses undocumented CMake-internal scripts, but they’ve been present since 2012 and may be unlikely to change.
message(STATUS"CMake ${CMAKE_VERSION}")get_property(cmake_roleGLOBALPROPERTYCMAKE_ROLE)if(cmake_roleSTREQUAL"SCRIPT")set(CMAKE_PLATFORM_INFO_DIR ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY})# define CMAKE_HOST*, CMAKE_SYSTEM*, etc.
include(${CMAKE_ROOT}/Modules/CMakeDetermineSystem.cmake)# set booleans like CYGWIN
include(${CMAKE_ROOT}/Modules/CMakeSystemSpecificInitialize.cmake)# needed by Modules/Platform/*.cmake
include(${CMAKE_ROOT}/Modules/CMakeSystemSpecificInformation.cmake)# define CMAKE_SHARED_LIBRARY_SUFFIX, CMAKE_SHARED_LIBRARY_PREFIX, etc.
include(${CMAKE_ROOT}/Modules/Platform/${CMAKE_SYSTEM_NAME}.cmake)endif()message(STATUS"CMAKE_SYSTEM: ${CMAKE_SYSTEM}")message(STATUS"CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")message(STATUS"CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")message(STATUS"CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")message(STATUS"CMAKE_HOST_SYSTEM: ${CMAKE_HOST_SYSTEM}")message(STATUS"CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}")message(STATUS"CMAKE_HOST_SYSTEM_VERSION: ${CMAKE_HOST_SYSTEM_VERSION}")message(STATUS"CMAKE_HOST_SYSTEM_PROCESSOR: ${CMAKE_HOST_SYSTEM_PROCESSOR}")message(STATUS"CMAKE_SHARED_LIBRARY_SUFFIX: ${CMAKE_SHARED_LIBRARY_SUFFIX}")message(STATUS"CMAKE_SHARED_LIBRARY_PREFIX: ${CMAKE_SHARED_LIBRARY_PREFIX}")message(STATUS"CMAKE_STATIC_LIBRARY_SUFFIX: ${CMAKE_STATIC_LIBRARY_SUFFIX}")message(STATUS"CMAKE_STATIC_LIBRARY_PREFIX: ${CMAKE_STATIC_LIBRARY_PREFIX}")
Meson can set a default C++ (or C) langauge standard level with fallback to older versions.
This allows recent compilers to support the full functionality of the project code, while falling back for older compilers.
get_option('cpp_std') can be used for logic within meson.build if desired.