9595 TOOLCHAIN_CAPABILITY_LAPACK_FAMILY ,
9696 TOOLCHAIN_CAPABILITY_MPI_FAMILY ,
9797]
98- # modes to handle CPP header search paths
98+ # modes to handle header and linker search paths
9999# see: https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html
100- SEARCH_PATH_CPP_HEADERS_FLAGS = "CPPFLAGS"
101- SEARCH_PATH_CPP_HEADERS_CPATH = "CPATH"
102- SEARCH_PATH_CPP_HEADERS_INCLUDE = "INCLUDE_PATHS"
103- SEARCH_PATH_CPP_HEADERS = {
104- SEARCH_PATH_CPP_HEADERS_FLAGS : ["CPPFLAGS" ],
105- SEARCH_PATH_CPP_HEADERS_CPATH : ["CPATH" ],
106- SEARCH_PATH_CPP_HEADERS_INCLUDE : ["C_INCLUDE_PATH" , "CPLUS_INCLUDE_PATH" , "OBJC_INCLUDE_PATH" ],
100+ # supported on Linux by: GCC, GFortran, oneAPI C/C++ Compilers, oneAPI Fortran Compiler, LLVM-based
101+ SEARCH_PATH = {
102+ "cpp_headers" : {
103+ "flags" : ["CPPFLAGS" ],
104+ "cpath" : ["CPATH" ],
105+ "include_paths" : ["C_INCLUDE_PATH" , "CPLUS_INCLUDE_PATH" , "OBJC_INCLUDE_PATH" ],
106+ },
107+ "linker" : {
108+ "flags" : ["LDFLAGS" ],
109+ "library_path" : ["LIBRARY_PATH" ],
110+ },
107111}
108- DEFAULT_SEARCH_PATH_CPP_HEADERS = SEARCH_PATH_CPP_HEADERS_FLAGS
112+ DEFAULT_SEARCH_PATH_CPP_HEADERS = "flags"
113+ DEFAULT_SEARCH_PATH_LINKER = "flags"
109114
110115
111116def is_system_toolchain (tc_name ):
@@ -225,6 +230,11 @@ def __init__(self, name=None, version=None, mns=None, class_constants=None, tcde
225230
226231 self .use_rpath = False
227232
233+ self .search_path = {
234+ "cpp_headers" : DEFAULT_SEARCH_PATH_CPP_HEADERS ,
235+ "linker" : DEFAULT_SEARCH_PATH_LINKER ,
236+ }
237+
228238 self .mns = mns
229239 self .mod_full_name = None
230240 self .mod_short_name = None
@@ -372,9 +382,11 @@ def get_variable(self, name, typ=str):
372382 return res
373383
374384 def set_variables (self ):
375- """Do nothing? Everything should have been set by others
376- Needs to be defined for super() relations
377385 """
386+ No generic toolchain variables set.
387+ Post-process variables set by child Toolchain classes.
388+ """
389+
378390 if self .options .option ('packed-linker-options' ):
379391 self .log .devel ("set_variables: toolchain variables. packed-linker-options." )
380392 self .variables .try_function_on_element ('set_packed_linker_options' )
@@ -759,6 +771,27 @@ def _verify_toolchain(self):
759771 raise EasyBuildError ("List of toolchain dependency modules and toolchain definition do not match "
760772 "(found %s vs expected %s)" , self .toolchain_dep_mods , toolchain_definition )
761773
774+ def _validate_search_path (self ):
775+ """
776+ Validate search path toolchain options.
777+ Toolchain option has precedence over build option
778+ """
779+ for search_path in self .search_path :
780+ sp_build_opt = f"search_path_{ search_path } "
781+ sp_toolchain_opt = sp_build_opt .replace ("_" , "-" )
782+ if self .options .get (sp_toolchain_opt ) is not None :
783+ self .search_path [search_path ] = self .options .option (sp_toolchain_opt )
784+ elif build_option (sp_build_opt ) is not None :
785+ self .search_path [search_path ] = build_option (sp_build_opt )
786+
787+ if self .search_path [search_path ] not in SEARCH_PATH [search_path ]:
788+ raise EasyBuildError (
789+ "Unknown value selected for toolchain option %s: %s. Choose one of: %s" ,
790+ sp_toolchain_opt , self .search_path [search_path ], ", " .join (SEARCH_PATH [search_path ])
791+ )
792+
793+ self .log .debug ("%s toolchain option set to: %s" , sp_toolchain_opt , self .search_path [search_path ])
794+
762795 def symlink_commands (self , paths ):
763796 """
764797 Create a symlink for each command to binary/script at specified path.
@@ -838,7 +871,6 @@ def prepare(self, onlymod=None, deps=None, silent=False, loadmod=True,
838871 self ._load_modules (silent = silent )
839872
840873 if self .is_system_toolchain ():
841-
842874 # define minimal build environment when using system toolchain;
843875 # this is mostly done to try controlling which compiler commands are being used,
844876 # cfr. https://github.com/easybuilders/easybuild-framework/issues/3398
@@ -851,6 +883,7 @@ def prepare(self, onlymod=None, deps=None, silent=False, loadmod=True,
851883 self ._verify_toolchain ()
852884
853885 # Generate the variables to be set
886+ self ._validate_search_path ()
854887 self .set_variables ()
855888
856889 # set the variables
@@ -1091,24 +1124,7 @@ def _add_dependency_cpp_headers(self, dep_root, extra_dirs=None):
10911124 header_dirs = ["include" ]
10921125 header_dirs = unique_ordered_extend (header_dirs , extra_dirs )
10931126
1094- # mode of operation is defined by search-path-cpp-headers option
1095- # toolchain option has precedence over build option
1096- cpp_headers_mode = DEFAULT_SEARCH_PATH_CPP_HEADERS
1097- build_opt = build_option ("search_path_cpp_headers" )
1098- if self .options .get ("search-path-cpp-headers" ) is not None :
1099- cpp_headers_mode = self .options .option ("search-path-cpp-headers" )
1100- self .log .debug ("search-path-cpp-headers set by toolchain option: %s" , cpp_headers_mode )
1101- elif build_opt is not None :
1102- cpp_headers_mode = build_opt
1103- self .log .debug ("search-path-cpp-headers set by build option: %s" , cpp_headers_mode )
1104-
1105- if cpp_headers_mode not in SEARCH_PATH_CPP_HEADERS :
1106- raise EasyBuildError (
1107- "Unknown value selected for option search-path-cpp-headers: %s. Choose one of: %s" ,
1108- cpp_headers_mode , ", " .join (SEARCH_PATH_CPP_HEADERS )
1109- )
1110-
1111- for env_var in SEARCH_PATH_CPP_HEADERS [cpp_headers_mode ]:
1127+ for env_var in SEARCH_PATH ["cpp_headers" ][self .search_path ["cpp_headers" ]]:
11121128 self .log .debug ("Adding header paths to toolchain variable '%s': %s" , env_var , dep_root )
11131129 self .variables .append_subdirs (env_var , dep_root , subdirs = header_dirs )
11141130
@@ -1122,9 +1138,9 @@ def _add_dependency_linker_paths(self, dep_root, extra_dirs=None):
11221138 lib_dirs = ["lib64" , "lib" ]
11231139 lib_dirs = unique_ordered_extend (lib_dirs , extra_dirs )
11241140
1125- env_var = "LDFLAGS"
1126- self .log .debug ("Adding lib paths to toolchain variable '%s': %s" , env_var , dep_root )
1127- self .variables .append_subdirs (env_var , dep_root , subdirs = lib_dirs )
1141+ for env_var in SEARCH_PATH [ "linker" ][ self . search_path [ "linker" ]]:
1142+ self .log .debug ("Adding lib paths to toolchain variable '%s': %s" , env_var , dep_root )
1143+ self .variables .append_subdirs (env_var , dep_root , subdirs = lib_dirs )
11281144
11291145 def _setenv_variables (self , donotset = None , verbose = True ):
11301146 """Actually set the environment variables"""
0 commit comments