Создайте двоичный файл Apple Silicon на машине Intel

Как я могу скомпилировать проект C в macOS 11 (Intel) для работы с Silicon?

Мой текущий сценарий сборки очень прост:

./configure
make
sudo make install

Я безуспешно пытался использовать флаги --host и --target с aarch64-apple-darwin и arm-apple-darwin.

Бинарный файл всегда по умолчанию x86_64:

> file foobar.so
foobar.so: Mach-O 64-bit bundle x86_64

ОБНОВЛЕНИЕ: кажется, что cc и gcc не найдены, если указан --host.

checking for arm-apple-darwin-cc... no
checking for arm-apple-darwin-gcc... no

person Till    schedule 18.12.2020    source источник
comment
У вас установлена ​​последняя версия XCode 12? Вам это понадобится как минимум.   -  person selbie    schedule 21.12.2020
comment
@selbie: это работает с действиями GitHub, а версия Xcode - 12.2.   -  person Till    schedule 21.12.2020
comment
Смотрите мой ответ ниже. Вы, вероятно, захотите -target arm64-apple-macos11. Обратите внимание, что целевому параметру предшествует одиночный дефис, а не двойные дефисы.   -  person selbie    schedule 21.12.2020
comment
Скомпилировали под руку?   -  person Desert Rose    schedule 02.03.2021
comment
Нет, мы взяли напрокат компьютер MacStadium M1, но все еще нужно скомпилировать его на x84 для руки ????‍♂️   -  person Till    schedule 03.03.2021


Ответы (3)


Я нашел подсказку на этой странице, чтобы использовать это:

-target arm64-apple-macos11

Когда я запускаю это со своего Mac:

clang++ main.cpp -target arm64-apple-macos11

Полученный двоичный файл a.out отображается как:

% file a.out
a.out: Mach-O 64-bit executable arm64

У меня установлен XCode 12.2.

Передо мной нет Arm Mac, так что я предполагаю, что это работает.

person selbie    schedule 20.12.2020
comment
Как я могу указать clang++ в качестве компилятора при использовании ./configure? - person Till; 21.12.2020
comment
Вам, вероятно, и не нужно. Clang - это компилятор по умолчанию, а g++ командная строка на самом деле просто прокладка, которая переходит в clang. - person selbie; 21.12.2020
comment
К сожалению, нам приходится использовать ./configure, поскольку у нас есть несколько флагов. Есть ли способ указать ./configure использовать clang++? - person Till; 27.12.2020
comment
Я не эксперт по autoconf (это инструмент, который генерирует скрипты configure). Но вам, вероятно, просто нужно, чтобы скрипт был установлен CC=clang и CXX=clang++ - person selbie; 28.12.2020
comment
Мы попробовали это безуспешно. Автоинструменты ????‍♂️ - person Till; 26.03.2021

Мистеру Любопытному также было интересно узнать о кросс-компиляции для M1. Одним из неожиданных решений является Zig. Среди прочего, он призван стать лучшим способом кросс-компиляции C; он легко нацелен на M1 из Linux.

Пару недель назад была серия потоков о кросс-компиляции в M1: Часть 1 показывает, как использовать Zig в качестве кросс-компилятора в существующих make-файлах и в части 3 они успешно демонстрируют компиляцию Redis в Linux для M1.

Настоятельно рекомендуется.

person Mr. Curious    schedule 24.03.2021
comment
Спасибо, что поделились этим, сегодня днем ​​я покопаюсь в Зиге! - person Till; 26.03.2021

В итоге мы решили эту проблему и смогли скомпилировать двоичные файлы darwin-arm64 и debian-aarch64 на машинах GitHub Actions x86-64.

Мы предварительно скомпилировали все наши зависимости для arm64 и связали их как статически, так и динамически.

export RELAY_DEPS_PATH=./build-deps/arm64
export PKG_CONFIG_PATH=./build-deps/arm64/lib/pkgconfig

cd ./relay-deps
TARGET=./build-deps make install

cd ./relay
phpize
./configure CFLAGS='-target arm64-apple-macos' \
  --host=aarch64-apple-darwin \
  --enable-relay-jemalloc-prefix
  [snip...]

make

# Dynamically linked binary
cc --target=arm64-apple-darwin \
  ${wl}-flat_namespace ${wl}-undefined ${wl}suppress \
  -o .libs/relay.so -bundle .libs/*.o \
  -L$RELAY_DEPS_PATH/lib -lhiredis -ljemalloc_pic [snip...]

# re-link to standard paths
./relay-deps/utils/macos/relink.sh .libs/relay.so /usr/local/lib
cp .libs/relay.so modules/relay.so

# Build a statically linked shared object
cc --target=arm64-apple-darwin \
  ${wl}-flat_namespace ${wl}-undefined ${wl}suppress \
  -o .libs/relay-static.so -bundle .libs/*.o \
  $RELAY_DEPS_PATH/lib/libhiredis.a \
  $RELAY_DEPS_PATH/lib/libjemalloc_pic.a \
  [snip...]

relink.sh:

#!/bin/bash
set -e

printUsage() {
    echo "$0 <shared-object> <prefix>"
    exit 1
}

if [[ ! -f "$1" || -z "$2" ]]; then
    printUsage
    exit 1
fi

INFILE=$1
PREFIX=$2

links=(libjemalloc libhiredis [snip...])

if [ -z "$PREFIX" ]; then
    PREFIX=libs
fi

for link in ${links[@]}; do
    FROM=$(otool -L "$INFILE"|grep $link|awk '{print $1}')
    FILE=$(basename -- "$FROM")
    TO="$PREFIX/$FILE"

    echo "$FROM -> $TO"
    install_name_tool -change "$FROM" "$TO" "$1"
done
person Till    schedule 31.03.2021