# This workflow builds and tests the binary for various configurations. name: Build and test # This workflow can only be triggered by other workflows. Note that the # workflow_call event does not support the 'choice' input type, see # https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#onworkflow_callinputsinput_idtype, # so we use 'string' instead. on: workflow_call: inputs: build_dir: description: "The directory where to build." required: false type: string default: ".build" dependencies_force_build: description: "Force building of all dependencies." required: false type: boolean default: false dependencies_force_upload: description: "Force uploading of all dependencies." required: false type: boolean default: false os: description: 'The operating system to use for the build ("linux", "macos", "windows").' required: true type: string strategy_matrix: # TODO: Support additional strategies, e.g. "ubuntu" for generating all Ubuntu configurations. description: 'The strategy matrix to use for generating the configurations ("minimal", "all").' required: false type: string default: "minimal" secrets: codecov_token: description: "The Codecov token to use for uploading coverage reports." required: false concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.os }} cancel-in-progress: true defaults: run: shell: bash jobs: # Generate the strategy matrix to be used by the following job. generate-matrix: uses: ./.github/workflows/reusable-strategy-matrix.yml with: os: ${{ inputs.os }} strategy_matrix: ${{ inputs.strategy_matrix }} # Build and test the binary. build-test: needs: - generate-matrix strategy: fail-fast: false matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} runs-on: ${{ matrix.architecture.runner }} container: ${{ inputs.os == 'linux' && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version) || null }} steps: - name: Check strategy matrix run: | echo 'Operating system distro name: ${{ matrix.os.distro_name }}' echo 'Operating system distro version: ${{ matrix.os.distro_version }}' echo 'Operating system compiler name: ${{ matrix.os.compiler_name }}' echo 'Operating system compiler version: ${{ matrix.os.compiler_version }}' echo 'Architecture platform: ${{ matrix.architecture.platform }}' echo 'Architecture runner: ${{ toJson(matrix.architecture.runner) }}' echo 'Build type: ${{ matrix.build_type }}' echo 'Build only: ${{ matrix.build_only }}' echo 'CMake arguments: ${{ matrix.cmake_args }}' echo 'CMake target: ${{ matrix.cmake_target }}' echo 'Config name: ${{ matrix.config_name }}' - name: Cleanup workspace if: ${{ runner.os == 'macOS' }} uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e - name: Checkout repository uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Prepare runner uses: XRPLF/actions/.github/actions/prepare-runner@638e0dc11ea230f91bd26622fb542116bb5254d5 with: disable_ccache: false - name: Check configuration (Windows) if: ${{ inputs.os == 'windows' }} run: | echo 'Checking environment variables.' set echo 'Checking CMake version.' cmake --version echo 'Checking Conan version.' conan --version - name: Check configuration (Linux and MacOS) if: ${{ inputs.os == 'linux' || inputs.os == 'macos' }} run: | echo 'Checking path.' echo ${PATH} | tr ':' '\n' echo 'Checking environment variables.' env | sort echo 'Checking CMake version.' cmake --version echo 'Checking compiler version.' ${{ inputs.os == 'linux' && '${CC}' || 'clang' }} --version echo 'Checking Conan version.' conan --version echo 'Checking Ninja version.' ninja --version echo 'Checking nproc version.' nproc --version - name: Setup Conan uses: ./.github/actions/setup-conan - name: Build dependencies uses: ./.github/actions/build-deps with: build_dir: ${{ inputs.build_dir }} build_type: ${{ matrix.build_type }} force_build: ${{ inputs.dependencies_force_build }} - name: Build and test binary uses: ./.github/actions/build-test with: build_dir: ${{ inputs.build_dir }} build_only: ${{ matrix.build_only }} build_type: ${{ matrix.build_type }} cmake_args: ${{ matrix.cmake_args }} cmake_target: ${{ matrix.cmake_target }} codecov_token: ${{ secrets.codecov_token }} os: ${{ inputs.os }}