Как кросс-компилировать Coreutils или другие проекты GNU с clang/LLVM?

У меня есть острая необходимость скомпилировать Coreutils с llvm для другой арки: arm/aarch64/mips/mips32/ppc/ppc32...

Поскольку я устанавливаю все инструменты gcc-cross, такие как mips-linux-gnu, powerpc64-linux-gnu, и если у меня есть простая программа на C, подобная этой test.c

#include<stdio.h>
int main(){
    printf("hello!");
    return 0;
}

Я могу скомпилировать его в арку, т.е.

clang --target=mips64-linux-gnuabi64 test.c -o test-mips64
➜  tests file test-mips64 
test-mips64: ELF 64-bit MSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, BuildID[sha1]=7b33d55a0d08e6cd18d966341590dc351e346a78, for GNU/Linux 3.2.0, not stripped

Я пытаюсь таким же образом скомпилировать Coreutils, которые пытаются установить

export CC=clang
export CXX=clang++
CFLAGS = "--target=mips64-linux-gnuabi64"
./configure --host=mips64-linux-gnuabi64

Однако каждый раз возникали ошибки в настройке или создании...

Как мне установить конфигурацию? Могу ли я легко скомпилировать Coreuntils с помощью llvm для других арок?


person Xing    schedule 15.06.2020    source источник
comment
Есть масса вещей, которые вам нужно сделать правильно, когда дело доходит до кросс-компиляции. Нам нужно больше информации, чтобы помочь вам. По крайней мере, описание того, что вы пробовали, и ошибки, с которыми вы столкнулись.   -  person Martin Konrad    schedule 30.06.2020
comment
И на какой системе вы работаете?   -  person Martin Konrad    schedule 30.06.2020


Ответы (2)


Немного сложно правильно настроить параметры командной строки для кросс-компиляции. Я заставил его работать с приведенными ниже командами, предполагая, что вы работаете в системе на основе Debian (например, Debian или Ubuntu). Вот шаги.

  1. Установите gcc-mips64-linux-gnuabi64 и gcc-powerpc64-linux-gnu.
  2. Choose the correct arguments for CFLAGS
    • -B/usr/mips64-linux-gnuabi64/bin/ to indicate we want to use the linker ld within that directory. Do the same for powerpc.
    • --target=mips64-linux-gnuabi64, чтобы указать, что является нашей целью для компиляции. Сделайте то же самое для powerpc.
    • -I/usr/mips64-linux-gnuabi64/include для включения заголовочных файлов. Сделайте то же самое для powerpc.
  3. Используйте ./configure --host=mips64-linux-gnuabi для настройки для mips64 и ./configure --host=powerpc64-linux-gnueabi для настройки для powerpc64.

Вот команды для компиляции для mips64:

make clean
CFLAGS="-B/usr/mips64-linux-gnuabi64/bin/ --target=mips64-linux-gnuabi64 -I/usr/mips64-linux-gnuabi64/include" \
    ./configure --host=mips64-linux-gnuabi
make

И команды для компиляции для powerpc64:

make clean
CFLAGS="-B/usr/powerpc64-linux-gnu/bin/ --target=powerpc64-linux-gnueabi -I/usr/powerpc64-linux-gnu/include" \
    ./configure --host=powerpc64-linux-gnueabi
make

Вот вывод file ./src/ls, чтобы продемонстрировать, что это исполняемый файл powerpc64:

$ file ./src/ls
./src/ls: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=97fe33981ca0112160f44a6fb678d6dc1b462114, not stripped

Ниже приведен файл Dockerfile, который можно использовать для воспроизводимой кросс-компиляции coreutils для mips64 и powerpc64.

# Cross-compile GNU coreutils for mips64 and powerpc64 using clang.
# With help from https://medium.com/@wolfv/cross-compiling-arm-on-travis-using-clang-and-qemu-2b9702d7c6f3

FROM debian:buster

# Install compile-time dependencies.
RUN apt-get update \
    && apt-get install --yes \
        clang \
        curl \
        gcc-mips64-linux-gnuabi64 \
        gcc-powerpc64-linux-gnu \
        make \
        perl \
    && rm -rf /var/lib/apt/lists/*

# Download source code for release.
WORKDIR /tmp/coreutils
RUN curl -fsSL https://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz \
    | tar xJ --strip-components 1

# Compile and install for mips64.
RUN CFLAGS="-B/usr/mips64-linux-gnuabi64/bin/ --target=mips64-linux-gnuabi64 -I/usr/mips64-linux-gnuabi64/include" \
        ./configure --host=mips64-linux-gnuabi --prefix=/opt/coreutils-mips \
    && make \
    && make install

# Compile and install for powerpc64.
RUN make clean \
    && CFLAGS="-B/usr/powerpc64-linux-gnu/bin/ --target=powerpc64-linux-gnueabi -I/usr/powerpc64-linux-gnu/include" \
        ./configure --host=powerpc64-linux-gnueabi --prefix=/opt/coreutils-powerpc64 \
    && make \
    && make install

# Keep only the compiled programs from the previous stage.
FROM debian:buster
COPY --from=0 /opt /opt
person jakub    schedule 30.06.2020

В настоящее время я работаю над простым инструментом сборки на Python, который может вам помочь. К сожалению, на данный момент отсутствует реализация clang, но он отлично работает с GCC и MSVC. По сути, дело в файлах параметров Json для создания командной строки.

CppMagic

person Deoclecio Freire    schedule 02.07.2020