name: Build + Test on: push: branches: - main pull_request: branches: - main env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release CC: clang CXX: clang++ jobs: build_plus_test: runs-on: ${{ matrix.arch }} strategy: matrix: arch: [[self-hosted, ARMv8.0], [self-hosted, ARMv8.2], [self-hosted, ARMv8.4]] fail-fast: false steps: - uses: actions/checkout@v3 - name: Set runner label run: echo "runner_label=${{ matrix.arch[1] }}" >> $GITHUB_ENV - name: Set rootfs paths run: | echo "FEX_ROOTFS_MOUNT=/mnt/AutoNFS/rootfs/" >> $GITHUB_ENV echo "FEX_ROOTFS_PATH=$HOME/Rootfs/" >> $GITHUB_ENV echo "FEX_ROOTFS=$HOME/Rootfs/" >> $GITHUB_ENV echo "ROOTFS=$HOME/Rootfs/" >> $GITHUB_ENV - name: Update RootFS cache # Use a bash shell so we can use the same syntax for environment variable # access regardless of the host operating system shell: bash run: $GITHUB_WORKSPACE/Scripts/CI_FetchRootFS.py - name : submodule checkout # Need to update submodules run: | git submodule sync --recursive git submodule update --init --depth 1 - name: Clean Build Environment run: rm -Rf ${{runner.workspace}}/build - name: Create Build Environment # Some projects don't allow in-source building, so create a separate build directory # We'll use this as our working directory for all subsequent commands run: cmake -E make_directory ${{runner.workspace}}/build - name: Configure CMake # Use a bash shell so we can use the same syntax for environment variable # access regardless of the host operating system shell: bash working-directory: ${{runner.workspace}}/build # Note the current convention is to use the -S and -B options here to specify source # and build directories, but this is only available with CMake 3.13 and higher. # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DENABLE_LTO=False -DENABLE_ASSERTIONS=True -DBUILD_FEX_LINUX_TESTS=True -DBUILD_THUNKS=True -DCMAKE_INSTALL_PREFIX=${{runner.workspace}}/build/install - name: Build working-directory: ${{runner.workspace}}/build shell: bash # Execute the build. You can specify a specific target with "--target " run: cmake --build . --config $BUILD_TYPE - name: Install working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target install - name: gcc target tests 64 working-directory: ${{runner.workspace}}/build shell: bash # Execute the gvisor tests run: cmake --build . --config $BUILD_TYPE --target gcc_target_tests_64 - name: GCC64 Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_GCC64.log || true - name: gcc target tests 32 working-directory: ${{runner.workspace}}/build shell: bash # Execute the gvisor tests run: cmake --build . --config $BUILD_TYPE --target gcc_target_tests_32 - name: GCC32 Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_GCC32.log || true - name: APITest tests working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target api_tests - name: APITest Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_APITests.log || true - name: FEXCore APITest tests working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target fexcore_apitests - name: FEXCore APITest Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_FEXCoreAPITests.log || true - name: ARMEmitter tests working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target emitter_tests - name: ARMEmitter Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_ARMEmitterTests.log || true - name: FEXLinuxTests working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target fex_linux_tests_all - name: FEXLinuxTests Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_FEXLinuxTests.log || true - name: Thunkgen tests working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target thunkgen_tests - name: Thunkgen Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_ThunkgenTests.log || true - name: Test GL No-Thunks if: matrix.arch[1] == 'x64' working-directory: ${{runner.workspace}}/build shell: bash env: DISPLAY: ":0" run: cmake --build . --config $BUILD_TYPE --target thunk_functional_tests_nothunks - name: No thunks Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_NoThunkResults.log || true - name: Test GL Thunks if: matrix.arch[1] == 'x64' working-directory: ${{runner.workspace}}/build shell: bash env: DISPLAY: ":0" run: cmake --build . --config $BUILD_TYPE --target thunk_functional_tests_thunks - name: Thunks Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_ThunkResults.log || true - name: ASM Tests working-directory: ${{runner.workspace}}/build shell: bash # Execute the unit tests run: cmake --build . --config $BUILD_TYPE --target asm_tests - name: ASM Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_ASM.log || true - name: Posix Tests working-directory: ${{runner.workspace}}/build shell: bash # Execute the posixtest run: cmake --build . --config $BUILD_TYPE --target posix_tests - name: Posix Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_Posix.log || true - name: gvisor tests working-directory: ${{runner.workspace}}/build shell: bash # Execute the gvisor tests run: cmake --build . --config $BUILD_TYPE --target gvisor_tests - name: GVisor Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_GVisor.log || true - name: Struct verifier tests working-directory: ${{runner.workspace}}/build shell: bash run: cmake --build . --config $BUILD_TYPE --target struct_verifier - name: Struct verifier Test Results move if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: mv ${{runner.workspace}}/build/Testing/Temporary/LastTest.log ${{runner.workspace}}/build/Testing/Temporary/LastTest_StructVerifier.log || true - name: Truncate test results if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build # Cap out the log files at 20M in case something crash spins and dumps fault text # ASM tests get quite close to 10MB run: truncate --size="<20M" ${{runner.workspace}}/build/Testing/Temporary/LastTest_*.log || true - name: Remove old SHM regions if: ${{ always() }} shell: bash working-directory: ${{runner.workspace}}/build run: cmake --build . --config $BUILD_TYPE --target remove_old_shm_regions - name: Set runner name if: ${{ always() }} run: echo "runner_name=$(hostname)" >> $GITHUB_ENV - name: Upload results if: ${{ always() }} uses: 'actions/upload-artifact@v3' timeout-minutes: 1 with: name: Results-${{ env.runner_name }} path: ${{runner.workspace}}/build/Testing/Temporary/LastTest_*.log retention-days: 3