Description
Cargo has the ability to specify that a build script depends on specific environment variables using cargo:rerun-if-env-changed=NAME
, but no such mechanism exist for C compilers (that I know of).
This means that when you update an environment variable that your C compiler reads, you have to run cargo clean
before the change takes effect. It would be nice if cc
could prevent this by outputting a list of known variables that the C compiler it is about to invoke may read.
A list of the major ones I've found so far in Clang/LLVM (see also their limited docs about it):
SDKROOT
on Apple targetsVCINSTALLDIR
/VCToolsInstallDir
on WindowsINCLUDE
/CPATH
/C_INCLUDE_PATH
/C_PLUS_INCLUDE_PATH
/OBJC_INCLUDE_PATH
/OBJCPLUS_INCLUDE_PATH
MACOSX_DEPLOYMENT_TARGET
/IPHONEOS_DEPLOYMENT_TARGET
/TVOS_DEPLOYMENT_TARGET
/WATCHOS_DEPLOYMENT_TARGET
/XROS_DEPLOYMENT_TARGET
on Apple targets
Note that some of these may need to be handled by rustc/cargo itself.
Clang/LLVM read a bunch more, but they're mostly for debugging, or for stuff like setting up the terminal width, so I don't think those are applicable.
Additionally, C compilers usually rely on a few fundamental ones like PATH
, PWD
and PATHEXT
on Windows that I would honestly expect cargo
to handle, though I get why it may be difficult to do right.