-
Notifications
You must be signed in to change notification settings - Fork 211
Description
TLDR: Stop setting CPATH in module files and set C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, INCLUDE
instead
This came up for ROOT and was work-arounded in easybuilders/easybuild-easyblocks#2047
Basically: the C/C++ preprocessor considers the paths in the following order:
-I
CPATH
-isystem
CPLUS_INCLUDE_PATH
- buildins
Now projects adding paths via -isystem
have those ignored if the same folder/file name exists in CPATH
which happened for ROOT and LLVM resulting in taking an incompatible, EB installed LLVM over the included LLVM
Talked to a Spack guy about the CPATH issue: They had the same: spack/spack#11555 and solved it by using C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, INCLUDE
instead: spack/spack#14749
So I guess we can and should be doing the same. For existing modules we could simply move the contents of CPATH
to the other 3 variables after loading a module
Obvious downside: 3 variables with duplicated content instead of 1.
From Bennet Fauber:
https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html
Lists the variables for GNU Cs.
Some additional environment variables affect the behavior of the preprocessor.
CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH
CPATH specifies a list of directories to be searched as if specified with -I, but after any paths given with -I options on the command line. This environment variable is used regardless of which language is being preprocessed.
The remaining environment variables apply only when preprocessing the particular language indicated. Each specifies a list of directories to be searched as if specified with -isystem, but after any paths given with -isystem options on the command line.
CPLUS_INCLUDE_PATH is particularly useful for --std=c++99 and what have you that are specific to C++. I am blanking on which it was, but one of the geographic libraries was using CFLAGS for that, and it wasn't working well....