diff --git a/.github/actions/Build_and_Test_CppInterOp/action.yml b/.github/actions/Build_and_Test_CppInterOp/action.yml index 4fd3a1ab9..92f44c543 100644 --- a/.github/actions/Build_and_Test_CppInterOp/action.yml +++ b/.github/actions/Build_and_Test_CppInterOp/action.yml @@ -4,8 +4,8 @@ description: 'This action builds and tests CppInterOp for native platforms' runs: using: composite steps: - - name: Build and Test/Install CppInterOp - if: runner.os != 'Windows' + - name: Build and Test/Install CppInterOp (native shared library build) + if: ${{ runner.os != 'Windows' && !endsWith(matrix.name, '-emscripten') }} shell: bash run: | LLVM_DIR="$(pwd)/llvm-project" @@ -79,8 +79,8 @@ runs: echo "LLVM_BUILD_DIR=$LLVM_BUILD_DIR" >> $GITHUB_ENV echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV - - name: Build and Test/Install CppInterOp on Windows systems - if: runner.os == 'Windows' + - name: Build and Test/Install CppInterOp on Windows systems (native static library build) + if: ${{ runner.os == 'Windows' && !endsWith(matrix.name, '-emscripten') }} shell: powershell run: | $env:PWD_DIR= $PWD.Path @@ -146,3 +146,447 @@ runs: -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} -DCMAKE_INSTALL_PREFIX="$env:CPPINTEROP_DIR" ..\ } cmake --build . --config ${{ env.BUILD_TYPE }} --target check-cppinterop --parallel ${{ env.ncpus }} + + - name: Emscripten build of CppInterOp on Unix systems (shared library) + if: ${{ runner.os != 'Windows' && endsWith(matrix.name, '-emscripten') }} + shell: bash -l {0} + run: | + set -e + ./emsdk/emsdk activate ${{matrix.emsdk_ver}} + source ./emsdk/emsdk_env.sh + micromamba create -f environment-wasm.yml --platform=emscripten-wasm32 -c https://prefix.dev/emscripten-forge-4x -c https://prefix.dev/conda-forge + export SYSROOT_PATH=$PWD/emsdk/upstream/emscripten/cache/sysroot + export PREFIX=$MAMBA_ROOT_PREFIX/envs/CppInterOp-wasm + export CMAKE_PREFIX_PATH=$PREFIX + export CMAKE_SYSTEM_PREFIX_PATH=$PREFIX + + LLVM_DIR="$(pwd)/llvm-project" + LLVM_BUILD_DIR="$(pwd)/llvm-project/build" + cling_on=$(echo "${{ matrix.cling }}" | tr '[:lower:]' '[:upper:]') + if [[ "${cling_on}" == "ON" ]]; then + CLING_DIR="$(pwd)/cling" + CLING_BUILD_DIR="$(pwd)/cling/build" + CPLUS_INCLUDE_PATH="${CLING_DIR}/tools/cling/include:${CLING_BUILD_DIR}/include:${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" + else + CPLUS_INCLUDE_PATH="${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" + fi + + # Build CppInterOp next to cling and llvm-project. + mkdir build + cd build + if [[ "${cling_on}" == "ON" ]]; then + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ + -DCPPINTEROP_USE_CLING=ON \ + -DCPPINTEROP_USE_REPL=OFF \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DCling_DIR=$LLVM_BUILD_DIR/tools/cling \ + -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ + -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ + -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ + -DBUILD_SHARED_LIBS=ON \ + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ + -DLLVM_ENABLE_WERROR=On \ + -DSYSROOT_PATH=$SYSROOT_PATH \ + ../ + else + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ + -DCMAKE_PREFIX_PATH=$PREFIX \ + -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ + -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ + -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ + -DBUILD_SHARED_LIBS=ON \ + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ + -DLLVM_ENABLE_WERROR=On \ + -DSYSROOT_PATH=$SYSROOT_PATH \ + ../ + fi + emmake make -j ${{ env.ncpus }} check-cppinterop + os="${{ matrix.os }}" + if [[ "${os}" != macos* ]] ; then + actual_size=$(stat -c%s "./lib/libclangCppInterOp.so") + max_size=$((50 * 1024 * 1024)) + if [[ "$actual_size" -gt "$max_size" ]]; then + echo "Error: libclangCppInterOp.so is larger than 50 MB." + exit 1 + fi + fi + cd ./unittests/CppInterOp/ + # Fresh install browsers, and run Emscripten tests in them + # This is to match the Emscripten build instructions, where + # we run in a fresh browser, to stop any extra installed + # stuff interferring with the running of the tests + # Explaination of options for emrun + # --browser (name of browser on path) + # --kill_exit makes it so that when emrun finishes, + # that the headless browser we create is killed along with it + # --timeout 60 is such that emrun is killed after 60 seconds if + # still running. emrun should have finished long before then, + # so if it is still running, something went wrong (such as a test + # which crashed the html file). This will cause the ci to fail, + # as a non 0 value of will be returned. + # In the case of Chrome we have the extra --no-sandbox flag, as on + # Ubuntu Chrome will refuse to run otherwise, as it expects to have + # been installed with admin privileges. This flag allows it to run + # in userspace. + os="${{ matrix.os }}" + if [[ "${os}" == "macos"* ]]; then + # Install Firefox + wget "https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" -O Firefox-latest.dmg + hdiutil attach Firefox-latest.dmg + cp -r /Volumes/Firefox/Firefox.app $PWD + hdiutil detach /Volumes/Firefox + cd ./Firefox.app/Contents/MacOS/ + export PATH="$PWD:$PATH" + cd - + + # Install Google Chrome + 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 + pkgutil --expand-full googlechrome.pkg google-chrome + cd ./google-chrome/GoogleChrome.pkg/Payload/Google\ Chrome.app/Contents/MacOS/ + export PATH="$PWD:$PATH" + cd - + + # Run tests in browsers + echo "Running CppInterOpTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html + echo "Running CppInterOpTests in Google Chrome" + emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Google Chrome" + emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html + sudo safaridriver --enable + python -m pip install selenium + echo "Running CppInterOpTests in Safari" + emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html & + python ../../../scripts/browser_tests_safari.py CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Safari" + emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html & + python ../../../scripts/browser_tests_safari.py DynamicLibraryManagerTests.html + else + export ARCHITECHURE=$(uname -m) + if [[ "$ARCHITECHURE" != "aarch64" ]]; then + # Install Google Chrome + wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + dpkg-deb -x google-chrome-stable_current_amd64.deb $PWD/chrome + cd ./chrome/opt/google/chrome/ + export PATH="$PWD:$PATH" + cd - + + # Install Firefox + wget https://ftp.mozilla.org/pub/firefox/releases/138.0.1/linux-x86_64/en-GB/firefox-138.0.1.tar.xz + tar -xJf firefox-138.0.1.tar.xz + cd ./firefox + export PATH="$PWD:$PATH" + cd - + + # Run tests in browsers + echo "Running CppInterOpTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html + echo "Running CppInterOpTests in Google Chrome" + emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Google Chrome" + emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html + else + # Install Firefox + wget https://ftp.mozilla.org/pub/firefox/releases/138.0.1/linux-aarch64/en-GB/firefox-138.0.1.tar.xz + tar -xJf firefox-138.0.1.tar.xz + cd ./firefox + export PATH="$PWD:$PATH" + cd - + + # Run tests in browsers + echo "Running CppInterOpTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html + fi + fi + cd ../.. + emmake make -j ${{ env.ncpus }} install + cd .. + + echo "PATH=$PATH" >> $GITHUB_ENV + echo "SYSROOT_PATH=$SYSROOT_PATH" >> $GITHUB_ENV + echo "CB_PYTHON_DIR=$CB_PYTHON_DIR" >> $GITHUB_ENV + echo "CPPINTEROP_DIR=$CPPINTEROP_DIR" >> $GITHUB_ENV + echo "LLVM_BUILD_DIR=$LLVM_BUILD_DIR" >> $GITHUB_ENV + echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV + echo "PREFIX=$PREFIX" >> $GITHUB_ENV + + - name: Emscripten build of CppInterOp on Unix systems (static library) + if: runner.os != 'Windows' && !(startsWith(matrix.os, 'ubuntu') && matrix.clang-runtime == '19' && endsWith(matrix.os, 'arm')) && endsWith(matrix.name, '-emscripten') && matrix.build_static_library == 'On' + shell: bash -l {0} + run: | + # FIXME: Static library builds, but tests fail to build on Github runner for Ubuntu arm llvm 19 case + # Disabled build for now + set -e + ./emsdk/emsdk activate ${{matrix.emsdk_ver}} + source ./emsdk/emsdk_env.sh + + # Build CppInterOp next to cling and llvm-project. + mkdir build_static + cd build_static + if [[ "${cling_on}" == "ON" ]]; then + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ + -DCPPINTEROP_USE_CLING=ON \ + -DCPPINTEROP_USE_REPL=OFF \ + -DCMAKE_PREFIX_PATH=${{ env.PREFIX }} \ + -DCling_DIR=${{ env.LLVM_BUILD_DIR }}/tools/cling \ + -DLLVM_DIR=${{ env.LLVM_BUILD_DIR }}/lib/cmake/llvm \ + -DLLD_DIR=${{ env.LLVM_BUILD_DIR }}/lib/cmake/lld \ + -DClang_DIR=${{ env.LLVM_BUILD_DIR }}/lib/cmake/clang \ + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ + -DCMAKE_INSTALL_PREFIX=${{ env.PREFIX }} \ + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ + -DLLVM_ENABLE_WERROR=On \ + -DSYSROOT_PATH=${{ env.SYSROOT_PATH }} \ + ../ + else + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ + -DCMAKE_PREFIX_PATH=${{ env.PREFIX }} \ + -DLLVM_DIR=${{ env.LLVM_BUILD_DIR }}/lib/cmake/llvm \ + -DLLD_DIR=${{ env.LLVM_BUILD_DIR }}/lib/cmake/lld \ + -DClang_DIR=${{ env.LLVM_BUILD_DIR }}/lib/cmake/clang \ + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ + -DCMAKE_INSTALL_PREFIX=${{ env.PREFIX }} \ + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ + -DLLVM_ENABLE_WERROR=On \ + -DSYSROOT_PATH=${{ env.SYSROOT_PATH }} \ + ../ + fi + os="${{ matrix.os }}" + if [[ "${os}" != macos* ]] ; then + EMCC_CORES=1 emmake make -j 1 check-cppinterop + else + emmake make -j ${{ env.ncpus }} check-cppinterop + fi + cd ./unittests/CppInterOp/ + os="${{ matrix.os }}" + if [[ "${os}" == "macos"* ]]; then + # Run tests in browsers + echo "Running CppInterOpTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html + echo "Running CppInterOpTests in Google Chrome" + emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Google Chrome" + emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html + echo "Running CppInterOpTests in Safari" + emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html & + python ../../../scripts/browser_tests_safari.py CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Safari" + emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html & + python ../../../scripts/browser_tests_safari.py DynamicLibraryManagerTests.html + else + export ARCHITECHURE=$(uname -m) + if [[ "$ARCHITECHURE" != "aarch64" ]]; then + # Run tests in browsers + echo "Running CppInterOpTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html + echo "Running CppInterOpTests in Google Chrome" + emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Google Chrome" + emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html + else + # Run tests in browsers + echo "Running CppInterOpTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html + echo "Running DynamicLibraryManagerTests in Firefox" + emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html + fi + fi + cd ../../.. + + - name: Emscripten build of CppInterOp on Windows systems (shared library) + if: ${{ runner.os == 'Windows' && endsWith(matrix.name, '-emscripten') }} + shell: powershell + run: | + micromamba create -f environment-wasm.yml --platform=emscripten-wasm32 -c https://prefix.dev/emscripten-forge-4x -c https://prefix.dev/conda-forge + .\emsdk\emsdk activate ${{matrix.emsdk_ver}} + .\emsdk\emsdk_env.ps1 + $env:PWD_DIR= $PWD.Path + $env:SYSROOT_PATH="$env:EMSDK/upstream/emscripten/cache/sysroot" + echo "SYSROOT_PATH=$env:SYSROOT_PATH" + echo "SYSROOT_PATH=$env:SYSROOT_PATH" >> $env:GITHUB_ENV + + $env:PREFIX="$env:MAMBA_ROOT_PREFIX/envs/CppInterOp-wasm" + echo "PREFIX=$env:PREFIX" + echo "PREFIX=$env:PREFIX" >> $env:GITHUB_ENV + + $env:CMAKE_PREFIX_PATH=$env:PREFIX + $env:CMAKE_SYSTEM_PREFIX_PATH=$env:PREFIX + + $env:LLVM_DIR="$env:PWD_DIR\llvm-project" + echo "LLVM_DIR=$env:LLVM_DIR" + echo "LLVM_DIR=$env:LLVM_DIR" >> $env:GITHUB_ENV + + $env:LLVM_BUILD_DIR="$env:PWD_DIR\llvm-project\build" + echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" + echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $env:GITHUB_ENV + + if ( "${{ matrix.cling }}" -imatch "On" ) + { + $env:CLING_DIR="$env:PWD_DIR\cling" + echo "CLING_DIR=$env:CLING_DIR" + echo "CLING_DIR=$env:CLING_DIR" >> $env:GITHUB_ENV + + $env:CLING_BUILD_DIR="$env:PWD_DIR\cling\build" + echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" + echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" >> $env:GITHUB_ENV + + $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;" + echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" + echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV + } + else + { + $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;" + echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" + echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV + } + + # Build CppInterOp next to cling and llvm-project. + mkdir build + cd build + if ( "${{ matrix.cling }}" -imatch "On" ) + { + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` + -DCPPINTEROP_USE_CLING=ON ` + -DCPPINTEROP_USE_REPL=OFF ` + -DCMAKE_PREFIX_PATH="$env:PREFIX" ` + -DCling_DIR="$env:LLVM_BUILD_DIR\tools\cling" ` + -DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" ` + -DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" ` + -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" ` + -DBUILD_SHARED_LIBS=ON ` + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` + -DCMAKE_INSTALL_PREFIX="$env:PREFIX" ` + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` + -DLLVM_ENABLE_WERROR=On ` + -DSYSROOT_PATH="$env:SYSROOT_PATH" ` + ..\ + } + else + { + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` + -DCMAKE_PREFIX_PATH="$env:PREFIX" ` + -DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" ` + -DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" ` + -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" ` + -DBUILD_SHARED_LIBS=ON ` + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` + -DCMAKE_INSTALL_PREFIX="$env:PREFIX" ` + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` + -DLLVM_ENABLE_WERROR=On ` + -DSYSROOT_PATH="$env:SYSROOT_PATH" ` + ..\ + } + function Error-OnFailure { + param ( + [Parameter(Mandatory)] + [ScriptBlock]$Command + ) + + & $Command + + if ($LASTEXITCODE -ne 0) { + exit $LASTEXITCODE + } + } + Error-OnFailure{ emmake make -j ${{ env.ncpus }} check-cppinterop } + cd .\unittests\CppInterOp\ + Invoke-WebRequest -Uri "https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win/1411573/chrome-win.zip" -OutFile "$PWD\chrome-win.zip" -Verbose + Expand-Archive -Path "$PWD\chrome-win.zip" -DestinationPath "$PWD" -Force -Verbose + Invoke-WebRequest -Uri "https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US" -OutFile "firefox-setup.exe" -Verbose + & "C:\Program Files\7-Zip\7z.exe" x "firefox-setup.exe" + $env:PATH="$PWD\core;$PWD\chrome-win;$env:PATH" + echo "PATH=$env:PATH" + echo "PATH=$env:PATH" >> $env:GITHUB_ENV + echo "Running CppInterOpTests in Firefox" + Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html } + echo "Running DynamicLibraryManagerTests in Firefox" + Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html } + echo "Running CppInterOpTests in Chromium" + Error-OnFailure { emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html } + echo "Running DynamicLibraryManagerTests in Chromium" + Error-OnFailure { emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html } + cd ..\.. + Error-OnFailure { emmake make -j ${{ env.ncpus }} install } + echo "SYSROOT_PATH=$env:SYSROOT_PATH" >> $GITHUB_ENV + echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $GITHUB_ENV + echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $GITHUB_ENV + echo "PREFIX=$env:PREFIX" >> $GITHUB_ENV + + - name: Emscripten build of CppInterOp on Windows systems (static library) + if: ${{ runner.os == 'Windows' && endsWith(matrix.name, '-emscripten') && matrix.build_static_library == 'On' && matrix.build_static_library == 'On' }} + shell: powershell + run: | + .\emsdk\emsdk activate ${{matrix.emsdk_ver}} + .\emsdk\emsdk_env.ps1 + function Error-OnFailure { + param ( + [Parameter(Mandatory)] + [ScriptBlock]$Command + ) + + & $Command + + if ($LASTEXITCODE -ne 0) { + exit $LASTEXITCODE + } + } + + # Build CppInterOp next to cling and llvm-project. + mkdir build_static + cd build_static + if ( "${{ matrix.cling }}" -imatch "On" ) + { + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` + -DCPPINTEROP_USE_CLING=ON ` + -DCPPINTEROP_USE_REPL=OFF ` + -DCMAKE_PREFIX_PATH=${{ env.PREFIX }} ` + -DCling_DIR="${{ env.LLVM_BUILD_DIR }}\tools\cling" ` + -DLLVM_DIR="${{ env.LLVM_BUILD_DIR }}\lib\cmake\llvm" ` + -DLLD_DIR="${{ env.LLVM_BUILD_DIR }}\lib\cmake\lld" ` + -DClang_DIR="${{ env.LLVM_BUILD_DIR }}\lib\cmake\clang" ` + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` + -DCMAKE_INSTALL_PREFIX=${{ env.PREFIX }} ` + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` + -DLLVM_ENABLE_WERROR=On ` + -DSYSROOT_PATH=${{ env.SYSROOT_PATH }} ` + ..\ + } + else + { + emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` + -DCMAKE_PREFIX_PATH=${{ env.PREFIX }} ` + -DLLVM_DIR="${{ env.LLVM_BUILD_DIR }}\lib\cmake\llvm" ` + -DLLD_DIR="${{ env.LLVM_BUILD_DIR }}\lib\cmake\lld" ` + -DClang_DIR="${{ env.LLVM_BUILD_DIR }}\lib\cmake\clang" ` + -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` + -DCMAKE_INSTALL_PREFIX=${{ env.PREFIX }} ` + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` + -DLLVM_ENABLE_WERROR=On ` + -DSYSROOT_PATH=${{ env.SYSROOT_PATH }} ` + ..\ + } + Error-OnFailure { emmake make -j ${{ env.ncpus }} check-cppinterop } + cd .\unittests\CppInterOp\ + echo "Running CppInterOpTests in Firefox" + Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html } + echo "Running DynamicLibraryManagerTests in Firefox" + Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html } + echo "Running CppInterOpTests in Chromium" + Error-OnFailure { emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html } + echo "Running DynamicLibraryManagerTests in Chromium" + Error-OnFailure{ emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html } diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 60eaf6422..1b7810d4d 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -27,6 +27,7 @@ jobs: cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" + build_static_library: Off steps: - uses: actions/checkout@v6 @@ -66,128 +67,8 @@ jobs: ${{ matrix.cling=='On' && 'cling' || '' }} key: ${{ env.CLING_HASH }}-${{ runner.os }}-${{ matrix.os }}-clang-${{ matrix.clang-runtime }}.x-emscripten - - name: Emscripten build of CppInterOp on Unix systems - if: ${{ runner.os != 'windows' }} - shell: bash -l {0} - run: | - set -e - ./emsdk/emsdk activate ${{matrix.emsdk_ver}} - source ./emsdk/emsdk_env.sh - micromamba create -f environment-wasm.yml --platform=emscripten-wasm32 -c https://prefix.dev/emscripten-forge-4x -c https://prefix.dev/conda-forge - export SYSROOT_PATH=$PWD/emsdk/upstream/emscripten/cache/sysroot - export PREFIX=$MAMBA_ROOT_PREFIX/envs/CppInterOp-wasm - export CMAKE_PREFIX_PATH=$PREFIX - export CMAKE_SYSTEM_PREFIX_PATH=$PREFIX - - LLVM_DIR="$(pwd)/llvm-project" - LLVM_BUILD_DIR="$(pwd)/llvm-project/build" - cling_on=$(echo "${{ matrix.cling }}" | tr '[:lower:]' '[:upper:]') - if [[ "${cling_on}" == "ON" ]]; then - CLING_DIR="$(pwd)/cling" - CLING_BUILD_DIR="$(pwd)/cling/build" - CPLUS_INCLUDE_PATH="${CLING_DIR}/tools/cling/include:${CLING_BUILD_DIR}/include:${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" - else - CPLUS_INCLUDE_PATH="${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" - fi - - # Build CppInterOp next to cling and llvm-project. - mkdir build - cd build - - if [[ "${cling_on}" == "ON" ]]; then - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ - -DCPPINTEROP_USE_CLING=ON \ - -DCPPINTEROP_USE_REPL=OFF \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DCling_DIR=$LLVM_BUILD_DIR/tools/cling \ - -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ - -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ - -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ - -DBUILD_SHARED_LIBS=ON \ - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ - -DSYSROOT_PATH=$SYSROOT_PATH \ - ../ - else - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ - -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ - -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ - -DBUILD_SHARED_LIBS=ON \ - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ - -DSYSROOT_PATH=$SYSROOT_PATH \ - ../ - fi - emmake make -j ${{ env.ncpus }} check-cppinterop - cd ./unittests/CppInterOp/ - - # Fresh install browsers, and run Emscripten tests in them - # This is to match the Emscripten build instructions, where - # we run in a fresh browser, to stop any extra installed - # stuff interferring with the running of the tests - # Explaination of options for emrun - # --browser (name of browser on path) - # --kill_exit makes it so that when emrun finishes, - # that the headless browser we create is killed along with it - # --timeout 60 is such that emrun is killed after 60 seconds if - # still running. emrun should have finished long before then, - # so if it is still running, something went wrong (such as a test - # which crashed the html file). This will cause the ci to fail, - # as a non 0 value of will be returned. - # In the case of Chrome we have the extra --no-sandbox flag, as on - # Ubuntu Chrome will refuse to run otherwise, as it expects to have - # been installed with admin privileges. This flag allows it to run - # in userspace. - - # Install Firefox - wget "https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" -O Firefox-latest.dmg - hdiutil attach Firefox-latest.dmg - cp -r /Volumes/Firefox/Firefox.app $PWD - hdiutil detach /Volumes/Firefox - cd ./Firefox.app/Contents/MacOS/ - export PATH="$PWD:$PATH" - cd - - - # Install Google Chrome - 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 - pkgutil --expand-full googlechrome.pkg google-chrome - cd ./google-chrome/GoogleChrome.pkg/Payload/Google\ Chrome.app/Contents/MacOS/ - export PATH="$PWD:$PATH" - cd - - - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - echo "Running CppInterOpTests in Google Chrome" - emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Google Chrome" - emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html - sudo safaridriver --enable - python -m pip install selenium - echo "Running CppInterOpTests in Safari" - emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html & - python ../../../scripts/browser_tests_safari.py CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Safari" - emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html & - python ../../../scripts/browser_tests_safari.py DynamicLibraryManagerTests.html - - cd ../../ - emmake make -j ${{ env.ncpus }} install - - cd .. - - echo "SYSROOT_PATH=$SYSROOT_PATH" >> $GITHUB_ENV - echo "CB_PYTHON_DIR=$CB_PYTHON_DIR" >> $GITHUB_ENV - echo "CPPINTEROP_DIR=$CPPINTEROP_DIR" >> $GITHUB_ENV - echo "LLVM_BUILD_DIR=$LLVM_BUILD_DIR" >> $GITHUB_ENV - echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV - echo "PREFIX=$PREFIX" >> $GITHUB_ENV + - name: Build and test CppInterOp + uses: ./.github/actions/Build_and_Test_CppInterOp - name: Build xeus-cpp shell: bash -l {0} diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index 994f1bf4f..b89d817c9 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -399,54 +399,62 @@ jobs: fail-fast: false matrix: include: - - name: ubu24-x86-clang-repl-20-emscripten_wasm + - name: ubu24-x86-clang-repl-20-emscripten os: ubuntu-24.04 clang-runtime: '20' cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" - - name: osx26-arm-clang-repl-20-emscripten_wasm + build_static_library: On + - name: osx26-arm-clang-repl-20-emscripten os: macos-26 clang-runtime: '20' cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" - - name: ubu24-arm-clang-repl-20-emscripten_wasm + build_static_library: On + - name: ubu24-arm-clang-repl-20-emscripten os: ubuntu-24.04-arm clang-runtime: '20' cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" + build_static_library: On - name: win2025-x86-clang-repl-20-emscripten os: windows-2025 clang-runtime: '20' cling: Off micromamba_shell_init: powershell emsdk_ver: "4.0.9" - - name: ubu24-x86-clang-repl-21-emscripten_wasm + build_static_library: On + - name: ubu24-x86-clang-repl-21-emscripten os: ubuntu-24.04 clang-runtime: '21' cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" - - name: osx26-arm-clang-repl-21-emscripten_wasm + build_static_library: On + - name: osx26-arm-clang-repl-21-emscripten os: macos-26 clang-runtime: '21' cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" - - name: ubu24-arm-clang-repl-21-emscripten_wasm + build_static_library: On + - name: ubu24-arm-clang-repl-21-emscripten os: ubuntu-24.04-arm clang-runtime: '21' cling: Off micromamba_shell_init: bash emsdk_ver: "4.0.9" + build_static_library: On - name: win2025-x86-clang-repl-21-emscripten os: windows-2025 clang-runtime: '21' cling: Off micromamba_shell_init: powershell emsdk_ver: "4.0.9" + build_static_library: On steps: - uses: actions/checkout@v6 @@ -483,532 +491,14 @@ jobs: llvm-project ${{ matrix.cling=='On' && 'cling' || '' }} key: ${{ env.CLING_HASH }}-${{ runner.os }}-${{ matrix.os }}-clang-${{ matrix.clang-runtime }}.x-emscripten - - - name: Emscripten build of CppInterOp on Unix systems (shared library) - if: ${{ runner.os != 'windows' }} - shell: bash -l {0} - run: | - set -e - ./emsdk/emsdk activate ${{matrix.emsdk_ver}} - source ./emsdk/emsdk_env.sh - micromamba create -f environment-wasm.yml --platform=emscripten-wasm32 -c https://prefix.dev/emscripten-forge-4x -c https://prefix.dev/conda-forge - export SYSROOT_PATH=$PWD/emsdk/upstream/emscripten/cache/sysroot - export PREFIX=$MAMBA_ROOT_PREFIX/envs/CppInterOp-wasm - export CMAKE_PREFIX_PATH=$PREFIX - export CMAKE_SYSTEM_PREFIX_PATH=$PREFIX - - LLVM_DIR="$(pwd)/llvm-project" - LLVM_BUILD_DIR="$(pwd)/llvm-project/build" - cling_on=$(echo "${{ matrix.cling }}" | tr '[:lower:]' '[:upper:]') - if [[ "${cling_on}" == "ON" ]]; then - CLING_DIR="$(pwd)/cling" - CLING_BUILD_DIR="$(pwd)/cling/build" - CPLUS_INCLUDE_PATH="${CLING_DIR}/tools/cling/include:${CLING_BUILD_DIR}/include:${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" - else - CPLUS_INCLUDE_PATH="${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" - fi - - # Build CppInterOp next to cling and llvm-project. - mkdir build - cd build - if [[ "${cling_on}" == "ON" ]]; then - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ - -DCPPINTEROP_USE_CLING=ON \ - -DCPPINTEROP_USE_REPL=OFF \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DCling_DIR=$LLVM_BUILD_DIR/tools/cling \ - -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ - -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ - -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ - -DBUILD_SHARED_LIBS=ON \ - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ - -DLLVM_ENABLE_WERROR=On \ - -DSYSROOT_PATH=$SYSROOT_PATH \ - ../ - else - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ - -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ - -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ - -DBUILD_SHARED_LIBS=ON \ - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ - -DLLVM_ENABLE_WERROR=On \ - -DSYSROOT_PATH=$SYSROOT_PATH \ - ../ - fi - emmake make -j ${{ env.ncpus }} check-cppinterop - os="${{ matrix.os }}" - if [[ "${os}" != macos* ]] ; then - actual_size=$(stat -c%s "./lib/libclangCppInterOp.so") - max_size=$((50 * 1024 * 1024)) - if [[ "$actual_size" -gt "$max_size" ]]; then - echo "Error: libclangCppInterOp.so is larger than 50 MB." - exit 1 - fi - fi - cd ./unittests/CppInterOp/ - # Fresh install browsers, and run Emscripten tests in them - # This is to match the Emscripten build instructions, where - # we run in a fresh browser, to stop any extra installed - # stuff interferring with the running of the tests - # Explaination of options for emrun - # --browser (name of browser on path) - # --kill_exit makes it so that when emrun finishes, - # that the headless browser we create is killed along with it - # --timeout 60 is such that emrun is killed after 60 seconds if - # still running. emrun should have finished long before then, - # so if it is still running, something went wrong (such as a test - # which crashed the html file). This will cause the ci to fail, - # as a non 0 value of will be returned. - # In the case of Chrome we have the extra --no-sandbox flag, as on - # Ubuntu Chrome will refuse to run otherwise, as it expects to have - # been installed with admin privileges. This flag allows it to run - # in userspace. - os="${{ matrix.os }}" - if [[ "${os}" == "macos"* ]]; then - # Install Firefox - wget "https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" -O Firefox-latest.dmg - hdiutil attach Firefox-latest.dmg - cp -r /Volumes/Firefox/Firefox.app $PWD - hdiutil detach /Volumes/Firefox - cd ./Firefox.app/Contents/MacOS/ - export PATH="$PWD:$PATH" - cd - - - # Install Google Chrome - 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 - pkgutil --expand-full googlechrome.pkg google-chrome - cd ./google-chrome/GoogleChrome.pkg/Payload/Google\ Chrome.app/Contents/MacOS/ - export PATH="$PWD:$PATH" - cd - - - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - echo "Running CppInterOpTests in Google Chrome" - emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Google Chrome" - emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html - sudo safaridriver --enable - python -m pip install selenium - echo "Running CppInterOpTests in Safari" - emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html & - python ../../../scripts/browser_tests_safari.py CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Safari" - emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html & - python ../../../scripts/browser_tests_safari.py DynamicLibraryManagerTests.html - else - export ARCHITECHURE=$(uname -m) - if [[ "$ARCHITECHURE" != "aarch64" ]]; then - # Install Google Chrome - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - dpkg-deb -x google-chrome-stable_current_amd64.deb $PWD/chrome - cd ./chrome/opt/google/chrome/ - export PATH="$PWD:$PATH" - cd - - - # Install Firefox - wget https://ftp.mozilla.org/pub/firefox/releases/138.0.1/linux-x86_64/en-GB/firefox-138.0.1.tar.xz - tar -xJf firefox-138.0.1.tar.xz - cd ./firefox - export PATH="$PWD:$PATH" - cd - - - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - echo "Running CppInterOpTests in Google Chrome" - emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Google Chrome" - emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html - else - # Install Firefox - wget https://ftp.mozilla.org/pub/firefox/releases/138.0.1/linux-aarch64/en-GB/firefox-138.0.1.tar.xz - tar -xJf firefox-138.0.1.tar.xz - cd ./firefox - export PATH="$PWD:$PATH" - cd - - - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - fi - fi - cd ../.. - emmake make -j ${{ env.ncpus }} install - cd .. - - echo "PATH=$PATH" >> $GITHUB_ENV - echo "SYSROOT_PATH=$SYSROOT_PATH" >> $GITHUB_ENV - echo "CB_PYTHON_DIR=$CB_PYTHON_DIR" >> $GITHUB_ENV - echo "CPPINTEROP_DIR=$CPPINTEROP_DIR" >> $GITHUB_ENV - echo "LLVM_BUILD_DIR=$LLVM_BUILD_DIR" >> $GITHUB_ENV - echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV - echo "PREFIX=$PREFIX" >> $GITHUB_ENV - - - name: Emscripten build of CppInterOp on Unix systems (static library) - if: runner.os != 'Windows' && !(startsWith(matrix.os, 'ubuntu') && matrix.clang-runtime == '19' && endsWith(matrix.os, 'arm') ) - shell: bash -l {0} - run: | - # FIXME: Static library builds, but tests fail to build on Github runner for Ubuntu arm llvm 19 case - # Disabled build for now - set -e - ./emsdk/emsdk activate ${{matrix.emsdk_ver}} - source ./emsdk/emsdk_env.sh - export SYSROOT_PATH=$PWD/emsdk/upstream/emscripten/cache/sysroot - export PREFIX=$MAMBA_ROOT_PREFIX/envs/CppInterOp-wasm - export CMAKE_PREFIX_PATH=$PREFIX - export CMAKE_SYSTEM_PREFIX_PATH=$PREFIX - - LLVM_DIR="$(pwd)/llvm-project" - LLVM_BUILD_DIR="$(pwd)/llvm-project/build" - cling_on=$(echo "${{ matrix.cling }}" | tr '[:lower:]' '[:upper:]') - if [[ "${cling_on}" == "ON" ]]; then - CLING_DIR="$(pwd)/cling" - CLING_BUILD_DIR="$(pwd)/cling/build" - CPLUS_INCLUDE_PATH="${CLING_DIR}/tools/cling/include:${CLING_BUILD_DIR}/include:${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" - else - CPLUS_INCLUDE_PATH="${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include:$PWD/include" - fi - - # Build CppInterOp next to cling and llvm-project. - mkdir build_static - cd build_static - if [[ "${cling_on}" == "ON" ]]; then - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ - -DCPPINTEROP_USE_CLING=ON \ - -DCPPINTEROP_USE_REPL=OFF \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DCling_DIR=$LLVM_BUILD_DIR/tools/cling \ - -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ - -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ - -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ - -DLLVM_ENABLE_WERROR=On \ - -DSYSROOT_PATH=$SYSROOT_PATH \ - ../ - else - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \ - -DCMAKE_PREFIX_PATH=$PREFIX \ - -DLLVM_DIR=$LLVM_BUILD_DIR/lib/cmake/llvm \ - -DLLD_DIR=$LLVM_BUILD_DIR/lib/cmake/lld \ - -DClang_DIR=$LLVM_BUILD_DIR/lib/cmake/clang \ - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \ - -DLLVM_ENABLE_WERROR=On \ - -DSYSROOT_PATH=$SYSROOT_PATH \ - ../ - fi - os="${{ matrix.os }}" - if [[ "${os}" != macos* ]] ; then - EMCC_CORES=1 emmake make -j 1 check-cppinterop - else - emmake make -j ${{ env.ncpus }} check-cppinterop - fi - cd ./unittests/CppInterOp/ - # Explaination of options for emrun - # --browser (name of browser on path) - # --kill_exit makes it so that when emrun finishes, - # that the headless browser we create is killed along with it - # --timeout 60 is such that emrun is killed after 60 seconds if - # still running. emrun should have finished long before then, - # so if it is still running, something went wrong (such as a test - # which crashed the html file). This will cause the ci to fail, - # as a non 0 value of will be returned. - # In the case of Chrome we have the extra --no-sandbox flag, as on - # Ubuntu Chrome will refuse to run otherwise, as it expects to have - # been installed with admin privileges. This flag allows it to run - # in userspace. - os="${{ matrix.os }}" - if [[ "${os}" == "macos"* ]]; then - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - echo "Running CppInterOpTests in Google Chrome" - emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Google Chrome" - emrun --browser="Google Chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html - echo "Running CppInterOpTests in Safari" - emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html & - python ../../../scripts/browser_tests_safari.py CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Safari" - emrun --no_browser --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html & - python ../../../scripts/browser_tests_safari.py DynamicLibraryManagerTests.html - else - export ARCHITECHURE=$(uname -m) - if [[ "$ARCHITECHURE" != "aarch64" ]]; then - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - echo "Running CppInterOpTests in Google Chrome" - emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Google Chrome" - emrun --browser="google-chrome" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html - else - # Run tests in browsers - echo "Running CppInterOpTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html - echo "Running DynamicLibraryManagerTests in Firefox" - emrun --browser="firefox" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html - fi - fi - cd ../../.. - - echo "SYSROOT_PATH=$SYSROOT_PATH" >> $GITHUB_ENV - echo "CB_PYTHON_DIR=$CB_PYTHON_DIR" >> $GITHUB_ENV - echo "CPPINTEROP_DIR=$CPPINTEROP_DIR" >> $GITHUB_ENV - echo "LLVM_BUILD_DIR=$LLVM_BUILD_DIR" >> $GITHUB_ENV - echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV - echo "PREFIX=$PREFIX" >> $GITHUB_ENV - - name: micromamba shell hook - if: ${{ runner.os == 'windows' }} + if: runner.os == 'Windows' shell: powershell run: | micromamba shell hook -s cmd.exe --root-prefix C:\Users\runneradmin\micromamba-root - - name: Build and Test/Install CppInterOp on Windows systems (shared library) - if: ${{ runner.os == 'windows' }} - shell: powershell - run: | - micromamba create -f environment-wasm.yml --platform=emscripten-wasm32 -c https://prefix.dev/emscripten-forge-4x -c https://prefix.dev/conda-forge - .\emsdk\emsdk activate ${{matrix.emsdk_ver}} - .\emsdk\emsdk_env.ps1 - $env:PWD_DIR= $PWD.Path - $env:SYSROOT_PATH="$env:EMSDK/upstream/emscripten/cache/sysroot" - echo "SYSROOT_PATH=$env:SYSROOT_PATH" - echo "SYSROOT_PATH=$env:SYSROOT_PATH" >> $env:GITHUB_ENV - - $env:PREFIX="$env:MAMBA_ROOT_PREFIX/envs/CppInterOp-wasm" - echo "PREFIX=$env:PREFIX" - echo "PREFIX=$env:PREFIX" >> $env:GITHUB_ENV - - $env:CMAKE_PREFIX_PATH=$env:PREFIX - $env:CMAKE_SYSTEM_PREFIX_PATH=$env:PREFIX - - $env:LLVM_DIR="$env:PWD_DIR\llvm-project" - echo "LLVM_DIR=$env:LLVM_DIR" - echo "LLVM_DIR=$env:LLVM_DIR" >> $env:GITHUB_ENV - - $env:LLVM_BUILD_DIR="$env:PWD_DIR\llvm-project\build" - echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" - echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $env:GITHUB_ENV - - if ( "${{ matrix.cling }}" -imatch "On" ) - { - $env:CLING_DIR="$env:PWD_DIR\cling" - echo "CLING_DIR=$env:CLING_DIR" - echo "CLING_DIR=$env:CLING_DIR" >> $env:GITHUB_ENV - - $env:CLING_BUILD_DIR="$env:PWD_DIR\cling\build" - echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" - echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" >> $env:GITHUB_ENV - - $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;" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV - } - else - { - $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;" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV - } - - # Build CppInterOp next to cling and llvm-project. - mkdir build - cd build - $env:CPPINTEROP_BUILD_DIR="$env:PWD_DIR" - echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR" - echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR" >> $env:GITHUB_ENV - if ( "${{ matrix.cling }}" -imatch "On" ) - { - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` - -DCPPINTEROP_USE_CLING=ON ` - -DCPPINTEROP_USE_REPL=OFF ` - -DCMAKE_PREFIX_PATH="$env:PREFIX" ` - -DCling_DIR="$env:LLVM_BUILD_DIR\tools\cling" ` - -DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" ` - -DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" ` - -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" ` - -DBUILD_SHARED_LIBS=ON ` - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` - -DCMAKE_INSTALL_PREFIX="$env:PREFIX" ` - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` - -DLLVM_ENABLE_WERROR=On ` - -DSYSROOT_PATH="$env:SYSROOT_PATH" ` - ..\ - } - else - { - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` - -DCMAKE_PREFIX_PATH="$env:PREFIX" ` - -DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" ` - -DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" ` - -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" ` - -DBUILD_SHARED_LIBS=ON ` - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` - -DCMAKE_INSTALL_PREFIX="$env:PREFIX" ` - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` - -DLLVM_ENABLE_WERROR=On ` - -DSYSROOT_PATH="$env:SYSROOT_PATH" ` - ..\ - } - function Error-OnFailure { - param ( - [Parameter(Mandatory)] - [ScriptBlock]$Command - ) - - & $Command - - if ($LASTEXITCODE -ne 0) { - exit $LASTEXITCODE - } - } - Error-OnFailure{ emmake make -j ${{ env.ncpus }} check-cppinterop } - cd .\unittests\CppInterOp\ - Invoke-WebRequest -Uri "https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win/1411573/chrome-win.zip" -OutFile "$PWD\chrome-win.zip" -Verbose - Expand-Archive -Path "$PWD\chrome-win.zip" -DestinationPath "$PWD" -Force -Verbose - Invoke-WebRequest -Uri "https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US" -OutFile "firefox-setup.exe" -Verbose - & "C:\Program Files\7-Zip\7z.exe" x "firefox-setup.exe" - $env:PATH="$PWD\core;$PWD\chrome-win;$env:PATH" - echo "PATH=$env:PATH" - echo "PATH=$env:PATH" >> $env:GITHUB_ENV - echo "Running CppInterOpTests in Firefox" - Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html } - echo "Running DynamicLibraryManagerTests in Firefox" - Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html } - echo "Running CppInterOpTests in Chromium" - Error-OnFailure { emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html } - echo "Running DynamicLibraryManagerTests in Chromium" - Error-OnFailure { emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html } - cd ..\.. - Error-OnFailure { emmake make -j ${{ env.ncpus }} install } - echo "SYSROOT_PATH=$env:SYSROOT_PATH" >> $GITHUB_ENV - echo "CPPINTEROP_DIR=$env:CPPINTEROP_DIR" >> $GITHUB_ENV - echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $GITHUB_ENV - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $GITHUB_ENV - echo "PREFIX=$env:PREFIX" >> $GITHUB_ENV - - - name: Build and Test/Install CppInterOp on Windows systems (static library) - if: ${{ runner.os == 'windows' }} - shell: powershell - run: | - .\emsdk\emsdk activate ${{matrix.emsdk_ver}} - .\emsdk\emsdk_env.ps1 - function Error-OnFailure { - param ( - [Parameter(Mandatory)] - [ScriptBlock]$Command - ) - - & $Command - - if ($LASTEXITCODE -ne 0) { - exit $LASTEXITCODE - } - } - $env:PWD_DIR= $PWD.Path - $env:SYSROOT_PATH="$env:EMSDK/upstream/emscripten/cache/sysroot" - $env:PREFIX="%CONDA_PREFIX%/envs/CppInterOp-wasm" - $env:CMAKE_PREFIX_PATH=$env:PREFIX - $env:CMAKE_SYSTEM_PREFIX_PATH=$env:PREFIX - - $env:LLVM_DIR="$env:PWD_DIR\llvm-project" - echo "LLVM_DIR=$env:LLVM_DIR" - echo "LLVM_DIR=$env:LLVM_DIR" >> $env:GITHUB_ENV - - $env:LLVM_BUILD_DIR="$env:PWD_DIR\llvm-project\build" - echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" - echo "LLVM_BUILD_DIR=$env:LLVM_BUILD_DIR" >> $env:GITHUB_ENV - - if ( "${{ matrix.cling }}" -imatch "On" ) - { - $env:CLING_DIR="$env:PWD_DIR\cling" - echo "CLING_DIR=$env:CLING_DIR" - echo "CLING_DIR=$env:CLING_DIR" >> $env:GITHUB_ENV - - $env:CLING_BUILD_DIR="$env:PWD_DIR\cling\build" - echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" - echo "CLING_BUILD_DIR=$env:CLING_BUILD_DIR" >> $env:GITHUB_ENV - - $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;" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV - } - else - { - $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;" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" - echo "CPLUS_INCLUDE_PATH=$env:CPLUS_INCLUDE_PATH" >> $env:GITHUB_ENV - } - - # Build CppInterOp next to cling and llvm-project. - mkdir build_static - cd build_static - $env:CPPINTEROP_BUILD_DIR="$env:PWD_DIR" - echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR" - echo "CPPINTEROP_BUILD_DIR=$env:CPPINTEROP_BUILD_DIR" >> $env:GITHUB_ENV - if ( "${{ matrix.cling }}" -imatch "On" ) - { - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` - -DCPPINTEROP_USE_CLING=ON ` - -DCPPINTEROP_USE_REPL=OFF ` - -DCMAKE_PREFIX_PATH="$env:PREFIX" ` - -DCling_DIR="$env:LLVM_BUILD_DIR\tools\cling" ` - -DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" ` - -DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" ` - -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" ` - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` - -DCMAKE_INSTALL_PREFIX="$env:PREFIX" ` - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` - -DLLVM_ENABLE_WERROR=On ` - -DSYSROOT_PATH="$env:SYSROOT_PATH" ` - ..\ - } - else - { - emcmake cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} ` - -DCMAKE_PREFIX_PATH="$env:PREFIX" ` - -DLLVM_DIR="$env:LLVM_BUILD_DIR\lib\cmake\llvm" ` - -DLLD_DIR="$env:LLVM_BUILD_DIR\lib\cmake\lld" ` - -DClang_DIR="$env:LLVM_BUILD_DIR\lib\cmake\clang" ` - -DCODE_COVERAGE=${{ env.CODE_COVERAGE }} ` - -DCMAKE_INSTALL_PREFIX="$env:PREFIX" ` - -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON ` - -DLLVM_ENABLE_WERROR=On ` - -DSYSROOT_PATH="$env:SYSROOT_PATH" ` - ..\ - } - Error-OnFailure { emmake make -j ${{ env.ncpus }} check-cppinterop } - cd .\unittests\CppInterOp\ - echo "Running CppInterOpTests in Firefox" - Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" CppInterOpTests.html } - echo "Running DynamicLibraryManagerTests in Firefox" - Error-OnFailure { emrun.bat --browser="firefox.exe" --kill_exit --timeout 60 --browser-args="--headless" DynamicLibraryManagerTests.html } - echo "Running CppInterOpTests in Chromium" - Error-OnFailure { emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" CppInterOpTests.html } - echo "Running DynamicLibraryManagerTests in Chromium" - Error-OnFailure{ emrun.bat --browser="chrome.exe" --kill_exit --timeout 60 --browser-args="--headless --no-sandbox" DynamicLibraryManagerTests.html } + - name: Build and test CppInterOp + uses: ./.github/actions/Build_and_Test_CppInterOp - name: Build xeus-cpp on Unix Systems if: ${{ runner.os != 'windows' }}