Skip to content

Commit 6975c54

Browse files
authored
Emscripten build of CppInterOp on Windows (#564)
1 parent 5c1e27a commit 6975c54

File tree

5 files changed

+392
-69
lines changed

5 files changed

+392
-69
lines changed

.github/workflows/emscripten.yml

+175-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,11 @@ 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+
.\emsdk\emsdk activate ${{matrix.emsdk_ver}}
273+
.\emsdk\emsdk_env.ps1
265274
if ( "${{ matrix.cling }}" -imatch "On" )
266275
{
267276
git clone https://github.com/root-project/cling.git
@@ -284,54 +293,66 @@ jobs:
284293
if ( "${{ matrix.cling }}" -imatch "On" )
285294
{
286295
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 `
296+
emcmake cmake -DLLVM_EXTERNAL_PROJECTS=cling `
297+
-DLLVM_EXTERNAL_CLING_SOURCE_DIR=../../cling `
298+
-DCMAKE_BUILD_TYPE=Release `
299+
-DLLVM_HOST_TRIPLE=wasm32-unknown-emscripten `
300+
-DLLVM_ENABLE_ASSERTIONS=ON `
301+
-DLLVM_TARGETS_TO_BUILD="${{ matrix.llvm_targets_to_build }}" `
302+
-DLLVM_ENABLE_LIBEDIT=OFF `
303+
-DLLVM_ENABLE_PROJECTS="${{ matrix.llvm_enable_projects }}" `
304+
-DLLVM_ENABLE_ZSTD=OFF `
305+
-DLLVM_ENABLE_LIBXML2=OFF `
306+
-DCLANG_ENABLE_STATIC_ANALYZER=OFF `
307+
-DCLANG_ENABLE_ARCMT=OFF `
308+
-DCLANG_ENABLE_BOOTSTRAP=OFF `
309+
-DCMAKE_CXX_FLAGS="-Dwait4=__syscall_wait4" `
310+
-DLLVM_INCLUDE_BENCHMARKS=OFF `
311+
-DLLVM_INCLUDE_EXAMPLES=OFF `
312+
-DLLVM_INCLUDE_TESTS=OFF `
313+
-DLLVM_ENABLE_THREADS=OFF `
314+
-G Ninja `
315+
-DLLVM_BUILD_TOOLS=OFF `
316+
-DLLVM_ENABLE_LIBPFM=OFF `
317+
-DCLANG_BUILD_TOOLS=OFF `
300318
..\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 }}
319+
emmake make clang cling lld gtest_main
305320
}
306321
else
307322
{
308-
cp -r ..\patches\llvm\clang${{ matrix.clang-runtime }}*
323+
cp -r ..\patches\llvm\emscripten-clang${{ matrix.clang-runtime }}*
324+
cp -r ..\patches\llvm\Windows-emscripten-clang${{ matrix.clang-runtime }}*
309325
#FIXME: Apply patches without hardcoding
310-
if ( "${{ matrix.clang-runtime }}" -imatch "16" )
326+
if ( "${{ matrix.clang-runtime }}" -imatch "19" )
311327
{
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
328+
git apply -v Windows-emscripten-clang19-1-CrossCompile.patch
329+
git apply -v emscripten-clang19-2-shift-temporary-files-to-tmp-dir.patch
330+
git apply -v emscripten-clang19-3-remove-zdefs.patch
319331
}
320332
cd build
321333
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 }}
334+
emcmake cmake -DCMAKE_BUILD_TYPE=Release `
335+
-DLLVM_HOST_TRIPLE=wasm32-unknown-emscripten `
336+
-DLLVM_ENABLE_ASSERTIONS=ON `
337+
-DLLVM_TARGETS_TO_BUILD="${{ matrix.llvm_targets_to_build }}" `
338+
-DLLVM_ENABLE_LIBEDIT=OFF `
339+
-DLLVM_ENABLE_PROJECTS="${{ matrix.llvm_enable_projects }}" `
340+
-DLLVM_ENABLE_ZSTD=OFF `
341+
-DLLVM_ENABLE_LIBXML2=OFF `
342+
-DCLANG_ENABLE_STATIC_ANALYZER=OFF `
343+
-DCLANG_ENABLE_ARCMT=OFF `
344+
-DCLANG_ENABLE_BOOTSTRAP=OFF `
345+
-DCMAKE_CXX_FLAGS="-Dwait4=__syscall_wait4" `
346+
-DLLVM_INCLUDE_BENCHMARKS=OFF `
347+
-DLLVM_INCLUDE_EXAMPLES=OFF `
348+
-DLLVM_INCLUDE_TESTS=OFF `
349+
-DLLVM_ENABLE_THREADS=OFF `
350+
-DLLVM_BUILD_TOOLS=OFF `
351+
-DLLVM_ENABLE_LIBPFM=OFF `
352+
-DCLANG_BUILD_TOOLS=OFF `
353+
-G Ninja `
354+
..\llvm
355+
emmake ninja libclang clangInterpreter clangStaticAnalyzerCore lldWasm
335356
}
336357
cd ..\
337358
rm -r -force $(find.exe . -maxdepth 1 ! -name "build" ! -name "llvm" ! -name "clang" ! -name ".")
@@ -352,9 +373,9 @@ jobs:
352373
cd ..\..
353374
}
354375
355-
- name: Save Cache LLVM/Clang runtime build directory (Unix Systems Emscripten)
376+
- name: Save Cache LLVM/Clang runtime build directory
356377
uses: actions/cache/save@v4
357-
if: ${{ runner.os != 'windows' && steps.cache.outputs.cache-hit != 'true' }}
378+
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
358379
with:
359380
path: |
360381
llvm-project
@@ -387,6 +408,12 @@ jobs:
387408
cling: Off
388409
micromamba_shell_init: bash
389410
emsdk_ver: "3.1.73"
411+
- name: win2025-x86-clang-repl-19-emscripten
412+
os: windows-2025
413+
clang-runtime: '19'
414+
cling: Off
415+
micromamba_shell_init: powershell
416+
emsdk_ver: "3.1.73"
390417

391418
steps:
392419
- uses: actions/checkout@v4
@@ -426,6 +453,14 @@ jobs:
426453
echo "ncpus=$(nproc --all)" >> $GITHUB_ENV
427454
fi
428455
456+
- name: Setup default Build Type on Windows
457+
if: ${{ runner.os == 'windows' }}
458+
run: |
459+
echo "BUILD_TYPE=Release" >> $env:GITHUB_ENV
460+
echo "CODE_COVERAGE=0" >> $env:GITHUB_ENV
461+
$env:ncpus=$([Environment]::ProcessorCount)
462+
echo "ncpus=$env:ncpus" >> $env:GITHUB_ENV
463+
429464
- name: install mamba
430465
uses: mamba-org/setup-micromamba@main
431466
with:
@@ -517,7 +552,100 @@ jobs:
517552
echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV
518553
echo "PREFIX=$PREFIX" >> $GITHUB_ENV
519554
555+
- name: micromamba shell hook
556+
if: ${{ runner.os == 'windows' }}
557+
shell: powershell
558+
run: |
559+
micromamba shell hook -s cmd.exe --root-prefix C:\Users\runneradmin\micromamba-root
560+
561+
- name: Build and Test/Install CppInterOp on Windows systems
562+
continue-on-error: true
563+
if: ${{ runner.os == 'windows' }}
564+
shell: powershell
565+
run: |
566+
micromamba create -f environment-wasm.yml --platform=emscripten-wasm32
567+
.\emsdk\emsdk activate ${{matrix.emsdk_ver}}
568+
.\emsdk\emsdk_env.ps1
569+
$env:PWD_DIR= $PWD.Path
570+
$env:SYSROOT_PATH="$env:EMSDK/upstream/emscripten/cache/sysroot"
571+
$env:PREFIX="%CONDA_PREFIX%/envs/CppInterOp-wasm"
572+
$env:CMAKE_PREFIX_PATH=$env:PREFIX
573+
$env:CMAKE_SYSTEM_PREFIX_PATH=$env:PREFIX
574+
575+
$env:LLVM_DIR="$env:PWD_DIR\llvm-project"
576+
echo "LLVM_DIR=$env:LLVM_DIR"
577+
echo "LLVM_DIR=$env:LLVM_DIR" >> $env:GITHUB_ENV
578+
579+
$env:LLVM_BUILD_DIR="$env:PWD_DIR\llvm-project\build"
580+
echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR"
581+
echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $env:GITHUB_ENV
582+
583+
if ( "${{ matrix.cling }}" -imatch "On" )
584+
{
585+
$env:CLING_DIR="$env:PWD_DIR\cling"
586+
echo "CLING_DIR=$env:CLING_DIR"
587+
echo "CLING_DIR=$env:CLING_DIR" >> $env:GITHUB_ENV
588+
589+
$env:CLING_BUILD_DIR="$env:PWD_DIR\cling\build"
590+
echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR"
591+
echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" >> $env:GITHUB_ENV
592+
593+
$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;"
594+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH"
595+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV
596+
}
597+
else
598+
{
599+
$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;"
600+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH"
601+
echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV
602+
}
603+
604+
# Build CppInterOp next to cling and llvm-project.
605+
mkdir build
606+
cd build
607+
$env:CPPINTEROP_BUILD_DIR="$env:PWD_DIR"
608+
echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR"
609+
echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR" >> $env:GITHUB_ENV
610+
if ( "${{ matrix.cling }}" -imatch "On" )
611+
{
612+
emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} `
613+
-DCPPINTEROP_USE_CLING=ON `
614+
-DCPPINTEROP_USE_REPL=OFF `
615+
-DCMAKE_PREFIX_PATH="$env:PREFIX" `
616+
-DCling_DIR="$env:LLVM_BUILD_DIR\tools\cling" `
617+
-DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" `
618+
-DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" `
619+
-DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" `
620+
-DBUILD_SHARED_LIBS=ON `
621+
-DCODE_COVERAGE=${{ env.CODE_COVERAGE }} `
622+
-DCMAKE_INSTALL_PREFIX="$env:PREFIX" `
623+
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON `
624+
-DLLVM_ENABLE_WERROR=On `
625+
-DSYSROOT_PATH="$env:SYSROOT_PATH" `
626+
..\
627+
}
628+
else
629+
{
630+
emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} `
631+
-DCMAKE_PREFIX_PATH="$env:PREFIX" `
632+
-DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" `
633+
-DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" `
634+
-DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" `
635+
-DBUILD_SHARED_LIBS=ON `
636+
-DCODE_COVERAGE=${{ env.CODE_COVERAGE }} `
637+
-DCMAKE_INSTALL_PREFIX="$env:PREFIX" `
638+
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON `
639+
-DLLVM_ENABLE_WERROR=On `
640+
-DSYSROOT_PATH="$env:SYSROOT_PATH" `
641+
..\
642+
}
643+
emmake make -j ${{ env.ncpus }} check-cppinterop
644+
emmake make -j ${{ env.ncpus }} install
645+
646+
520647
- name: Build xeus-cpp
648+
if: ${{ runner.os != 'windows' }}
521649
shell: bash -l {0}
522650
run: |
523651
./emsdk/emsdk activate ${{matrix.emsdk_ver}}
@@ -540,9 +668,10 @@ jobs:
540668
emmake make -j ${{ env.ncpus }} install
541669
542670
- name: Test xeus-cpp C++ Emscripten
671+
if: ${{ runner.os != 'windows' }}
543672
shell: bash -l {0}
544673
run: |
545674
set -e
546675
micromamba activate CppInterOp-wasm
547676
cd ./xeus-cpp/build/test
548-
node test_xeus_cpp.js
677+
node test_xeus_cpp.js

0 commit comments

Comments
 (0)