
crossRust Creats의 "제로 설정"교차 편집 및 "크로스 테스트"
이 프로젝트는 Cross-RS 팀이 개발하고 유지 관리합니다. 이전에는 Rust Embedded Working Group Tool 팀이 유지 관리했습니다. 새로운 기고자들은 환영합니다! 매트릭스 룸에 가입하고 인사하십시오.

'교차 시험'Aarch64-unknown-linux-GNU 대상의 상자
cross 시스템 설치에 닿지 않고 크로스 컴파일에 필요한 모든 성분을 제공합니다.
cross 환경, 크로스 툴체인 및 크로스 컴파일 된 라이브러리를 제공하여 가장 휴대용 바이너리를 생성합니다.
"크로스 테스트", cross I686 및 X86_64 이외의 건축물에 대한 상자를 테스트 할 수 있습니다.
안정, 베타 및 야간 채널이 지원됩니다.
자세한 설치 지침은 시작 안내서를 참조하십시오.
이러한 컨테이너 엔진 중 하나가 필요합니다. 둘 다 설치되면 cross docker 로 기본값을받습니다.
docker Group에 있거나 Rootless Docker를 사용해야합니다. 필요한 설치 및 설치 후 단계에 대한 컨테이너 엔진 설치 안내서를 읽으십시오. 버전 20.10 (API 1.40) 이상이 필요합니다.cargo install cross --git https://github.com/cross-rs/cross사전 컴파일 된 릴리스 바이너리를 직접 다운로드하거나화물 보수를 사용하는 것도 가능합니다.
cross 화물과 동일한 CLI를 가지고 있지만 Docker 또는 Podman에 의존합니다. Docker의 경우 사용하기 전에 데몬을 시작해야합니다.
# (ONCE PER BOOT, on Linux)
# Start the Docker daemon, if it's not already running using systemd
# on WSL2 and other systems using SysVinit, use `sudo service docker start`.
$ sudo systemctl start docker
# MAGIC! This Just Works
$ cross build --target aarch64-unknown-linux-gnu
# EVEN MORE MAGICAL! This also Just Works
$ cross test --target mips64-unknown-linux-gnuabi64
# Obviously, this also Just Works
$ cross rustc --target powerpc-unknown-linux-gnu --release -- -C lto
추가 문서는 Wiki 또는 docs/ Subfolder에서 찾을 수 있습니다.
cross 구성하는 4 가지 옵션이 있습니다. 이러한 모든 옵션은 구성에 Toml 형식을 사용하며 가능한 구성 값은 여기에 문서화됩니다.
Cargo.toml 에서 직접 cross 구성 [workspace.metadata.cross] 테이블 (예 : Key Prefix에서 Cargo.toml 파일에서 구성 값을 직접 설정할 수 있습니다. 예제 구성 스 니펫은 다음과 같습니다.
[ workspace . metadata . cross . target . aarch64-unknown-linux-gnu ]
# Install libssl-dev:arm64, see <https://github.com/cross-rs/cross/blob/main/docs/custom_images.md#adding-dependencies-to-existing-images>
pre-build = [
" dpkg --add-architecture $CROSS_DEB_ARCH " ,
" apt-get update && apt-get --assume-yes install libssl-dev:$CROSS_DEB_ARCH "
]
[ workspace . metadata . cross . target . armv7-unknown-linux-gnueabi ]
image = " my/image:latest "
[ workspace . metadata . cross . build ]
env.volumes = [ " A_DIRECTORY=/path/to/volume " ]Cross.toml 파일을 통한 cross 구성 Cross.toml 파일 내에 구성을 프로젝트 루트 디렉토리에 넣을 수 있습니다.
CROSS_CONFIG 사용하여 구성 위치를 지정합니다. CROSS_CONFIG 환경 변수를 설정하면 cross 구성 파일을 검색 해야하는 위치를 알 수 있습니다. 이렇게하면 프로젝트 루트의 Cross.toml 파일에만 국한되지 않습니다.
cross 구성Toml 기반 구성 파일 외에도 환경 변수를 통해 구성을 전달할 수 있습니다.
컨테이너 내부에서 cross 실행할 때 cross 호스트 Docker Deamon 자체에 대한 액세스가 필요합니다. 이것은 일반적으로 Docker Daemons 소켓 /var/run/docker.sock 을 장착하여 달성됩니다. 예를 들어:
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v .:/project
-w /project my/development-image:tag cross build --target mips64-unknown-linux-gnuabi64
cross 실행하는 이미지는 녹 개발 도구를 설치해야합니다.
이 설정을 사용하면 cross 올바른 호스트 경로를 교차 컴파일에 사용되는 컨테이너에 찾아 마련해야합니다. 여기에는 원래 프로젝트 디렉토리와 Rust 빌드 도구에 액세스 할 수있는 부모 컨테이너의 루트 경로가 포함됩니다.
cross 컨테이너 내부에서 실행되고 있음을 CROSS_CONTAINER_IN_CONTAINER=true 알리십시오.
개발 또는 CI 컨테이너는 다음과 같이 만들 수 있습니다.
FROM rust:1
# set CROSS_CONTAINER_IN_CONTAINER to inform `cross` that it is executed from within a container
ENV CROSS_CONTAINER_IN_CONTAINER=true
# install `cross`
RUN cargo install cross
...
제한 사항 : 컨테이너 루트 디렉토리의 마운트 포인트 찾기는 현재 오버레이프 스2 스토리지 드라이버에서만 사용할 수 있습니다. 부모 컨테이너 Rust 설정에 액세스하기 위해 Child Container는 부모가 오버레이를 장착합니다. 하위 컨테이너가 여전히 액세스하는 경우 Docker가 오버레이를 올바르게 마운트 할 수 없으므로 오버레이프를 올바르게 마운트 할 수 없으므로 아동 컨테이너 전에는 부모가 중지해서는 안됩니다.
기본적으로 cross 순서대로 Docker 또는 Podman을 사용하려고합니다. 컨테이너 엔진을 명시 적으로 선택하려면 CROSS_CONTAINER_ENGINE 환경 변수를 사용하여 이진 이름 (또는 경로)을 설정할 수 있습니다.
예를 들어 Podman을 사용하려는 경우 CROSS_CONTAINER_ENGINE=podman 설정할 수 있습니다.
cross 교차로 교차로 그 대상에 대해 "사소한"(이진) 상자, 일반적으로화물을 컴파일 할 수있는 경우 대상은 "지원"으로 간주됩니다.
테스트 지원 ( cross test )이 더 복잡합니다. QEMU 에뮬레이션에 의존하므로 상자의 버그가 아닌 QEMU 버그로 인해 테스트가 실패 할 수 있습니다. 즉, 대상에는 compiler-builtins 테스트 스위트를 실행할 수있는 경우 아래 표의 test 열에 ✓ ✓ 아래 표에 ✓ ✓ 아래 표에 있습니다.
또한 테스트는 매우 느립니다. cross test 여러 스레드를 생성 할 때 QEMU가 화를 내기 때문에 단위 테스트를 순차적으로 실행합니다. 이는 장치 중 하나가 스레드를 스폰하는 경우 실패하거나 최악의 상황이 끝나지 않을 가능성이 높다는 것을 의미합니다.
| 목표 | libc | GCC | C ++ | QEMU | test |
|---|---|---|---|---|---|
aarch64-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
aarch64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
aarch64-unknown-linux-gnu:centos [7] | 2.17 | 4.8.5 | 4.2.1 | ✓ | |
aarch64-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
arm-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-gnueabi | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-gnueabihf | 2.31 | 8.5.0 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-musleabi | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-musleabihf | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
armv5te-unknown-linux-gnueabi | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
armv5te-unknown-linux-musleabi | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
armv7-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-gnueabi | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-gnueabihf | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-musleabi | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-musleabihf | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
i586-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | N/A | ✓ |
i586-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | N/A | ✓ |
i686-unknown-freebsd | 1.5 | 6.4.0 | ✓ | N/A | |
i686-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
i686-pc-windows-gnu | N/A | 9.4 | ✓ | N/A | ✓ |
i686-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
loongarch64-unknown-linux-gnu | 2.36 | 14.2.0 | ✓ | 8.2.2 | ✓ |
loongarch64-unknown-linux-musl | 1.2.5 | 14.2.0 | ✓ | 8.2.2 | ✓ |
mips-unknown-linux-gnu | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mips-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
mips64-unknown-linux-gnuabi64 | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mips64-unknown-linux-muslabi64 | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
mips64el-unknown-linux-gnuabi64 | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mips64el-unknown-linux-muslabi64 | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
mipsel-unknown-linux-gnu | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mipsel-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
powerpc-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
powerpc64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
powerpc64le-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
riscv64gc-unknown-linux-gnu | 2.35 | 11.4.0 | ✓ | 8.2.2 | ✓ |
s390x-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
sparc64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
sparcv9-sun-solaris | 1.22.7 | 8.4.0 | ✓ | N/A | |
thumbv6m-none-eabi [4] | 3.3.0 | 9.2.1 | N/A | ||
thumbv7em-none-eabi [4] | 3.3.0 | 9.2.1 | N/A | ||
thumbv7em-none-eabihf [4] | 3.3.0 | 9.2.1 | N/A | ||
thumbv7m-none-eabi [4] | 3.3.0 | 9.2.1 | N/A | ||
thumbv7neon-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
thumbv7neon-unknown-linux-gnueabihf | 2.31 | 9.4.0 | ✓ | N/A | ✓ |
thumbv8m.base-none-eabi [4] | 3.3.0 | 9.2.1 | N/A | ||
thumbv8m.main-none-eabi [4] | 3.3.0 | 9.2.1 | N/A | ||
thumbv8m.main-none-eabihf [4] | 3.3.0 | 9.2.1 | N/A | ||
wasm32-unknown-emscripten [6] | 3.1.14 | 15.0.0 | ✓ | N/A | ✓ |
x86_64-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
x86_64-pc-windows-gnu | N/A | 9.3 | ✓ | N/A | ✓ |
x86_64-pc-solaris | 1.22.7 | 8.4.0 | ✓ | N/A | |
x86_64-unknown-freebsd | 1.5 | 6.4.0 | ✓ | N/A | |
x86_64-unknown-dragonfly [2] [3] | 6.0.1 | 10.3.0 | ✓ | N/A | |
x86_64-unknown-illumos | 1.20.4 | 8.4.0 | ✓ | N/A | |
x86_64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
x86_64-unknown-linux-gnu:centos [5] | 2.17 | 4.8.5 | ✓ | 4.2.1 | ✓ |
x86_64-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | N/A | ✓ |
x86_64-unknown-netbsd [3] | 9.2.0 | 9.4.0 | ✓ | N/A |
[1] libc = bionic; 기본 테스트, 즉 Android 런타임에 의존하지 않는 테스트 만 작동합니다. i686의 경우 오류 assertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERR , 자세한 내용은 문제 #140을 참조하십시오.
[2] 사용 가능한 std 구성 요소가 없습니다.
[3] 일부 *BSD 및 Solaris 대상의 경우 LIBC 열은 LIBC가 추출 된 OS 릴리스 버전을 나타냅니다.
[4] libc = newlib
[5]는 [target.x86_64-unknown-linux-gnu] 를 위해 Cross.toml 의 image = "ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos" 변경하여 CentoS7-Compative Target을 사용해야합니다.
[6] libc = emscripten 및 gcc = clang
[7] Cross.toml 에서 image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main-centos" [target.aarch64-unknown-linux-gnu] 해야합니다.
다른 대상에 대한 추가적인 dockerfiles는 크로스 툴 체인에서 찾을 수 있습니다. 여기에는 MSVC 및 Apple Darwin Targets가 포함되며, 이는 사전 제작 된 이미지를 배송 할 수 없습니다.
cross run 사용하여 "외국"(비 x86_64) 바이너리에서 시스템 호출의 역도를 얻을 때 qemu_strace 변수를 설정할 수 있습니다.
$ cargo new --bin hello && cd $_
$ QEMU_STRACE=1 cross run --target aarch64-unknown-linux-gnu
9 brk(NULL) = 0x0000004000023000
9 uname(0x4000823128) = 0
(..)
9 write(1,0xa06320,14)Hello, world!
= 14
9 sigaltstack(0x4000823588,(nil)) = 0
9 munmap(0x0000004000b16000,16384) = 0
9 exit_group(0)
이 상자는 안정적인 녹 2.77.2 이상을 컴파일하도록 보장됩니다. 이전 버전으로 컴파일 할 수 있지만 새로운 패치 릴리스에서 변경 될 수 있습니다.
일부 교차 컴파일 대상에는 이후의 녹 버전이 필요하며 Xargo를 사용하려면 야간 녹 도구 체인이 필요합니다.
어느 쪽에도 라이센스가 부여되었습니다
귀하의 선택에.
귀하가 명시 적으로 명시 적으로 명시하지 않는 한, Apache-2.0 라이센스에 정의 된대로 귀하의 작업에 포함되도록 의도적으로 제출 된 기부금은 추가 이용 약관이나 조건없이 위와 같이 이중 라이센스를받습니다.
이 상자에 대한 기여는 Rust Coder의 조건에 따라 구성되어 있으며,이 상자의 관리자 인 Cross-RS 팀은 해당 행동 강령을지지하겠다고 약속합니다.