Add CI compiling rustc #4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Nightly cross-compilation of rustc with rustc_codegen_gcc | |
| on: | |
| pull_request: | |
| # TODO: remove pull_request and add schedule to run during the night. | |
| env: | |
| # Enable backtraces for easier debugging | |
| RUST_BACKTRACE: 1 | |
| jobs: | |
| build: | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| arch: | |
| - host_target: "m68k-unknown-linux-gnu" | |
| cross_target: "m68k" | |
| debian_url: "http://ftp.ports.debian.org/debian-ports" | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| path: "rustc_codegen_gcc" | |
| - uses: actions/checkout@v4 | |
| with: | |
| repository: "rust-lang/rust" | |
| path: "rust" | |
| fetch-depth: 10 | |
| # The compilation of rustc for m68k requires a lot of disk space, so free some space up. | |
| - name: Free Disk Space | |
| uses: endersonmenezes/free-disk-space@v3 | |
| with: | |
| remove_android: true | |
| remove_dotnet: true | |
| remove_haskell: true | |
| remove_tool_cache: true | |
| remove_swap: true | |
| remove_packages: "azure-cli google-cloud-cli microsoft-edge-stable google-chrome-stable firefox postgresql* temurin-* *llvm* mysql* dotnet-sdk-*" | |
| remove_packages_one_command: true | |
| remove_folders: "/usr/share/swift /usr/share/miniconda /usr/share/az* /usr/local/lib/node_modules /usr/local/share/chromium /usr/local/share/powershell /usr/local/julia /usr/local/aws-cli /usr/local/aws-sam-cli /usr/share/gradle" | |
| - name: Install packages | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install debootstrap qemu-system qemu-user-static | |
| # `rustup show` installs from rust-toolchain.toml | |
| - name: Setup rust toolchain | |
| run: rustup show | |
| - name: Setup rust cache | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Download and install artifacts | |
| run: | | |
| curl -L -o package.deb https://github.com/rust-lang/gcc/releases/latest/download/gcc-15.deb | |
| sudo dpkg --force-overwrite -i package.deb | |
| - name: Generate Debian qemu image | |
| run: | | |
| dd if=/dev/zero of=debian.img bs=1M count=15360 | |
| mkfs.ext4 debian.img -L root | |
| mkdir vm | |
| sudo mount debian.img vm | |
| sudo debootstrap --no-check-gpg --arch=${{ matrix.arch.cross_target }} --foreign unstable vm ${{ matrix.arch.debian_url }} | |
| sudo cp $(which qemu-${{ matrix.arch.cross_target }}-static) vm/usr/bin/ | |
| - name: Download cross-compiling libgccjit.so and move it in libgccjit-libs-dir | |
| run: | | |
| curl -LO https://github.com/cross-cg-gcc-tools/cross-gcc/releases/latest/download/gcc-${{ matrix.arch.cross_target }}-15.deb | |
| sudo dpkg-deb -x gcc-${{ matrix.arch.cross_target }}-15.deb cross-gcc | |
| dir=$HOME/libgccjit-libs-dir/x86_64-unknown-linux-gnu/${{ matrix.arch.host_target }} | |
| mkdir -p $dir | |
| sudo mv cross-gcc/usr/lib/libgccjit.so.0.0.1 $dir/libgccjit.so | |
| echo "$(pwd)/cross-gcc/usr/bin" >> $GITHUB_PATH | |
| - name: Download native libgccjit.so and move it in libgccjit-libs-dir | |
| run: | | |
| curl -LO https://github.com/cross-cg-gcc-tools/native-gcc/releases/latest/download/libgccjit-${{ matrix.arch.cross_target }}.so | |
| dir=$HOME/libgccjit-libs-dir/${{ matrix.arch.host_target }}/${{ matrix.arch.host_target }} | |
| mkdir -p $dir | |
| mv libgccjit-${{ matrix.arch.cross_target }}.so $dir/libgccjit.so | |
| - name: Patch linux-raw-sys and rustix. | |
| run: | | |
| cd rust | |
| cat <<'EOF' > patch.toml | |
| [patch.crates-io] | |
| linux-raw-sys = { git = "https://github.com/antoyo/linux-raw-sys", branch = "m68k-support" } | |
| rustix = { git = "https://github.com/antoyo/rustix", branch = "m68k-support" } | |
| EOF | |
| cat patch.toml >> Cargo.toml | |
| cat patch.toml >> compiler/rustc_codegen_gcc/Cargo.toml | |
| cargo update -p rustix | |
| cd compiler/rustc_codegen_gcc/ | |
| cargo update -p rustix | |
| cd ../.. | |
| echo Checking Rust | |
| cargo tree -i linux-raw-sys 2>&1 | grep "was not used in the crate graph" && { cargo tree; echo "Error: Unused patches found"; exit 1; } || exit 0 | |
| echo Checking rustc_codegen_gcc | |
| cargo tree --manifest-path compiler/rustc_codegen_gcc/Cargo.toml -i linux-raw-sys 2>&1 | grep "was not used in the crate graph" && { cargo tree; echo "Error: Unused patches found"; exit 1; } || exit 0 | |
| - name: Compile rustc | |
| run: | | |
| cd rust | |
| ./x build --host=${{ matrix.arch.host_target }} --stage 2 --config ../rustc_codegen_gcc/tests/bootstraps/bootstrap.${{ matrix.arch.host_target }}.toml | |
| - name: Copy toolchain in VM | |
| run: | | |
| sudo rsync -a --exclude=stage2/lib/rustlib/src --exclude=stage2/lib/rustlib/rustc-src/ rust/build/${{ matrix.arch.host_target }}/stage2/ vm/home/stage2 | |
| - name: Smoke test | |
| run: | | |
| sudo chroot vm qemu-${{ matrix.arch.cross_target }}-static /bin/sh -c '/home/stage2/bin/rustc' > output | |
| grep rustc2 output | |
| # TODO: compile a test program for m68k when the compiler works. | |
| #- name: Compile test program | |
| #run: | | |
| #cd rustc_codegen_gcc/tests/hello-world | |
| #cargo +my-toolchain build | |
| #objcopy --dump-section .comment=comment target/debug/hello_world | |
| #grep "rustc version .* with libgccjit" comment | |
| #grep 'GCC: ' comment | |
| #cargo +my-toolchain run > hello_world_stdout | |
| #expected_output="40" | |
| #test $(cat hello_world_stdout) == $expected_output || (echo "Output differs. Actual output: $(cat hello_world_stdout)"; exit 1) |