Skip to content

Commit f38d280

Browse files
committed
Emscripten build of CppInterOp on Windows
1 parent da58066 commit f38d280

File tree

5 files changed

+395
-69
lines changed

5 files changed

+395
-69
lines changed

.github/workflows/emscripten.yml

+178-46
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ jobs:
4242
llvm_enable_projects: "clang;lld"
4343
llvm_targets_to_build: "WebAssembly"
4444
emsdk_ver: "3.1.73"
45+
- name: win2025-x86-clang-repl-19-emscripten
46+
os: windows-2025
47+
clang-runtime: '19'
48+
cling: Off
49+
llvm_enable_projects: "clang;lld"
50+
llvm_targets_to_build: "WebAssembly"
51+
emsdk_ver: "3.1.73"
4552

4653
steps:
4754
- uses: actions/checkout@v4
@@ -113,7 +120,7 @@ jobs:
113120
lookup-only: true
114121

115122
- name: Setup emsdk
116-
if: ${{ runner.os != 'windows' && steps.cache.outputs.cache-hit != 'true' }}
123+
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
117124
run: |
118125
git clone --depth=1 https://github.com/emscripten-core/emsdk.git
119126
cd emsdk
@@ -136,8 +143,9 @@ jobs:
136143
- name: Install deps on Windows
137144
if: ${{ runner.os == 'windows' && steps.cache.outputs.cache-hit != 'true' }}
138145
run: |
139-
choco install findutils
146+
choco install findutils ninja
140147
$env:PATH="C:\Program Files (x86)\GnuWin32\bin;$env:PATH"
148+
$env:PATH="C:\Program Files (x86)\Ninja\bin;$env:PATH"
141149
142150
- name: Install deps on MacOS
143151
if: ${{ runner.os == 'macOS' && steps.cache.outputs.cache-hit != 'true' }}
@@ -258,10 +266,13 @@ jobs:
258266
fi
259267
260268
261-
- name: Build LLVM/Cling on Windows systems if the cache is invalid
269+
- name: Build LLVM/Cling on Windows systems if the cache is invalid (emscripten)
262270
if: ${{ runner.os == 'windows' && steps.cache.outputs.cache-hit != 'true' }}
263271
run: |
264-
272+
$env:CC="clang-cl"
273+
$env:CXX="clang-cl"
274+
.\emsdk\emsdk activate ${{matrix.emsdk_ver}}
275+
.\emsdk\emsdk_env.ps1
265276
if ( "${{ matrix.cling }}" -imatch "On" )
266277
{
267278
git clone https://github.com/root-project/cling.git
@@ -284,54 +295,66 @@ jobs:
284295
if ( "${{ matrix.cling }}" -imatch "On" )
285296
{
286297
cd build
287-
cmake -DLLVM_ENABLE_PROJECTS="${{ matrix.llvm_enable_projects}}" `
288-
-DLLVM_EXTERNAL_PROJECTS=cling `
289-
-DLLVM_EXTERNAL_CLING_SOURCE_DIR="$env:CLING_DIR" `
290-
-DLLVM_TARGETS_TO_BUILD="${{ matrix.llvm_targets_to_build }}" `
291-
-DCMAKE_BUILD_TYPE=Release `
292-
-DLLVM_ENABLE_ASSERTIONS=ON `
293-
-DCLANG_ENABLE_STATIC_ANALYZER=OFF `
294-
-DCLANG_ENABLE_ARCMT=OFF `
295-
-DCLANG_ENABLE_FORMAT=OFF `
296-
-DCLANG_ENABLE_BOOTSTRAP=OFF `
297-
-DLLVM_ENABLE_ZSTD=OFF `
298-
-DLLVM_ENABLE_TERMINFO=OFF `
299-
-DLLVM_ENABLE_LIBXML2=OFF `
298+
emcmake cmake -DLLVM_EXTERNAL_PROJECTS=cling `
299+
-DLLVM_EXTERNAL_CLING_SOURCE_DIR=../../cling `
300+
-DCMAKE_BUILD_TYPE=Release `
301+
-DLLVM_HOST_TRIPLE=wasm32-unknown-emscripten `
302+
-DLLVM_ENABLE_ASSERTIONS=ON `
303+
-DLLVM_TARGETS_TO_BUILD="${{ matrix.llvm_targets_to_build }}" `
304+
-DLLVM_ENABLE_LIBEDIT=OFF `
305+
-DLLVM_ENABLE_PROJECTS="${{ matrix.llvm_enable_projects }}" `
306+
-DLLVM_ENABLE_ZSTD=OFF `
307+
-DLLVM_ENABLE_LIBXML2=OFF `
308+
-DCLANG_ENABLE_STATIC_ANALYZER=OFF `
309+
-DCLANG_ENABLE_ARCMT=OFF `
310+
-DCLANG_ENABLE_BOOTSTRAP=OFF `
311+
-DCMAKE_CXX_FLAGS="-Dwait4=__syscall_wait4" `
312+
-DLLVM_INCLUDE_BENCHMARKS=OFF `
313+
-DLLVM_INCLUDE_EXAMPLES=OFF `
314+
-DLLVM_INCLUDE_TESTS=OFF `
315+
-DLLVM_ENABLE_THREADS=OFF `
316+
-G Ninja `
317+
-DLLVM_BUILD_TOOLS=OFF `
318+
-DLLVM_ENABLE_LIBPFM=OFF `
319+
-DCLANG_BUILD_TOOLS=OFF `
300320
..\llvm
301-
cmake --build . --config Release --target clang --parallel ${{ env.ncpus }}
302-
cmake --build . --config Release --target cling --parallel ${{ env.ncpus }}
303-
# Now build gtest.a and gtest_main for CppInterOp to run its tests.
304-
cmake --build . --config Release --target gtest_main --parallel ${{ env.ncpus }}
321+
emmake make clang cling lld gtest_main
305322
}
306323
else
307324
{
308-
cp -r ..\patches\llvm\clang${{ matrix.clang-runtime }}*
325+
cp -r ..\patches\llvm\emscripten-clang${{ matrix.clang-runtime }}*
326+
cp -r ..\patches\llvm\Windows-emscripten-clang${{ matrix.clang-runtime }}*
309327
#FIXME: Apply patches without hardcoding
310-
if ( "${{ matrix.clang-runtime }}" -imatch "16" )
328+
if ( "${{ matrix.clang-runtime }}" -imatch "19" )
311329
{
312-
git apply -v clang16-1-Value.patch
313-
git apply -v clang16-2-CUDA.patch
314-
git apply -v clang16-3-WeakRef.patch
315-
}
316-
elseif ( "${{ matrix.clang-runtime }}" -imatch "17" )
317-
{
318-
git apply -v clang17-1-NewOperator.patch
330+
git apply -v Windows-emscripten-clang19-1-CrossCompile.patch
331+
git apply -v emscripten-clang19-2-shift-temporary-files-to-tmp-dir.patch
332+
git apply -v emscripten-clang19-3-remove-zdefs.patch
319333
}
320334
cd build
321335
echo "Apply clang${{ matrix.clang-runtime }}-*.patch patches:"
322-
cmake -DLLVM_ENABLE_PROJECTS="${{ matrix.llvm_enable_projects}}" `
323-
-DLLVM_TARGETS_TO_BUILD="${{ matrix.llvm_targets_to_build }}" `
324-
-DCMAKE_BUILD_TYPE=Release `
325-
-DLLVM_ENABLE_ASSERTIONS=ON `
326-
-DCLANG_ENABLE_STATIC_ANALYZER=OFF `
327-
-DCLANG_ENABLE_ARCMT=OFF `
328-
-DCLANG_ENABLE_FORMAT=OFF `
329-
-DCLANG_ENABLE_BOOTSTRAP=OFF `
330-
-DLLVM_ENABLE_ZSTD=OFF `
331-
-DLLVM_ENABLE_TERMINFO=OFF `
332-
-DLLVM_ENABLE_LIBXML2=OFF `
333-
..\llvm
334-
cmake --build . --config Release --target clang clang-repl --parallel ${{ env.ncpus }}
336+
emcmake cmake -DCMAKE_BUILD_TYPE=Release `
337+
-DLLVM_HOST_TRIPLE=wasm32-unknown-emscripten `
338+
-DLLVM_ENABLE_ASSERTIONS=ON `
339+
-DLLVM_TARGETS_TO_BUILD="${{ matrix.llvm_targets_to_build }}" `
340+
-DLLVM_ENABLE_LIBEDIT=OFF `
341+
-DLLVM_ENABLE_PROJECTS="${{ matrix.llvm_enable_projects }}" `
342+
-DLLVM_ENABLE_ZSTD=OFF `
343+
-DLLVM_ENABLE_LIBXML2=OFF `
344+
-DCLANG_ENABLE_STATIC_ANALYZER=OFF `
345+
-DCLANG_ENABLE_ARCMT=OFF `
346+
-DCLANG_ENABLE_BOOTSTRAP=OFF `
347+
-DCMAKE_CXX_FLAGS="-Dwait4=__syscall_wait4" `
348+
-DLLVM_INCLUDE_BENCHMARKS=OFF `
349+
-DLLVM_INCLUDE_EXAMPLES=OFF `
350+
-DLLVM_INCLUDE_TESTS=OFF `
351+
-DLLVM_ENABLE_THREADS=OFF `
352+
-DLLVM_BUILD_TOOLS=OFF `
353+
-DLLVM_ENABLE_LIBPFM=OFF `
354+
-DCLANG_BUILD_TOOLS=OFF `
355+
-G Ninja `
356+
..\llvm
357+
emmake ninja libclang clangInterpreter clangStaticAnalyzerCore lldWasm
335358
}
336359
cd ..\
337360
rm -r -force $(find.exe . -maxdepth 1 ! -name "build" ! -name "llvm" ! -name "clang" ! -name ".")
@@ -352,9 +375,9 @@ jobs:
352375
cd ..\..
353376
}
354377
355-
- name: Save Cache LLVM/Clang runtime build directory (Unix Systems Emscripten)
378+
- name: Save Cache LLVM/Clang runtime build directory
356379
uses: actions/cache/save@v4
357-
if: ${{ runner.os != 'windows' && steps.cache.outputs.cache-hit != 'true' }}
380+
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
358381
with:
359382
path: |
360383
llvm-project
@@ -387,6 +410,12 @@ jobs:
387410
cling: Off
388411
micromamba_shell_init: bash
389412
emsdk_ver: "3.1.73"
413+
- name: win2025-x86-clang-repl-19-emscripten
414+
os: windows-2025
415+
clang-runtime: '19'
416+
cling: Off
417+
micromamba_shell_init: powershell
418+
emsdk_ver: "3.1.73"
390419

391420
steps:
392421
- uses: actions/checkout@v4
@@ -426,6 +455,14 @@ jobs:
426455
echo "ncpus=$(nproc --all)" >> $GITHUB_ENV
427456
fi
428457
458+
- name: Setup default Build Type on Windows
459+
if: ${{ runner.os == 'windows' }}
460+
run: |
461+
echo "BUILD_TYPE=Release" >> $env:GITHUB_ENV
462+
echo "CODE_COVERAGE=0" >> $env:GITHUB_ENV
463+
$env:ncpus=$([Environment]::ProcessorCount)
464+
echo "ncpus=$env:ncpus" >> $env:GITHUB_ENV
465+
429466
- name: install mamba
430467
uses: mamba-org/setup-micromamba@main
431468
with:
@@ -517,7 +554,101 @@ jobs:
517554
echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV
518555
echo "PREFIX=$PREFIX" >> $GITHUB_ENV
519556
557+
- name: micromamba shell hook
558+
if: ${{ runner.os == 'windows' }}
559+
shell: powershell
560+
run: |
561+
micromamba shell hook -s cmd.exe --root-prefix C:\Users\runneradmin\micromamba-root
562+
563+
- name: Build and Test/Install CppInterOp on Windows systems
564+
continue-on-error: true
565+
if: ${{ runner.os == 'windows' }}
566+
shell: powershell
567+
run: |
568+
micromamba create -f environment-wasm.yml --platform=emscripten-wasm32
569+
.\emsdk\emsdk activate ${{matrix.emsdk_ver}}
570+
.\emsdk\emsdk_env.ps1
571+
$env:PWD_DIR= $PWD.Path
572+
573+
$env:SYSROOT_PATH="$env:PWD_DIR/emsdk/upstream/emscripten/cache/sysroot"
574+
$env:PREFIX="%CONDA_PREFIX%/envs/CppInterOp-wasm"
575+
$env:CMAKE_PREFIX_PATH=$env:PREFIX
576+
$env:CMAKE_SYSTEM_PREFIX_PATH=$env:PREFIX
577+
578+
$env:LLVM_DIR="$env:PWD_DIR\llvm-project"
579+
echo "LLVM_DIR=$env:LLVM_DIR"
580+
echo "LLVM_DIR=$env:LLVM_DIR" >> $env:GITHUB_ENV
581+
582+
$env:LLVM_BUILD_DIR="$env:PWD_DIR\llvm-project\build"
583+
echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR"
584+
echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $env:GITHUB_ENV
585+
586+
if ( "${{ matrix.cling }}" -imatch "On" )
587+
{
588+
$env:CLING_DIR="$env:PWD_DIR\cling"
589+
echo "CLING_DIR=$env:CLING_DIR"
590+
echo "CLING_DIR=$env:CLING_DIR" >> $env:GITHUB_ENV
591+
592+
$env:CLING_BUILD_DIR="$env:PWD_DIR\cling\build"
593+
echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR"
594+
echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" >> $env:GITHUB_ENV
595+
596+
$env:CPLUS_INCLUDE_PATH="$env:CLING_DIR\tools\cling\include;$env:CLING_BUILD_DIR\include;$env:LLVM_DIR\llvm\include;$env:LLVM_DIR\clang\include;$env:LLVM_BUILD_DIR\include;$env:LLVM_BUILD_DIR\tools\clang\include;$env:PWD_DIR\include;"
597+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH"
598+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV
599+
}
600+
else
601+
{
602+
$env:CPLUS_INCLUDE_PATH="$env:LLVM_DIR\llvm\include;$env:LLVM_DIR\clang\include;$env:LLVM_BUILD_DIR\include;$env:LLVM_BUILD_DIR\tools\clang\include;$env:PWD_DIR\include;"
603+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH"
604+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV
605+
}
606+
607+
# Build CppInterOp next to cling and llvm-project.
608+
mkdir build
609+
cd build
610+
$env:CPPINTEROP_BUILD_DIR="$env:PWD_DIR"
611+
echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR"
612+
echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR" >> $env:GITHUB_ENV
613+
if ( "${{ matrix.cling }}" -imatch "On" )
614+
{
615+
emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} `
616+
-DCPPINTEROP_USE_CLING=ON `
617+
-DCPPINTEROP_USE_REPL=OFF `
618+
-DCMAKE_PREFIX_PATH="$env:PREFIX" `
619+
-DCling_DIR="$env:LLVM_BUILD_DIR\tools\cling" `
620+
-DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" `
621+
-DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" `
622+
-DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" `
623+
-DBUILD_SHARED_LIBS=ON `
624+
-DCODE_COVERAGE=${{ env.CODE_COVERAGE }} `
625+
-DCMAKE_INSTALL_PREFIX=$env:PREFIX `
626+
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON `
627+
-DLLVM_ENABLE_WERROR=On `
628+
-DSYSROOT_PATH="$env:SYSROOT_PATH" `
629+
..\
630+
}
631+
else
632+
{
633+
emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} `
634+
-DCMAKE_PREFIX_PATH="$env:PREFIX" `
635+
-DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" `
636+
-DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" `
637+
-DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" `
638+
-DBUILD_SHARED_LIBS=ON `
639+
-DCODE_COVERAGE=${{ env.CODE_COVERAGE }} `
640+
-DCMAKE_INSTALL_PREFIX=$env:PREFIX `
641+
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON `
642+
-DLLVM_ENABLE_WERROR=On `
643+
-DSYSROOT_PATH="$env:SYSROOT_PATH" `
644+
..\
645+
}
646+
emmake make -j ${{ env.ncpus }} check-cppinterop
647+
emmake make -j ${{ env.ncpus }} install
648+
649+
520650
- name: Build xeus-cpp
651+
if: ${{ runner.os != 'windows' }}
521652
shell: bash -l {0}
522653
run: |
523654
./emsdk/emsdk activate ${{matrix.emsdk_ver}}
@@ -540,9 +671,10 @@ jobs:
540671
emmake make -j ${{ env.ncpus }} install
541672
542673
- name: Test xeus-cpp C++ Emscripten
674+
if: ${{ runner.os != 'windows' }}
543675
shell: bash -l {0}
544676
run: |
545677
set -e
546678
micromamba activate CppInterOp-wasm
547679
cd ./xeus-cpp/build/test
548-
node test_xeus_cpp.js
680+
node test_xeus_cpp.js

0 commit comments

Comments
 (0)