Precaución
Si está utilizando esto para un caso de uso de producción, debe desembolsar este proyecto y construir la imagen usted mismo
Este proyecto le permite compilar el código cruzado en Linux que se ejecutará en MacOS. Esto puede ser muy útil para entornos CI donde desea construir para macOS, pero no desea pasar por el problema (y el costo) de configurar un entorno de macOS.
Es compatible:
El soporte para el objetivo C y el objetivo C ++ puede funcionar fuera de la caja, pero esto no se prueba.
Nota
Este proyecto se centra en apoyar versiones más nuevas de macOS y C, C ++, Fortran y Rust. Las versiones más antiguas que MacOS 13 (Ventura) no están bien probadas, aunque deberían funcionar bien.
Las bibliotecas y encabezados del sistema MACOS se proporcionan con la imagen Docker. Esto debería ser adecuado para compilar programas de macOS independientes y posiblemente aplicaciones de MacOS nativos.
Los compiladores cruzados están disponibles como una imagen de Docker. Esta es una forma más fácil de distribuir el proyecto ya que hay tantas dependencias de host. Si está interesado en usar esto sin Docker, debe echar un vistazo a OSXCross que forma la base de este proyecto.
La imagen de Docker está disponible en Ghcr.io/shepherdjerred/macos-cross-compiler.
Instale los requisitos a continuación, luego siga las instrucciones en la sección de uso.
Importante
La imagen Docker es bastante grande. Incluye varios compiladores y el MacOS SDK.
# Start a Docker container using the Docker image.
# Replace `$PWD/samples` with the path to the source you want to compile.
$ docker run --platform=linux/amd64
-v $PWD /samples:/workspace
--rm
-it
ghcr.io/shepherdjerred/macos-cross-compiler:latest
/bin/bash
# Now that you're inside of the Docker container, you can run the compilers.
# Compile using gcc
# # targeting darwin arm64
$ aarch64-apple-darwin24-gcc hello.c -o hello
$ aarch64-apple-darwin24-g++ hello.cpp -o hello
# # targeting darwin x86_64
$ x86_64-apple-darwin24-gcc hello.c -o hello
$ x86_64-apple-darwin24-g++ hello.cpp -o hello
# Compile using clang
# # for darwin arm64
$ aarch64-apple-darwin24-clang --target=aarch64-apple-darwin24 hello.c -o hello
$ aarch64-apple-darwin24-clang++ --target=aarch64-apple-darwin24 hello.cpp -o hello
# # for darwin x86_64
$ x86_64-apple-darwin24-clang --target=x86_64-apple-darwin24 hello.c -o hello
$ x86_64-apple-darwin24-clang++ --target=x86_64-apple-darwin24 hello.cpp -o hello
# Compile using gfortran
# # for darwin arm64
$ aarch64-apple-darwin24-gfortran hello.f90 -o hello
# # for darwin x86_64
$ x86_64-apple-darwin24-gfortran hello.f90 -o hello
# Compile using Zig
# # C targeting darwin arm64 (change aarch64 -> x86_64 to target amd64)
$ zig cc
-target aarch64-macos
--sysroot=/sdk
-I/sdk/usr/include
-L/sdk/usr/lib
-F/sdk/System/Library/Frameworks
-framework CoreFoundation
-o hello hello.c
# # Rust targeting darwin arm64 (change aarch64 -> x86_64 to target amd64)
$ export CC=zig-cc-aarch64-macos
$ cd rust && cargo build --target aarch64-apple-darwinEl soporte para Rust requiere un poco de configuración del proyecto.
# .cargo/config.toml
[ build ]
[ target . aarch64-apple-darwin ]
linker = " zig-cc-aarch64-macos "
[ target . x86_64-apple-darwin ]
linker = " zig-cc-x86_64-macos " Una vez configurado, puede ejecutar cargo después de configurar la variable CC :
export CC= " zig-cc-x86_64-macos "
cargo build --target x86_64-apple-darwin
export CC= " zig-cc-aarch64-macos "
cargo build --target aarch64-apple-darwinLa siguiente tabla muestra el nombre del ejecutable para cada par de arquitectura/compilador.
Nota
La versión del núcleo objetivo es darwin24 . Deberá construir una nueva imagen de Docker si desea admitir una versión de kernel diferente.
| Aarch64 | |
|---|---|
| sonido metálico | Aarch64-Apple-Darwin24-Clang |
| clang ++ | Aarch64-Apple-Darwin24-Clang ++ |
| GCC | Aarch64-Apple-Darwin24-GCC |
| G ++ | Aarch64-Apple-Darwin24-G ++ |
| gfortran | Aarch64-Apple-Darwin24-GFORTRAN |
Los compiladores relevantes se encuentran en /osxcross/bin y /gcc/bin . Ambos directorios ya están en la PATH en el contenedor Docker.
Este proyecto compila CCTOols, que es la versión de Binutils de Apple. Estos programas son utilidades de bajo nivel utilizados por compiladores, como el Archiver ar , el cargador ld y el ensamblador as .
Probablemente no necesite ejecutar estos programas directamente, pero si lo hace, están ubicados en /cctools/bin , y también están en el PATH .
Lista completa de herramientas:
La firma de código (pero no la notarización) debería ser posible con este proyecto, pero no se ha probado. La construcción de binarios universales también debería ser posible, pero nuevamente, esto no se prueba.
El RCodesign se ha recomendado como una forma de firmar y notarizar binarios para macOS.
Este proyecto puede construir para MacOS en Archittices X86_64 y Aarch64, independientemente de la arquitectura del host.
| Linux x86_64 | Linux Arm64 | |
|---|---|---|
| macOS x86_64 | ✅ | ✅ |
| macOS aarch64 | ✅ | ✅ |
Nota
Aarch64 es el nombre interno de Apple para ARM64. Se usan intercambiablemente, pero AARCH64 es más correcto cuando se refiere a MacOS en ARM64.
Este proyecto admite los siguientes idiomas:
Este proyecto admite las siguientes versiones de MacOS:
El soporte para MacOS 15 Seqouia no se ha probado ampliamente. La imagen Docker usa el SDK 15.0 de forma predeterminada.
Importante
Este proyecto se prueba en veros modernos de macOS, Clang y GCC. No se ha probado con versiones anteriores de estos softwares. Si necesita compatabiltiy con versiones anteriores, consulte el proyecto OSXCross.
Esta imagen de Docker incluye el SDK Xcode de Joseluisq/MacOSX-SDKS. Familiarícese con los términos de servicio del SDK.
Este repositorio es esencialmente un envoltorio en torno a los siguientes proyectos:
Estos recursos fueron útiles cuando trabajaban en este proyecto:
La porción de zig y óxido fue informada por estos recursos:
Las imágenes de Docker para este repositorio están construidas con terrenal.
Consejo
La construcción de GCC es computas y de memoria intensa. Puede ajustar el número de tareas paralelas pasando un argumento --cores=<number> a cualquier comando, por ejemplo, earthly +image --cores=4 . En mi experiencia, necesitará mucha memoria si desea usar todos sus núcleos. He tenido éxito al establecer este valor en aproximadamente la mitad de núcleos que mi CPU. Debe reducir el valor si su máquina se detiene.
# Create a Docker image tagged as `shepherdjerred/macos-cross-compiler`
# The first run will take ~20 minutes on an M1 MacBook.
# Subsequent runs are faster.
earthly +image
# Verify that the compilers work correctly
earthly +test
# If you're on macOS, try actually running the binaries
earthly +validateEste proyecto no hubiera sido posible sin el proyecto OSXCross.