Skip to content

Commit 9f38c46

Browse files
committed
avoid parsing search-path toolchain options more than once
1 parent 30a4ce9 commit 9f38c46

File tree

2 files changed

+42
-53
lines changed

2 files changed

+42
-53
lines changed

easybuild/tools/options.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,7 @@
101101
from easybuild.tools.run import run_shell_cmd
102102
from easybuild.tools.package.utilities import avail_package_naming_schemes
103103
from easybuild.tools.toolchain.compiler import DEFAULT_OPT_LEVEL, OPTARCH_MAP_CHAR, OPTARCH_SEP, Compiler
104-
from easybuild.tools.toolchain.toolchain import DEFAULT_SEARCH_PATH_CPP_HEADERS, DEFAULT_SEARCH_PATH_LINKER
105-
from easybuild.tools.toolchain.toolchain import SEARCH_PATH_CPP_HEADERS, SEARCH_PATH_LINKER, SYSTEM_TOOLCHAIN_NAME
104+
from easybuild.tools.toolchain.toolchain import DEFAULT_SEARCH_PATH_CPP_HEADERS, DEFAULT_SEARCH_PATH_LINKER, SEARCH_PATH
106105
from easybuild.tools.repository.repository import avail_repositories
107106
from easybuild.tools.systemtools import DARWIN, UNKNOWN, check_python_version, get_cpu_architecture, get_cpu_family
108107
from easybuild.tools.systemtools import get_cpu_features, get_gpu_info, get_os_type, get_system_info
@@ -625,9 +624,9 @@ def config_options(self):
625624
"For more info, use --avail-repositories."),
626625
'strlist', 'store', self.default_repositorypath),
627626
'search-path-cpp-headers': ("Search path used at build time for include directories", 'choice',
628-
'store', DEFAULT_SEARCH_PATH_CPP_HEADERS, [*SEARCH_PATH_CPP_HEADERS]),
627+
'store', DEFAULT_SEARCH_PATH_CPP_HEADERS, [*SEARCH_PATH["cpp_headers"]]),
629628
'search-path-linker': ("Search path used at build time by the linker for libraries", 'choice',
630-
'store', DEFAULT_SEARCH_PATH_LINKER, [*SEARCH_PATH_LINKER]),
629+
'store', DEFAULT_SEARCH_PATH_LINKER, [*SEARCH_PATH["linker"]]),
631630
'sourcepath': ("Path(s) to where sources should be downloaded (string, colon-separated)",
632631
None, 'store', mk_full_default_path('sourcepath')),
633632
'subdir-modules': ("Installpath subdir for modules", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_modules']),

easybuild/tools/toolchain/toolchain.py

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,19 @@
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

114116
def 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

Comments
 (0)