Cross compiling arm

Hi, I'm trying to cross compile raylib(essentially glfw w/ extras) from my host x86 archlinux to arm64 linux

/usr/lib/gcc/aarch64-linux-gnu/13.1.0/../../../../aarch64-linux-gnu/bin/ld: cannot find -lX11: No such file or directory
          collect2: error: ld returned 1 exit status

^ with cargo build --target aarch64-unknown-linux-gnu , I presume I need the arm64 version of x11 installed or something?

and the following is done with cross

 --- stderr
  CMake Error at /usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
    Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB)
  Call Stack (most recent call first):
    /usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
    /usr/local/share/cmake-3.17/Modules/FindX11.cmake:366 (find_package_handle_standard_args)
    src/external/glfw/src/CMakeLists.txt:187 (find_package)

^ this comes from glfw cmake file, which says it cant find x11, in which case I presume I need to make a docker image and install the deps.

Which one is easier to fix?

I fixed the cargo build --target aarch64-unknown-linux-gnu by downloading arm x11 so files libx11 (aarch64) | Packages | Arch Linux ARM
and specifying the flags on where to find em in .cargo/config.toml

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
rustflags = ["-L", "/usr/lib/gcc/aarch64-linux-gnu/13.1.0/tmp/usr/lib/"] # should put it somewhere better

IDK about cross though.

If you're on Debian/Ubuntu, you can get packages for other architectures with:

dpkg --add-architecture aarch64
apt-get update
apt-get install x11:aarch64
2 Likes

Regarding cross, you can simply add to your Cargo.toml:


[package.metadata.cross.target.aarch64-unknown-linux-gnu]
pre-build = [""" \
    dpkg --add-architecture arm64 && \
    apt-get update && \
    apt-get install --assume-yes --no-install-recommends \
    libx11-dev:arm64 \
    """]

However, there’s an issue with newer cross images. See here:

Basically cross provides a faulty cmake toolchain file, which will throw off any crate which also uses cmake (like glfw) to find system dependencies.

This was first reported also for x11 dependency in fltk-rs. The 2nd comment in the issue tracker points to that issue.

A solution is to remove the CROSS_SYSTOOT env var:

// build.rs
    if std::env::var("CROSS_SYSROOT").is_ok() {
        std::env::remove_var("CROSS_SYSROOT");
    }

1 Like

I presume you mean my projects Cargo.toml and build.rs ? I tried sticking these in and still get the same issue with cross/cmake x11

Here is a reproducible version: GitHub - jestarray/raylib_sandbox

Brief warning that Arch Linux ARM is in a dire state of neglect compared to other distributions on ARM. (Arch x86_64 is perfectly healthy.) I'd probably fetch from Debian repos first if I was doing manual downloads.

Build containers or VMs are always going to be the safest bet when linking C libraries when cross-compiling to a Host Tools platform.

I git cloned your repo and ran cross, and I get the message:

  CMake Error at src/external/glfw/src/CMakeLists.txt:192 (message):
    RandR headers not found; install libxrandr development package

That's a good thing. It's telling you to install libxrandr, whereas previously the build stopped at libx11.

On the raylib repo, it lists the libs it requires. For every library, add a :arm64 postfix like libxrandr-dev:arm64 etc.
You'll need to also modify your build.rs to link to the required libs.

Using Docker (and by extension Cross-rs) can be daunting since it gives you a clean distro with no graphical libs. So you'll have to install all the necessary libs.

That's weird, I'm not getting any complaints about xrandr at all. Here is my error log:

error: failed to run custom build command for `raylib-sys v4.5.0 (/project/raylib-sys)`

Caused by:
  process didn't exit successfully: `/target/debug/build/raylib-sys-ca228663f733b771/build-script-build` (exit status: 101)
  --- stdout
  CMAKE_TOOLCHAIN_FILE_aarch64-unknown-linux-gnu = None
  CMAKE_TOOLCHAIN_FILE_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE_TOOLCHAIN_FILE = None
  CMAKE_TOOLCHAIN_FILE = None
  CMAKE_GENERATOR_aarch64-unknown-linux-gnu = None
  CMAKE_GENERATOR_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE_GENERATOR = None
  CMAKE_GENERATOR = None
  CMAKE_PREFIX_PATH_aarch64-unknown-linux-gnu = None
  CMAKE_PREFIX_PATH_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE_PREFIX_PATH = None
  CMAKE_PREFIX_PATH = None
  CMAKE_aarch64-unknown-linux-gnu = None
  CMAKE_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE = None
  CMAKE = None
  running: cd "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-e5638a6b5ed46997/out/build" && CMAKE_PREFIX_PATH="" "cmake" "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-e5638a6b5ed46997/out/raylib" "-DCMAKE_BUILD_TYPE=Debug" "-DBUILD_EXAMPLES=OFF" "-DCMAKE_BUILD_TYPE=Release" "-DSUPPORT_BUSY_WAIT_LOOP=OFF" "-DUSE_WAYLAND=OFF" "-DOPENGL_VERSION=OFF" "-DPLATFORM=Desktop" "-DCMAKE_SYSTEM_NAME=Linux" "-DCMAKE_SYSTEM_PROCESSOR=aarch64" "-DCMAKE_INSTALL_PREFIX=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-e5638a6b5ed46997/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_ASM_COMPILER=/usr/bin/aarch64-linux-gnu-gcc"
  -- Testing if -Werror=pointer-arith can be used -- compiles
  -- Testing if -Werror=implicit-function-declaration can be used -- compiles
  -- Testing if -fno-strict-aliasing can be used -- compiles
  -- Using raylib's GLFW
  -- Including X11 support
  -- Configuring incomplete, errors occurred!
  See also "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-e5638a6b5ed46997/out/build/CMakeFiles/CMakeOutput.log".
  See also "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-e5638a6b5ed46997/out/build/CMakeFiles/CMakeError.log".

  --- stderr
  CMake Error at /usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
    Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB)
  Call Stack (most recent call first):
    /usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
    /usr/local/share/cmake-3.17/Modules/FindX11.cmake:366 (find_package_handle_standard_args)
    src/external/glfw/src/CMakeLists.txt:187 (find_package)


  thread 'main' panicked at '
  command did not execute successfully, got: exit status: 1

  build script failed, must exit now', /cargo/registry/src/index.crates.io-6f17d22bba15001f/cmake-0.1.50/src/lib.rs:1098:5
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

cargo clean ed as well and it didnt help ;s. Is there something I'm missing? I have this in my .cargo/config.toml

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"

Looking at the video, I'm surprised by how quick cross-rs finishes that I find it suspicious. What version are you running of cross-rs?
I'm running cross-rs 0.2.4.

Maybe try to run cargo clean then run again.
I've modified the Cargo.toml to:

[package]
name = "raylib_sandbox"
version = "0.1.0"
edition = "2021"
build = "build.rs"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
raylib = {version="4.5.0", path = "./raylib"}

[package.metadata.cross.target.aarch64-unknown-linux-gnu]
pre-build = [""" \
    dpkg --add-architecture arm64 && \
    apt-get update && \
    apt-get install --assume-yes --no-install-recommends \
    libx11-dev:arm64 libxrandr-dev:arm64 libasound2-dev:arm64 \
    libx11-dev:arm64 libxrandr-dev:arm64 libxi-dev:arm64 \
    libgl1-mesa-dev:arm64 libglu1-mesa-dev:arm64 \
    libxcursor-dev:arm64 libxinerama-dev:arm64 \
    """]

And it even goes further:

cross build --target=aarch64-unknown-linux-gnu
[+] Building 233.3s (6/6) FINISHED
 => [internal] load build definition from Dockerfile.aarch64-unknown-linux-gnu-custom                              0.7s
 => => transferring dockerfile: 254B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  1.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for ghcr.io/cross-rs/aarch64-unknown-linux-gnu:0.2.4                                  2.0s
 => CACHED [1/2] FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:0.2.4@sha256:3356619b020614effd22e83cec41236e69f  0.0s
 => [2/2] RUN eval " dpkg --add-architecture arm64 && apt-get update && apt-get install --assume-yes --no-insta  224.5s
 => exporting to image                                                                                             5.0s
 => => exporting layers                                                                                            3.4s
 => => writing image sha256:9aa7c8f3be35ffb0c09f939a73a25ae0f8416a7871f6d642bb5a127a6d693964                       0.1s
 => => naming to docker.io/library/cross-custom-raylib_sandbox:aarch64-unknown-linux-gnu-d5b84-pre-build           0.1s
   Compiling libc v0.2.147
   Compiling glob v0.3.1
   Compiling memchr v2.5.0
   Compiling proc-macro2 v1.0.63
   Compiling unicode-ident v1.0.10
   Compiling quote v1.0.29
   Compiling syn v1.0.109
   Compiling cfg-if v1.0.0
   Compiling minimal-lexical v0.2.1
   Compiling libloading v0.7.4
   Compiling regex-syntax v0.7.2
   Compiling bindgen v0.63.0
   Compiling either v1.8.1
   Compiling log v0.4.19
   Compiling rustc-hash v1.1.0
   Compiling cc v1.0.79
   Compiling clang-sys v1.6.1
   Compiling shlex v1.1.0
   Compiling bitflags v1.3.2
   Compiling peeking_take_while v0.1.2
   Compiling lazy_static v1.4.0
   Compiling nom v7.1.3
   Compiling lazycell v1.3.0
   Compiling which v4.4.0
   Compiling cmake v0.1.50
   Compiling fs_extra v1.3.0
   Compiling raylib_sandbox v0.1.0 (/home/rayloom/dev/raylib_sandbox)
   Compiling regex v1.8.4
   Compiling cexpr v0.6.0
   Compiling raylib-sys v4.5.0 (/home/rayloom/dev/raylib_sandbox/raylib-sys)
warning: unused import: `cmake::build`
  --> raylib-sys/build.rs:32:9
   |
32 |     use cmake::build;
   |         ^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

warning: `raylib-sys` (build script) generated 1 warning
error: failed to run custom build command for `raylib-sys v4.5.0 (/home/rayloom/dev/raylib_sandbox/raylib-sys)`

Caused by:
  process didn't exit successfully: `/target/debug/build/raylib-sys-780ba28df63b6804/build-script-build` (exit status: 101)
  --- stdout
  CMAKE_TOOLCHAIN_FILE_aarch64-unknown-linux-gnu = None
  CMAKE_TOOLCHAIN_FILE_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE_TOOLCHAIN_FILE = None
  CMAKE_TOOLCHAIN_FILE = None
  CMAKE_GENERATOR_aarch64-unknown-linux-gnu = None
  CMAKE_GENERATOR_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE_GENERATOR = None
  CMAKE_GENERATOR = None
  CMAKE_PREFIX_PATH_aarch64-unknown-linux-gnu = None
  CMAKE_PREFIX_PATH_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE_PREFIX_PATH = None
  CMAKE_PREFIX_PATH = None
  CMAKE_aarch64-unknown-linux-gnu = None
  CMAKE_aarch64_unknown_linux_gnu = None
  TARGET_CMAKE = None
  CMAKE = None
  running: cd "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/build" && CMAKE_PREFIX_PATH="" "cmake" "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib" "-DCMAKE_BUILD_TYPE=Debug" "-DBUILD_EXAMPLES=OFF" "-DCMAKE_BUILD_TYPE=Release" "-DSUPPORT_BUSY_WAIT_LOOP=OFF" "-DUSE_WAYLAND=OFF" "-DOPENGL_VERSION=OFF" "-DPLATFORM=Desktop" "-DCMAKE_SYSTEM_NAME=Linux" "-DCMAKE_SYSTEM_PROCESSOR=aarch64" "-DCMAKE_INSTALL_PREFIX=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_ASM_COMPILER=/usr/bin/aarch64-linux-gnu-gcc"
  -- Testing if -Werror=pointer-arith can be used -- compiles
  -- Testing if -Werror=implicit-function-declaration can be used -- compiles
  -- Testing if -fno-strict-aliasing can be used -- compiles
  -- Using raylib's GLFW
  -- Including X11 support
  -- Audio Backend: miniaudio
  -- Building raylib static library
  -- Generated build type: Release
  -- Compiling with the flags:
  --   PLATFORM=PLATFORM_DESKTOP
  --   GRAPHICS=GRAPHICS_API_OPENGL_33
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/build
  running: cd "/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/build" && MAKEFLAGS="-j --jobserver-fds=7,8 --jobserver-auth=7,8" "cmake" "--build" "." "--target" "install" "--config" "Debug"
  [  3%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/context.c.o
  [  9%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/input.c.o
  [  9%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/init.c.o
  [ 12%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/monitor.c.o
  [ 15%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/platform.c.o
  [ 18%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/vulkan.c.o
  [ 21%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/window.c.o
  [ 25%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/egl_context.c.o
  [ 28%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/osmesa_context.c.o
  [ 31%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_init.c.o
  [ 34%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_monitor.c.o
  [ 37%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_window.c.o
  [ 40%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/null_joystick.c.o
  [ 43%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_module.c.o
  [ 46%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_time.c.o
  [ 50%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_thread.c.o
  [ 53%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/x11_init.c.o
  [ 56%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/x11_monitor.c.o
  [ 59%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/x11_window.c.o
  [ 62%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/xkb_unicode.c.o
  [ 65%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/glx_context.c.o
  [ 68%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/linux_joystick.c.o
  [ 71%] Building C object raylib/external/glfw/src/CMakeFiles/glfw.dir/posix_poll.c.o
  [ 75%] Linking C static library libglfw3.a
  [ 75%] Built target glfw
  [ 81%] Building C object raylib/CMakeFiles/raylib.dir/rcore.c.o
  [ 81%] Building C object raylib/CMakeFiles/raylib.dir/rmodels.c.o
  [ 84%] Building C object raylib/CMakeFiles/raylib.dir/rshapes.c.o
  [ 87%] Building C object raylib/CMakeFiles/raylib.dir/rtext.c.o
  [ 90%] Building C object raylib/CMakeFiles/raylib.dir/rtextures.c.o
  [ 93%] Building C object raylib/CMakeFiles/raylib.dir/utils.c.o
  [ 96%] Building C object raylib/CMakeFiles/raylib.dir/raudio.c.o
  [100%] Linking C static library libraylib.a
  [100%] Built target raylib
  Install the project...
  -- Install configuration: "Release"
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/libraylib.a
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/include/raylib.h
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/include/rlgl.h
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/include/raymath.h
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/pkgconfig/raylib.pc
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/cmake/raylib/raylib-config-version.cmake
  -- Installing: /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib/cmake/raylib/raylib-config.cmake
  cargo:root=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out
  cargo:rustc-link-search=native=/target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/lib

  --- stderr
  /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c: In function 'LoadMusicStream':
  /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c:1290:45: warning: passing argument 1 of 'qoaplay_open' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
           qoaplay_desc *ctxQoa = qoaplay_open(fileName);
                                               ^
  In file included from /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c:233:0:
  /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/external/qoaplay.c:86:15: note: expected 'char *' but argument is of type 'const char *'
   qoaplay_desc *qoaplay_open(char *path)
                 ^
  In file included from /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/raudio.c:268:0:
  /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/external/jar_mod.h: In function 'jar_mod_load_file':
  /target/aarch64-unknown-linux-gnu/debug/build/raylib-sys-d0addd63f49b8885/out/raylib/src/external/jar_mod.h:1541:13: warning: ignoring return value of 'fread', declared with attribute warn_unused_result [-Wunused-result]
               fread(modctx->modfile, fsize, 1, f);
               ^
  binding/../raylib/src/raylib.h:82:10: fatal error: 'stdarg.h' file not found
  thread 'main' panicked at '
  A `libclang` function was called that is not supported by the loaded `libclang` instance.

      called function = `clang_getTranslationUnitTargetInfo`
      loaded `libclang` instance = 3.8.x

  This crate only supports `libclang` 3.5 and later.
  The minimum `libclang` requirement for this particular function can be found here:
  https://docs.rs/clang-sys/latest/clang_sys/clang_getTranslationUnitTargetInfo/index.html

  Instructions for installing `libclang` can be found here:
  https://rust-lang.github.io/rust-bindgen/requirements.html
  ', /cargo/registry/src/index.crates.io-6f17d22bba15001f/clang-sys-1.6.1/src/lib.rs:1735:1
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Trying now with a newer version of libclang.

Edit:
It won't install a newer version of libclang-dev, so the other way is to use cross with a dockerfile.
Trying now...

So Cargo.toml:

[package.metadata.cross.target.aarch64-unknown-linux-gnu]
dockerfile = "aarch64docker"

A new aarch64docker dockerfile:

FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge    
    
RUN dpkg --add-architecture arm64 && \
    apt-get update && \
    apt-get install --assume-yes --no-install-recommends \
    libx11-dev:arm64 libxrandr-dev:arm64 libasound2-dev:arm64 \
    libx11-dev:arm64 libxrandr-dev:arm64 libxi-dev:arm64 \
    libgl1-mesa-dev:arm64 libglu1-mesa-dev:arm64 \
    libxcursor-dev:arm64 libxinerama-dev:arm64 clang \

Which uses the edge tag instead of the default latest tag.

This builds for me:

rayloom@LAPTOP-1H9T8GEO:~/dev/raylib_sandbox$ cross build --target=aarch64-unknown-linux-gnu
[+] Building 5.7s (6/6) FINISHED
 => [internal] load build definition from aarch64docker                                                            1.8s
 => => transferring dockerfile: 41B                                                                                0.0s
 => [internal] load .dockerignore                                                                                  0.9s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge                                   1.5s
 => [1/2] FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge@sha256:31f3d70aef746a3b9e6d349516fae406f5c27505689  0.0s
 => CACHED [2/2] RUN dpkg --add-architecture arm64 &&     apt-get update &&     apt-get install --assume-yes --no  0.0s
 => exporting to image                                                                                             1.7s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:2b57eb936bbff55a190d54de5f1d894269989dbe1a77c4550ab78cc3d889a84c                       0.2s
 => => naming to docker.io/library/cross-custom-raylib_sandbox:aarch64-unknown-linux-gnu-d5b84                     0.0s
   Compiling raylib-sys v4.5.0 (/home/rayloom/dev/raylib_sandbox/raylib-sys)
warning: unused import: `cmake::build`
  --> raylib-sys/build.rs:32:9
   |
32 |     use cmake::build;
   |         ^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

warning: `raylib-sys` (build script) generated 1 warning
   Compiling raylib v4.5.0 (/home/rayloom/dev/raylib_sandbox/raylib)
warning: unused import: `crate::core::models::Model`
 --> raylib/src/core/collision.rs:3:5
  |
3 | use crate::core::models::Model;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: variable does not need to be mutable
   --> raylib/src/core/window.rs:563:13
    |
563 |         let mut state = WindowState::default();
    |             ----^^^^^
    |             |
    |             help: remove this `mut`
    |
    = note: `#[warn(unused_mut)]` on by default

warning: `raylib` (lib) generated 2 warnings
   Compiling raylib_sandbox v0.1.0 (/home/rayloom/dev/raylib_sandbox)
    Finished dev [unoptimized + debuginfo] target(s) in 5.81s
rayloom@LAPTOP-1H9T8GEO:~/dev/raylib_sandbox$

OHH! I was running cross 0.2.1, my bad, I thought it updated with rustup automatically. Alright, cleaned and updated and fixed it by putting:

if std::env::var("CROSS_SYSROOT").is_ok() {
        std::env::remove_var("CROSS_SYSROOT");
    }

in the build.rs of raylib-sys rather than my main project build script and it worked.

Thanks for all your help!

2 Likes

side note: do you happen to know how I can get the compiled binary to rely on older versions of glibc? My target OS is stuck on ubuntu 18.04 which has glibc2.27 but the cross compiled binaries need glibc2.28 to run

It might be the rustc version which requires a higher glibc.Or the image which links a higher glibc.
I know with cargo-zigbuild you can specify the glibc version you're targeting.
In that case, you might want a docker container and not use cross.
Something like:

FROM ubuntu:bionic AS ubuntu_build

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update -qq
RUN apt-get install -y --no-install-recommends lsb-release g++-aarch64-linux-gnu g++ cmake curl tar git make
RUN apt-get install -y ca-certificates && update-ca-certificates --fresh && export SSL_CERT_DIR=/etc/ssl/certs
RUN dpkg --add-architecture arm64 
RUN sed -i "s/deb http/deb [arch=amd64] http/" /etc/apt/sources.list
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s) main multiverse universe" | tee -a /etc/apt/sources.list 
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s)-security main multiverse universe" | tee -a /etc/apt/sources.list 
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s)-backports main multiverse universe" | tee -a /etc/apt/sources.list 
RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ $(lsb_release -c -s)-updates main multiverse universe" | tee -a /etc/apt/sources.list 
RUN apt-get update -qq && apt-get install -y --no-install-recommends -o APT::Immediate-Configure=0 libx11-dev:arm64 libxrandr-dev:arm64 libasound2-dev:arm64 \
    libx11-dev:arm64 libxrandr-dev:arm64 libxi-dev:arm64 \
    libgl1-mesa-dev:arm64 libglu1-mesa-dev:arm64 \
    libxcursor-dev:arm64 libxinerama-dev:arm64 clang \
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable --profile minimal -y

ENV PATH="/root/.cargo/bin:$PATH" \
	CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ \
	CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
    CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
    CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ \
    PKG_CONFIG_PATH="/usr/lib/aarch64-linux-gnu/pkgconfig/:${PKG_CONFIG_PATH}"

RUN rustup target add aarch64-unknown-linux-gnu

COPY . .

RUN  cargo build --release --target=aarch64-unknown-linux-gnu

FROM scratch AS export-stage
COPY --from=ubuntu_build target/aarch64-unknown-linux-gnu/release/raylib_sandbox .

Which you can run using:

DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .

This uses Ubuntu Bionic which is 18.04 I think.

If it doesn't work, you can probably add a step to install cargo-zigbuild and use it instead of cargo build.

1 Like

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.