Skip to content

Commit 74947d6

Browse files
authored
Merge pull request #2174 from IntelPython/update-gen-coverage-script
Update `gen_coverage` and `gen_docs` to align with `build_locally`
2 parents 0648317 + 35f91ea commit 74947d6

File tree

4 files changed

+476
-374
lines changed

4 files changed

+476
-374
lines changed

scripts/_build_helper.py

Lines changed: 61 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,11 @@
2020
import sys
2121

2222

23-
def run(cmd, env=None, cwd=None):
24-
print("+", " ".join(cmd))
25-
subprocess.check_call(
26-
cmd, env=env or os.environ.copy(), cwd=cwd or os.getcwd()
27-
)
28-
29-
30-
def warn(msg: str):
31-
print(f"[build_locally][error] {msg}", file=sys.stderr)
32-
33-
34-
def err(msg: str):
35-
print(f"[build_locally][error] {msg}", file=sys.stderr)
36-
37-
3823
def resolve_compilers(
39-
oneapi: bool, c_compiler: str, cxx_compiler: str, compiler_root: str
24+
oneapi: bool,
25+
c_compiler: str,
26+
cxx_compiler: str,
27+
compiler_root: str,
4028
):
4129
is_linux = "linux" in sys.platform
4230

@@ -45,10 +33,14 @@ def resolve_compilers(
4533
):
4634
return "icx", ("icpx" if is_linux else "icx")
4735

48-
if not compiler_root or not os.path.exists(compiler_root):
36+
if (
37+
(c_compiler is None or not os.path.isabs(c_compiler))
38+
and (cxx_compiler is None or not os.path.isabs(cxx_compiler))
39+
and (not compiler_root or not os.path.exists(compiler_root))
40+
):
4941
raise RuntimeError(
5042
"--compiler-root option must be set when using non-default DPC++ "
51-
"layout"
43+
"layout unless absolute paths are provided for both compilers"
5244
)
5345

5446
# default values
@@ -61,34 +53,54 @@ def resolve_compilers(
6153
(c_compiler, "--c-compiler"),
6254
(cxx_compiler, "--cxx-compiler"),
6355
):
64-
path = (
65-
name if os.path.exists(name) else os.path.join(compiler_root, name)
66-
)
56+
if os.path.isabs(name):
57+
path = name
58+
else:
59+
path = os.path.join(compiler_root, name)
6760
if not os.path.exists(path):
6861
raise RuntimeError(f"{opt_name} value {name} not found")
6962
return c_compiler, cxx_compiler
7063

7164

65+
def run(cmd: list[str], env: dict[str, str] = None, cwd: str = None):
66+
print("+", " ".join(cmd))
67+
subprocess.check_call(
68+
cmd, env=env or os.environ.copy(), cwd=cwd or os.getcwd()
69+
)
70+
71+
72+
def get_output(cmd: list[str], cwd: str = None):
73+
print("+", " ".join(cmd))
74+
return (
75+
subprocess.check_output(cmd, cwd=cwd or os.getcwd())
76+
.decode("utf-8")
77+
.strip("\n")
78+
)
79+
80+
81+
def warn(msg: str, script: str):
82+
print(f"[{script}][warning] {msg}", file=sys.stderr)
83+
84+
85+
def err(msg: str, script: str):
86+
print(f"[{script}][error] {msg}", file=sys.stderr)
87+
88+
7289
def make_cmake_args(
73-
build_type="Release",
74-
c_compiler=None,
75-
cxx_compiler=None,
76-
level_zero=True,
77-
glog=False,
78-
generator=None,
79-
verbose=False,
80-
other_opts="",
90+
c_compiler: str = None,
91+
cxx_compiler: str = None,
92+
level_zero: bool = True,
93+
glog: bool = False,
94+
verbose: bool = False,
95+
other_opts: str = None,
8196
):
8297
args = [
83-
f"-DCMAKE_BUILD_TYPE={build_type}",
8498
f"-DCMAKE_C_COMPILER:PATH={c_compiler}" if c_compiler else "",
8599
f"-DCMAKE_CXX_COMPILER:PATH={cxx_compiler}" if cxx_compiler else "",
86100
f"-DDPCTL_ENABLE_L0_PROGRAM_CREATION={'ON' if level_zero else 'OFF'}",
87101
f"-DDPTL_ENABLE_GLOG:BOOL={'ON' if glog else 'OFF'}",
88102
]
89103

90-
if generator:
91-
args.append(f"-G{generator}")
92104
if verbose:
93105
args.append("-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON")
94106
if other_opts:
@@ -97,15 +109,28 @@ def make_cmake_args(
97109
return " ".join(filter(None, args))
98110

99111

100-
def build_extension(setup_dir, env):
112+
def build_extension(
113+
setup_dir: str,
114+
env: dict[str, str],
115+
cmake_executable: str = None,
116+
generator: str = None,
117+
build_type: str = None,
118+
):
119+
cmd = [sys.executable, "setup.py", "build_ext", "--inplace"]
120+
if cmake_executable:
121+
cmd.append(f"--cmake-executable={cmake_executable}")
122+
if generator:
123+
cmd.append(f"--generator={generator}")
124+
if build_type:
125+
cmd.append(f"--build-type={build_type}")
101126
run(
102-
[sys.executable, "setup.py", "build_ext", "--inplace"],
127+
cmd,
103128
env=env,
104129
cwd=setup_dir,
105130
)
106131

107132

108-
def install_editable(setup_dir, env):
133+
def install_editable(setup_dir: str, env: dict[str, str]):
109134
run(
110135
[
111136
sys.executable,
@@ -121,7 +146,7 @@ def install_editable(setup_dir, env):
121146
)
122147

123148

124-
def clean_build_dir(setup_dir):
149+
def clean_build_dir(setup_dir: str = None):
125150
target = os.path.join(setup_dir or os.getcwd(), "_skbuild")
126151
if os.path.exists(target):
127152
print(f"Cleaning build directory: {target}")

scripts/build_locally.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def parse_args():
124124
p.add_argument(
125125
"--clean",
126126
action="store_true",
127-
help="Remove build dir before rebuild (default: False)",
127+
help="Remove build dir before rebuild",
128128
)
129129
p.add_argument(
130130
"--skip-editable",
@@ -137,7 +137,7 @@ def parse_args():
137137

138138
def main():
139139
if sys.platform not in ["cygwin", "win32", "linux"]:
140-
err(f"{sys.platform} not supported")
140+
err(f"{sys.platform} not supported", "build_locally")
141141
args = parse_args()
142142
setup_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
143143

@@ -150,7 +150,10 @@ def main():
150150
clean_build_dir(setup_dir)
151151

152152
if args.no_level_zero and args.target_level_zero:
153-
err("Cannot combine --no-level-zero and --target-level-zero")
153+
err(
154+
"Cannot combine --no-level-zero and --target-level-zero",
155+
"build_locally",
156+
)
154157

155158
# Level Zero state (on unless explicitly disabled)
156159
if args.no_level_zero:
@@ -161,19 +164,17 @@ def main():
161164
level_zero_enabled = True
162165

163166
cmake_args = make_cmake_args(
164-
build_type=args.build_type,
165167
c_compiler=c_compiler,
166168
cxx_compiler=cxx_compiler,
167169
level_zero=level_zero_enabled,
168170
glog=args.glog,
169-
generator=args.generator,
170171
verbose=args.verbose,
171172
other_opts=args.cmake_opts,
172173
)
173174

174175
# handle architecture conflicts
175176
if args.target_hip is not None and not args.target_hip.strip():
176-
err("--target-hip requires an explicit architecture")
177+
err("--target-hip requires an explicit architecture", "build_locally")
177178

178179
# CUDA/HIP targets
179180
if args.target_cuda:
@@ -190,15 +191,21 @@ def main():
190191

191192
# ignore pre-existing CMAKE_ARGS for determinism in build driver
192193
if "CMAKE_ARGS" in env and env["CMAKE_ARGS"].strip():
193-
warn("Ignoring pre-existing CMAKE_ARGS in environment")
194+
warn("Ignoring pre-existing CMAKE_ARGS in environment", "build_locally")
194195
del env["CMAKE_ARGS"]
195196

196197
env["CMAKE_ARGS"] = cmake_args
197198
print(f"[build_locally] CMake args:\n {cmake_args}")
198199

199200
print("[build_locally] Building extensions in-place...")
200201

201-
build_extension(setup_dir, env)
202+
build_extension(
203+
setup_dir,
204+
env,
205+
cmake_executable=args.cmake_executable,
206+
generator=args.generator,
207+
build_type=args.build_type,
208+
)
202209
if not args.skip_editable:
203210
install_editable(setup_dir, env)
204211
else:

0 commit comments

Comments
 (0)