ci: fix remote cross compilation #3 #4
Conversation
There was a problem hiding this comment.
Summary of Changes
Hello @auricom, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request aims to resolve critical cross-compilation failures encountered during multi-architecture Docker builds, particularly for ARM64 targets. By introducing dedicated Docker images with properly configured toolchains and dependencies, I've ensured that the project can successfully build on both x86_64 and ARM64 architectures, addressing issues like missing headers, linker errors, and incorrect compiler flags.
Highlights
- Multi-Architecture Cross-Compilation Setup: I've introduced a new
Cross.tomlconfiguration file to define custom Docker images for cross-compilation targets, specificallyx86_64-unknown-linux-gnuandaarch64-unknown-linux-gnu. This centralizes the configuration forcross-rs. - ARM64 Docker Build Environment: I've added
Dockerfile.cross-aarch64which sets up a comprehensive ARM64 cross-compilation environment. This includes installing necessary toolchains (gcc, g++, libc6-dev, pkg-config) and development libraries (build-essential, clang, libclang-dev), along with configuring environment variables likeCC,CXX,AR,STRIP,PKG_CONFIG, andBINDGEN_EXTRA_CLANG_ARGSto ensure proper linking and header discovery for ARM64 builds. - x86_64 Docker Build Environment: I've also added
Dockerfile.cross-x86_64to provide a dedicated x86_64 cross-compilation environment. This Dockerfile installs essential build tools and libraries (build-essential, pkg-config, libclang-dev, clang) and configures target-specific environment variables for x86_64, similar to the ARM64 setup, to resolve compilation issues.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.
| Feature | Command | Description |
|---|---|---|
| Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
| Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
| Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
| Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Code Review
This pull request introduces dedicated Dockerfiles for cross-compilation, improving multi-architecture builds. The review suggests pinning base image versions, using --no-install-recommends in apt-get, and combining ENV instructions for better reproducibility, smaller image sizes, and enhanced maintainability.
| @@ -0,0 +1,27 @@ | |||
| FROM ghcr.io/cross-rs/cross:main | |||
| @@ -0,0 +1,19 @@ | |||
| FROM ghcr.io/cross-rs/cross:main | |||
| apt-get install -y \ | ||
| gcc-aarch64-linux-gnu \ | ||
| g++-aarch64-linux-gnu \ | ||
| libc6-dev-arm64-cross \ | ||
| pkg-config-aarch64-linux-gnu \ | ||
| build-essential \ | ||
| clang \ | ||
| libclang-dev && \ |
There was a problem hiding this comment.
Using --no-install-recommends with apt-get install reduces the final image size by preventing the installation of optional packages.
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
libc6-dev-arm64-cross \
pkg-config-aarch64-linux-gnu \
build-essential \
clang \
libclang-dev && \
rm -rf /var/lib/apt/lists/*
| ENV CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc | ||
| ENV CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ | ||
| ENV AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar | ||
| ENV STRIP_aarch64_unknown_linux_gnu=aarch64-linux-gnu-strip | ||
| ENV PKG_CONFIG_aarch64_unknown_linux_gnu=aarch64-linux-gnu-pkg-config | ||
| ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc | ||
| ENV BINDGEN_EXTRA_CLANG_ARGS="-I/usr/aarch64-linux-gnu/include -I/usr/include" | ||
| ENV CFLAGS_aarch64_unknown_linux_gnu="-I/usr/aarch64-linux-gnu/include -I/usr/include" | ||
| ENV CPPFLAGS_aarch64_unknown_linux_gnu="-I/usr/aarch64-linux-gnu/include -I/usr/include" | ||
| ENV JEMALLOC_SYS_WITH_LG_PAGE=16 | ||
| ENV PKG_CONFIG_ALLOW_CROSS=1 No newline at end of file |
There was a problem hiding this comment.
Combining multiple ENV instructions and using a variable for repeated values improves readability and reduces Docker image layers.
ENV AARCH64_INCLUDE_PATH="-I/usr/aarch64-linux-gnu/include -I/usr/include"
ENV CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ \
AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar \
STRIP_aarch64_unknown_linux_gnu=aarch64-linux-gnu-strip \
PKG_CONFIG_aarch64_unknown_linux_gnu=aarch64-linux-gnu-pkg-config \
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
BINDGEN_EXTRA_CLANG_ARGS="${AARCH64_INCLUDE_PATH}" \
CFLAGS_aarch64_unknown_linux_gnu="${AARCH64_INCLUDE_PATH}" \
CPPFLAGS_aarch64_unknown_linux_gnu="${AARCH64_INCLUDE_PATH}" \
JEMALLOC_SYS_WITH_LG_PAGE=16 \
PKG_CONFIG_ALLOW_CROSS=1
| apt-get install -y \ | ||
| build-essential \ | ||
| pkg-config \ | ||
| libclang-dev \ | ||
| clang && \ |
There was a problem hiding this comment.
| ENV CC_x86_64_unknown_linux_gnu=x86_64-linux-gnu-gcc | ||
| ENV CXX_x86_64_unknown_linux_gnu=x86_64-linux-gnu-g++ | ||
| ENV AR_x86_64_unknown_linux_gnu=x86_64-linux-gnu-ar | ||
| ENV STRIP_x86_64_unknown_linux_gnu=x86_64-linux-gnu-strip | ||
| ENV BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_linux_gnu="-I/usr/include -I/usr/include/x86_64-linux-gnu" | ||
| ENV CFLAGS_x86_64_unknown_linux_gnu="-I/usr/include -I/usr/include/x86_64-linux-gnu" | ||
| ENV CPPFLAGS_x86_64_unknown_linux_gnu="-I/usr/include -I/usr/include/x86_64-linux-gnu" |
There was a problem hiding this comment.
Combining multiple ENV instructions and using a variable for repeated values improves readability and reduces Docker image layers.
ENV X86_64_INCLUDE_PATH="-I/usr/include -I/usr/include/x86_64-linux-gnu"
ENV CC_x86_64_unknown_linux_gnu=x86_64-linux-gnu-gcc \
CXX_x86_64_unknown_linux_gnu=x86_64-linux-gnu-g++ \
AR_x86_64_unknown_linux_gnu=x86_64-linux-gnu-ar \
STRIP_x86_64_unknown_linux_gnu=x86_64-linux-gnu-strip \
BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_linux_gnu="${X86_64_INCLUDE_PATH}" \
CFLAGS_x86_64_unknown_linux_gnu="${X86_64_INCLUDE_PATH}" \
CPPFLAGS_x86_64_unknown_linux_gnu="${X86_64_INCLUDE_PATH}"
* docker fixes * bump rust version in docker * more fixes * more fixes * attempt * ci: fix remote cross compilation (#4) * only create images on push to main --------- Co-authored-by: auricom <27022259+auricom@users.noreply.github.com>
Fix Remote Cross Compilation for Multi-Architecture Docker Builds
🎯 Problem
The GitHub Actions workflow was failing during cross-compilation for ARM64 (aarch64) targets due to missing native dependencies and improper toolchain configuration. The build errors included:
fatal: No names found, cannot describe anythingduring git operationserror: failed to run custom build command for reth-mdbx-syswith missingstdarg.hheaderscould not exec the linker ccpermission denied errors-m64🔧 Solution
This PR implements a comprehensive fix for cross-compilation issues by:
1. Enhanced GitHub Workflow (
.github/workflows/docker.yml)build-essential,libclang-dev,clang,llvm-dev2. Cross-Compilation Configuration (
Cross.toml)3. ARM64 Docker Image (
Dockerfile.cross-aarch64)4. x86_64 Docker Image (
Dockerfile.cross-x86_64)🚀 Key Improvements
reth-mdbx-sys,tikv-jemalloc-sys, andblstnow build successfullystdarg.hand other standard headersThis fix ensures the project can build and deploy successfully on both Intel/AMD and ARM-based systems, supporting the growing ARM64 ecosystem while maintaining full x86_64 compatibility.
Summary by CodeRabbit