Skip to content

Commit 6231a06

Browse files
committed
Add a python script which can be used to build xeus-cpp
1 parent 5860e95 commit 6231a06

1 file changed

Lines changed: 191 additions & 0 deletions

File tree

scripts/xeus-cpp-build.py

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
import argparse
2+
import os
3+
import platform
4+
import subprocess
5+
from pathlib import Path
6+
7+
def build_native(launch_lab=False):
8+
repo_dir = Path.cwd()
9+
10+
subprocess.run(["micromamba", "create", "-f", "environment-dev.yml", "-y"])
11+
subprocess.run(["micromamba", "install", "-n" , "xeus-cpp", "jupyterlab", "-c", "conda-forge", "-y"])
12+
13+
prefix_path = os.environ.get("MAMBA_ROOT_PREFIX")
14+
build_dir = repo_dir / "build"
15+
build_dir.mkdir(exist_ok=True)
16+
17+
cmake_cmd = [
18+
"micromamba","run","-n","xeus-cpp","cmake", "..",
19+
f"-DCMAKE_PREFIX_PATH={prefix_path}/envs/xeus-cpp/",
20+
f"-DCMAKE_INSTALL_PREFIX={prefix_path}/envs/xeus-cpp/",
21+
"-DCMAKE_INSTALL_LIBDIR=lib"
22+
]
23+
24+
subprocess.run(cmake_cmd, cwd=build_dir)
25+
subprocess.run(["micromamba","run","-n","xeus-cpp","make", "check-xeus-cpp"], cwd=build_dir)
26+
27+
subprocess.run(["make", "install"], cwd=build_dir)
28+
subprocess.run([f"{prefix_path}/envs/xeus-cpp/bin/pytest", "-sv", "test_xcpp_kernel.py"], cwd=repo_dir / "test")
29+
30+
if launch_lab:
31+
subprocess.run([f"{prefix_path}/envs/xeus-cpp/bin/jupyter-lab"])
32+
33+
34+
def build_emscripten(run_browser_tests_flag=False, launch_lite=False):
35+
repo_dir = Path.cwd()
36+
37+
subprocess.run(["micromamba", "create", "-f", "environment-wasm-build.yml", "-y"])
38+
subprocess.run(["micromamba", "create", "-f", "environment-wasm-host.yml", "--platform=emscripten-wasm32", "-y"])
39+
40+
mamba_root = os.environ.get("MAMBA_ROOT_PREFIX")
41+
42+
build_prefix = f"{mamba_root}/envs/xeus-cpp-wasm-build"
43+
prefix = f"{mamba_root}/envs/xeus-cpp-wasm-host"
44+
sysroot_path = f"{build_prefix}/opt/emsdk/upstream/emscripten/cache/sysroot"
45+
46+
subprocess.run(["micromamba", "create", "-n", "node-env", "-c", "conda-forge", "nodejs=22", "-y"])
47+
48+
# Build
49+
build_dir = repo_dir / "build"
50+
build_dir.mkdir(exist_ok=True)
51+
52+
cmake_cmd = (
53+
'eval "$(micromamba shell hook --shell bash)" && '
54+
'micromamba activate xeus-cpp-wasm-build && '
55+
f'export PATH={mamba_root}/envs/node-env/bin:$PATH &&'
56+
'emcmake cmake '
57+
f'-DCMAKE_BUILD_TYPE=Release '
58+
f'-DCMAKE_INSTALL_PREFIX={prefix} '
59+
'-DXEUS_CPP_EMSCRIPTEN_WASM_BUILD=ON '
60+
f'-DCMAKE_FIND_ROOT_PATH={prefix} '
61+
f'-DSYSROOT_PATH={sysroot_path} '
62+
'..'
63+
)
64+
subprocess.run(cmake_cmd, cwd=build_dir, shell=True)
65+
make_cmd = (
66+
'eval "$(micromamba shell hook --shell bash)" && '
67+
'micromamba activate xeus-cpp-wasm-build && '
68+
f'export PATH={mamba_root}/envs/node-env/bin:$PATH &&'
69+
'emmake make check-xeus-cpp'
70+
)
71+
subprocess.run(make_cmd, cwd=build_dir, shell=True)
72+
install_cmd = (
73+
f'export PATH={mamba_root}/node-env/bin:$PATH &&'
74+
'eval "$(micromamba shell hook --shell bash)" && '
75+
'micromamba activate xeus-cpp-wasm-build && '
76+
f'export PATH={mamba_root}/envs/node-env/bin:$PATH &&'
77+
'emmake make install'
78+
)
79+
subprocess.run(install_cmd, cwd=build_dir, shell=True)
80+
81+
if run_browser_tests_flag:
82+
emrun_path = f"{build_prefix}/bin/emrun.py"
83+
84+
if platform.system() == "Darwin":
85+
browser_install_cmd = (
86+
'wget "https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" -O Firefox-latest.dmg && '
87+
'hdiutil attach Firefox-latest.dmg && '
88+
'cp -r /Volumes/Firefox/Firefox.app . && '
89+
'hdiutil detach /Volumes/Firefox && '
90+
'wget https://dl.google.com/chrome/mac/stable/accept_tos%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen_ph%252Fchrome%252Fterms%252F%26_and_accept_tos%3Dhttps%253A%252F%252Fpolicies.google.com%252Fterms/googlechrome.pkg && '
91+
'pkgutil --expand-full googlechrome.pkg google-chrome'
92+
)
93+
subprocess.run(browser_install_cmd, cwd=build_dir / "test", shell=True)
94+
browsers = {"Firefox": 'firefox', "Google Chrome": 'Google Chrome'}
95+
for name, browser in browsers.items():
96+
print(f"\nRunning headless tests in {name}")
97+
browser_args = "--headless"
98+
if "Chrome" in name:
99+
browser_args += " --no-sandbox"
100+
101+
browser_test_cmd = (
102+
'eval "$(micromamba shell hook --shell bash)" && '
103+
'micromamba activate xeus-cpp-wasm-build && '
104+
f'export PATH="{build_dir}/test/Firefox.app/Contents/MacOS:{build_dir}/test/google-chrome/GoogleChrome.pkg/Payload/Google Chrome.app/Contents/MacOS/:$PATH" && '
105+
f'python {emrun_path} --browser="{browser}" --kill_exit --timeout 60 --browser-args="{browser_args}" test_xeus_cpp.html'
106+
)
107+
108+
subprocess.run(browser_test_cmd, cwd=build_dir / "test", shell=True)
109+
# FIXME: Currently assumed that safari driver is enabled and that Selenium is installed
110+
print("\nRunning Safari test via safaridriver")
111+
safari_cmd = (
112+
'eval "$(micromamba shell hook --shell bash)" && '
113+
'micromamba activate xeus-cpp-wasm-build && '
114+
f'python {emrun_path} --no_browser --kill_exit --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" test_xeus_cpp.html & '
115+
f'python {repo_dir}/scripts/browser_tests_safari.py test_xeus_cpp.html'
116+
)
117+
subprocess.run(safari_cmd, cwd=build_dir / "test", shell=True)
118+
119+
elif platform.system() == "Linux":
120+
browser_install_cmd = (
121+
'wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&& '
122+
'dpkg-deb -x google-chrome-stable_current_amd64.deb $PWD/chrome && '
123+
'wget https://ftp.mozilla.org/pub/firefox/releases/138.0.1/linux-x86_64/en-GB/firefox-138.0.1.tar.xz && '
124+
'tar -xJf firefox-138.0.1.tar.xz'
125+
)
126+
browsers = {"Firefox": 'firefox', "Google Chrome": 'google-chrome'}
127+
for name, browser in browsers.items():
128+
print(f"\nRunning headless tests in {name}")
129+
browser_args = "--headless"
130+
if "chrome" in name:
131+
browser_args += " --no-sandbox"
132+
133+
browser_test_cmd = (
134+
'eval "$(micromamba shell hook --shell bash)" && '
135+
'micromamba activate xeus-cpp-wasm-build && '
136+
f'export PATH="{build_dir}/test/chrome/opt/google/chrome/:{build_dir}/test/firefox/:$PATH" && '
137+
f'python {emrun_path} --browser="{browser}" --kill_exit --timeout 60 --browser-args="{browser_args}" test_xeus_cpp.html'
138+
)
139+
140+
subprocess.run(browser_test_cmd, cwd=build_dir / "test", shell=True)
141+
142+
if launch_lite:
143+
subprocess.run([
144+
"micromamba", "create", "-n", "xeus-lite-host",
145+
"jupyterlite-core=0.6", "jupyter_server", "jupyterlite-xeus",
146+
"-c", "conda-forge", "-y"
147+
])
148+
149+
serve_cmd = [
150+
'eval "$(micromamba shell hook --shell bash)" && '
151+
'micromamba activate xeus-lite-host && '
152+
'jupyter lite serve '
153+
f'--XeusAddon.prefix={prefix} '
154+
f'--XeusAddon.mounts={prefix}/share/xeus-cpp/tagfiles:/share/xeus-cpp/tagfiles '
155+
f'--XeusAddon.mounts={prefix}/etc/xeus-cpp/tags.d:/etc/xeus-cpp/tags.d '
156+
f'--contents {repo_dir}/README.md '
157+
f'--contents {repo_dir}/notebooks/xeus-cpp-lite-demo.ipynb '
158+
f'--contents {repo_dir}/notebooks/smallpt.ipynb '
159+
f'--contents {repo_dir}/notebooks/images/marie.png '
160+
f'--contents {repo_dir}/notebooks/audio/audio.wav '
161+
]
162+
subprocess.run(serve_cmd, cwd=repo_dir, shell=True)
163+
164+
def main():
165+
parser = argparse.ArgumentParser(description="Build xeus-cpp (native or emscripten).")
166+
parser.add_argument(
167+
"--build", choices=["native", "emscripten"], default="native",
168+
help="Choose build type (default: native)"
169+
)
170+
parser.add_argument(
171+
"--run-browser-tests", action="store_true",
172+
help="Run headless browser tests after Emscripten build"
173+
)
174+
parser.add_argument(
175+
"--launch-lite", action="store_true",
176+
help="Launch a local JupyterLite demo after Emscripten build"
177+
)
178+
parser.add_argument(
179+
"--launch-lab", action="store_true",
180+
help="Launch JupyterLab after native build"
181+
)
182+
args = parser.parse_args()
183+
184+
if args.build == "emscripten":
185+
build_emscripten(run_browser_tests_flag=args.run_browser_tests, launch_lite=args.launch_lite)
186+
else:
187+
build_native(launch_lab=args.launch_lab)
188+
189+
190+
if __name__ == "__main__":
191+
main()

0 commit comments

Comments
 (0)