9898# modes to handle header and linker search paths
9999# see: https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html
100100# supported on Linux by: GCC, GFortran, oneAPI C/C++ Compilers, oneAPI Fortran Compiler, LLVM-based
101- SEARCH_PATH_CPP_HEADERS = {
102- "FLAGS" : ["CPPFLAGS" ],
103- "CPATH" : ["CPATH" ],
104- "INCLUDE_PATHS" : ["C_INCLUDE_PATH" , "CPLUS_INCLUDE_PATH" , "OBJC_INCLUDE_PATH" ],
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+ },
105111}
106- SEARCH_PATH_LINKER = {
107- "FLAGS" : ["LDFLAGS" ],
108- "LIBRARY_PATH" : ["LIBRARY_PATH" ],
109- }
110- DEFAULT_SEARCH_PATH_CPP_HEADERS = "FLAGS"
111- DEFAULT_SEARCH_PATH_LINKER = "FLAGS"
112+ DEFAULT_SEARCH_PATH_CPP_HEADERS = "flags"
113+ DEFAULT_SEARCH_PATH_LINKER = "flags"
112114
113115
114116def is_system_toolchain (tc_name ):
@@ -228,6 +230,11 @@ def __init__(self, name=None, version=None, mns=None, class_constants=None, tcde
228230
229231 self .use_rpath = False
230232
233+ self .search_path = {
234+ "cpp_headers" : DEFAULT_SEARCH_PATH_CPP_HEADERS ,
235+ "linker" : DEFAULT_SEARCH_PATH_LINKER ,
236+ }
237+
231238 self .mns = mns
232239 self .mod_full_name = None
233240 self .mod_short_name = None
@@ -375,14 +382,31 @@ def get_variable(self, name, typ=str):
375382 return res
376383
377384 def set_variables (self ):
378- """Do nothing? Everything should have been set by others
379- Needs to be defined for super() relations
380- """
385+ """Set generic toolchain variables. Child toolchains oversubscribe this method."""
386+
381387 if self .options .option ('packed-linker-options' ):
382388 self .log .devel ("set_variables: toolchain variables. packed-linker-options." )
383389 self .variables .try_function_on_element ('set_packed_linker_options' )
384390 self .log .devel ("set_variables: toolchain variables. Do nothing." )
385391
392+ # mode of operation for search paths
393+ # toolchain option has precedence over build option
394+ for search_path in self .search_path :
395+ sp_build_opt = f"search_path_{ search_path } "
396+ sp_toolchain_opt = sp_build_opt .replace ("_" , "-" )
397+ if self .options .get (sp_toolchain_opt ) is not None :
398+ self .search_path [search_path ] = self .options .option (sp_toolchain_opt )
399+ elif build_option (sp_build_opt ) is not None :
400+ self .search_path [search_path ] = build_option (sp_build_opt )
401+
402+ if self .search_path [search_path ] not in SEARCH_PATH [search_path ]:
403+ raise EasyBuildError (
404+ "Unknown value selected for toolchain option %s: %s. Choose one of: %s" ,
405+ sp_toolchain_opt , self .search_path [search_path ], ", " .join (SEARCH_PATH [search_path ])
406+ )
407+
408+ self .log .debug ("%s toolchain option set to: %s" , sp_toolchain_opt , self .search_path [search_path ])
409+
386410 def generate_vars (self ):
387411 """Convert the variables in simple vars"""
388412 self .vars = {}
@@ -1094,24 +1118,7 @@ def _add_dependency_cpp_headers(self, dep_root, extra_dirs=None):
10941118 header_dirs = ["include" ]
10951119 header_dirs = unique_ordered_extend (header_dirs , extra_dirs )
10961120
1097- # mode of operation is defined by search-path-cpp-headers option
1098- # toolchain option has precedence over build option
1099- cpp_headers_mode = DEFAULT_SEARCH_PATH_CPP_HEADERS
1100- build_opt = build_option ("search_path_cpp_headers" )
1101- if self .options .get ("search-path-cpp-headers" ) is not None :
1102- cpp_headers_mode = self .options .option ("search-path-cpp-headers" )
1103- self .log .debug ("search-path-cpp-headers set by toolchain option: %s" , cpp_headers_mode )
1104- elif build_opt is not None :
1105- cpp_headers_mode = build_opt
1106- self .log .debug ("search-path-cpp-headers set by build option: %s" , cpp_headers_mode )
1107-
1108- if cpp_headers_mode not in SEARCH_PATH_CPP_HEADERS :
1109- raise EasyBuildError (
1110- "Unknown value selected for option search-path-cpp-headers: %s. Choose one of: %s" ,
1111- cpp_headers_mode , ", " .join (SEARCH_PATH_CPP_HEADERS )
1112- )
1113-
1114- for env_var in SEARCH_PATH_CPP_HEADERS [cpp_headers_mode ]:
1121+ for env_var in SEARCH_PATH ["cpp_headers" ][self .search_path ["cpp_headers" ]]:
11151122 self .log .debug ("Adding header paths to toolchain variable '%s': %s" , env_var , dep_root )
11161123 self .variables .append_subdirs (env_var , dep_root , subdirs = header_dirs )
11171124
@@ -1125,24 +1132,7 @@ def _add_dependency_linker_paths(self, dep_root, extra_dirs=None):
11251132 lib_dirs = ["lib64" , "lib" ]
11261133 lib_dirs = unique_ordered_extend (lib_dirs , extra_dirs )
11271134
1128- # mode of operation is defined by search-path-linker option
1129- # toolchain option has precedence over build option
1130- linker_mode = DEFAULT_SEARCH_PATH_LINKER
1131- build_opt = build_option ("search_path_linker" )
1132- if self .options .get ("search-path-linker" ) is not None :
1133- linker_mode = self .options .option ("search-path-linker" )
1134- self .log .debug ("search-path-linker set by toolchain option: %s" , linker_mode )
1135- elif build_opt is not None :
1136- linker_mode = build_opt
1137- self .log .debug ("search-path-linker set by build option: %s" , linker_mode )
1138-
1139- if linker_mode not in SEARCH_PATH_LINKER :
1140- raise EasyBuildError (
1141- "Unknown value selected for option search-path-linker: %s. Choose one of: %s" ,
1142- linker_mode , ", " .join (SEARCH_PATH_LINKER )
1143- )
1144-
1145- for env_var in SEARCH_PATH_LINKER [linker_mode ]:
1135+ for env_var in SEARCH_PATH ["linker" ][self .search_path ["linker" ]]:
11461136 self .log .debug ("Adding lib paths to toolchain variable '%s': %s" , env_var , dep_root )
11471137 self .variables .append_subdirs (env_var , dep_root , subdirs = lib_dirs )
11481138
0 commit comments