name: Lagom Template on: workflow_call: inputs: toolchain: required: true type: string os_name: required: true type: string os: required: true type: string fuzzer: required: false type: string default: 'NO_FUZZ' clang_plugins: required: false type: boolean default: false env: # runner.workspace = /home/runner/work/serenity # github.workspace = /home/runner/work/serenity/serenity LADYBIRD_SOURCE_DIR: ${{ github.workspace }} CCACHE_DIR: ${{ github.workspace }}/.ccache VCPKG_ROOT: ${{ github.workspace }}/Toolchain/Tarballs/vcpkg VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" # Use the compiler version for the ccache compiler hash. Otherwise, if plugins are enabled, the plugin .so files # are included in the hash. This results in clean builds on every run as the .so files are rebuilt. # # Note: This only works because our plugins do not transform any code. If that becomes untrue, we must revisit this. CCACHE_COMPILERCHECK: "%compiler% -v" jobs: CI: runs-on: ${{ inputs.os }} steps: # Pull requests can trail behind `master` and can cause breakage if merging before running the CI checks on an updated branch. # Luckily, GitHub creates and maintains a merge branch that is updated whenever the target or source branch is modified. By # checking this branch out, we gain a stabler `master` at the cost of reproducibility. - uses: actions/checkout@v4 if: ${{ github.event_name != 'pull_request' }} - uses: actions/checkout@v4 if: ${{ github.event_name == 'pull_request' }} with: ref: refs/pull/${{ github.event.pull_request.number }}/merge - name: Set Up Environment uses: ./.github/actions/setup with: os: ${{ inputs.os_name }} arch: 'Lagom' # === PREPARE FOR BUILDING === - name: Assign Build Parameters id: 'build-parameters' run: | if ${{ inputs.os_name == 'Linux' }} ; then if ${{ inputs.toolchain == 'Clang' }} ; then echo "host_cc=clang-18" >> "$GITHUB_OUTPUT" echo "host_cxx=clang++-18" >> "$GITHUB_OUTPUT" elif ${{ inputs.toolchain == 'GNU' }} ; then echo "host_cc=gcc-13" >> "$GITHUB_OUTPUT" echo "host_cxx=g++-13" >> "$GITHUB_OUTPUT" fi elif ${{ inputs.os_name == 'macOS' }} ; then echo "host_cc=$(xcrun --find clang)" >> "$GITHUB_OUTPUT" echo "host_cxx=$(xcrun --find clang++)" >> "$GITHUB_OUTPUT" fi if ${{ inputs.clang_plugins }} ; then echo "ccache_key=${{ inputs.fuzzer }}-CLANG_PLUGINS" >> "$GITHUB_OUTPUT" echo "cmake_build_preset=CI" >> "$GITHUB_OUTPUT" echo "cmake_test_preset=default" >> "$GITHUB_OUTPUT" echo "cmake_options=-DENABLE_CLANG_PLUGINS=ON" >> "$GITHUB_OUTPUT" else echo "ccache_key=${{ inputs.fuzzer }}" >> "$GITHUB_OUTPUT" echo "cmake_build_preset=Sanitizer_CI" >> "$GITHUB_OUTPUT" echo "cmake_test_preset=Sanitizer" >> "$GITHUB_OUTPUT" echo "cmake_options=" >> "$GITHUB_OUTPUT" fi - name: Restore Caches uses: ./.github/actions/cache-restore id: 'cache-restore' with: os: ${{ inputs.os_name }} arch: 'Lagom' toolchain: ${{ inputs.toolchain }} cache_key_extra: ${{ steps.build-parameters.outputs.ccache_key }} serenity_ccache_path: ${{ env.CCACHE_DIR }} download_cache_path: ${{ github.workspace }}/Build/caches - name: Set dynamic environment variables id: 'set-env-vars' run: | # Note: Required for vcpkg to use this compiler for its own builds. echo "CC=${{ steps.build-parameters.outputs.host_cc }}" >> "$GITHUB_ENV" echo "CXX=${{ steps.build-parameters.outputs.host_cxx }}" >> "$GITHUB_ENV" # https://github.com/actions/runner-images/issues/9330 - name: Enable Microphone Access (macOS 14) if: ${{ inputs.os == 'macos-14' }} run: sqlite3 $HOME/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT OR IGNORE INTO access VALUES ('kTCCServiceMicrophone','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159,NULL,NULL,'UNUSED',1687786159);" - name: Create Build Environment if: ${{ inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }} run: | cmake --preset ${{ steps.build-parameters.outputs.cmake_build_preset }} -B Build \ -DINCLUDE_WASM_SPEC_TESTS=ON \ -DWASM_SPEC_TEST_SKIP_FORMATTING=ON \ ${{ steps.build-parameters.outputs.cmake_options }} \ -DCMAKE_C_COMPILER=${{ steps.build-parameters.outputs.host_cc }} \ -DCMAKE_CXX_COMPILER=${{ steps.build-parameters.outputs.host_cxx }} - name: Create Build Environment if: ${{ inputs.fuzzer == 'FUZZ' }} working-directory: ${{ github.workspace }} run: | set -e cmake --preset=CI -S Meta/Lagom -B ${{ github.workspace }}/Build/tools-build \ -DLAGOM_TOOLS_ONLY=ON \ -DINSTALL_LAGOM_TOOLS=ON \ -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/Build/tools-install \ -DCMAKE_C_COMPILER=gcc-13 \ -DCMAKE_CXX_COMPILER=g++-13 \ -Dpackage=LagomTools ninja -C ${{ github.workspace }}/Build/tools-build install cmake --preset Fuzzers_CI -B Build \ -DCMAKE_C_COMPILER=${{ steps.build-parameters.outputs.host_cc }} \ -DCMAKE_CXX_COMPILER=${{ steps.build-parameters.outputs.host_cxx }} \ -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Build/tools-install # === BUILD === - name: Build working-directory: ${{ github.workspace }}/Build run: | set -e cmake --build . cmake --install . --strip --prefix ${{ github.workspace }}/Install - name: Enable the Ladybird Qt chrome if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }} run: cmake -B Build -DENABLE_QT=ON - name: Build the Ladybird Qt chrome if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }}/Build run: cmake --build . - name: Enable the AppKit chrome with Swift files if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }} # FIXME: Don't force release build after https://github.com/LadybirdBrowser/ladybird/issues/1101 is fixed run: cmake -B Build -DENABLE_QT=OFF -DENABLE_SWIFT=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo - name: Build the AppKit chrome with Swift files if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }}/Build run: cmake --build . - name: Save Caches uses: ./.github/actions/cache-save with: arch: 'Lagom' serenity_ccache_path: ${{ env.CCACHE_DIR }} serenity_ccache_primary_key: ${{ steps.cache-restore.outputs.serenity_ccache_primary_key }} # === TEST === - name: Test if: ${{ inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }} run: ctest --preset ${{ steps.build-parameters.outputs.cmake_test_preset }} --output-on-failure --test-dir Build env: TESTS_ONLY: 1 - name: Upload LibWeb Test Artifacts if: ${{ always() && inputs.fuzzer == 'NO_FUZZ' }} uses: actions/upload-artifact@v4 with: name: libweb-test-artifacts-${{ inputs.os_name }} path: ${{ github.workspace }}/Build/Ladybird/test-dumps retention-days: 7 if-no-files-found: ignore - name: Lints if: ${{ inputs.os_name == 'Linux' && inputs.fuzzer == 'NO_FUZZ' }} working-directory: ${{ github.workspace }} run: | set -e git ls-files '*.ipc' | xargs ./Build/bin/IPCMagicLinter env: ASAN_OPTIONS: 'strict_string_checks=1:check_initialization_order=1:strict_init_order=1:detect_stack_use_after_return=1:allocator_may_return_null=1' UBSAN_OPTIONS: 'print_stacktrace=1:print_summary=1:halt_on_error=1'