Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 144 additions & 0 deletions .github/workflows/nightly_cross_rustc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
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/pekkarr/linux-raw-sys", branch = "m68k" }
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)
71 changes: 71 additions & 0 deletions .github/workflows/nightly_rustc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Nightly 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: "x86_64-unknown-linux-gnu"

steps:
- uses: actions/checkout@v4
with:
path: "rustc_codegen_gcc"

- uses: actions/checkout@v4
with:
repository: "rust-lang/rust"
path: "rust"
fetch-depth: 10

# `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: 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: Link toolchain
run: |
cd rust
rustup toolchain link my-toolchain build/${{ matrix.arch.host_target }}/stage2

- name: Smoke test
run: |
rustc +my-toolchain -V > output
grep rustc output

- 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)
18 changes: 18 additions & 0 deletions tests/bootstraps/bootstrap.m68k-unknown-linux-gnu.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
profile = "compiler"
change-id = 140732

[build]
target = ["m68k-unknown-linux-gnu"]

[rust]
codegen-backends = ["gcc"]
deny-warnings = false
debug-assertions = false
debug-assertions-std = false

[gcc]
download-ci-gcc = true
libgccjit-libs-dir = "/home/runner/libgccjit-libs-dir"

[target.m68k-unknown-linux-gnu]
cc = "/home/runner/work/rustc_codegen_gcc/rustc_codegen_gcc/cross-gcc/usr/bin/m68k-unknown-linux-gnu-gcc"
11 changes: 11 additions & 0 deletions tests/bootstraps/bootstrap.x86_64-unknown-linux-gnu.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
profile = "compiler"
change-id = 140732

[rust]
codegen-backends = ["gcc"]
deny-warnings = false
debug-assertions = false
debug-assertions-std = false

[gcc]
download-ci-gcc = true
Loading