¿Cómo puedo compilar un proyecto C en macOS 11 (Intel) para trabajar en Silicon?
Mi script de compilación actual es tan simple como:
./configure make sudo make install Intenté usar las banderas --host y --target con aarch64-apple-darwin y arm-apple-darwin sin suerte.
El binario siempre tiene como valor predeterminado x86_64 :
> file foobar.so foobar.so: Mach-O 64-bit bundle x86_64 ACTUALIZACIÓN: parece que cc y gcc no se encuentran cuando se especifica --host .
checking for arm-apple-darwin-cc... no checking for arm-apple-darwin-gcc... noEncontré una pista en esta página para usar esto:
-target arm64-apple-macos11Cuando ejecuto esto desde mi mac:
clang++ main.cpp -target arm64-apple-macos11El binario a.out resultante se muestra como:
% file a.out a.out: Mach-O 64-bit executable arm64Tengo XCode 12.2 instalado.
No tengo un Arm Mac frente a mí, así que asumo que esto funciona.
Mr. Curious también estaba interesado en la compilación cruzada con M1. Una solución inesperada es Zig . Su objetivo es ser la mejor manera de compilar C de forma cruzada, entre otras cosas; se dirige fácilmente a M1 desde Linux.
Hubo una serie de transmisiones sobre la compilación cruzada con M1 hace un par de semanas: la Parte 1 muestra cómo usar Zig como un compilador cruzado en archivos MAKE existentes, y en la Parte 3 demuestran con éxito la compilación de Redis en Linux para M1.
Muy recomendable.
Terminamos resolviendo esto y pudimos compilar darwin-arm64 y debian-aarch64 en las máquinas x86-64 de GitHub Actions.
Precompilamos todas nuestras dependencias para arm64 y las vinculamos tanto estática como dinámicamente.
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...] El 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