https://github.com/shepherdjerred/macos-cross-compiler Skip to content Toggle navigation Sign in * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions For + Enterprise + Teams + Startups + Education By Solution + CI/CD & Automation + DevOps + DevSecOps Resources + Learning Pathways + White papers, Ebooks, Webinars + Customer Stories + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} shepherdjerred / macos-cross-compiler Public * Notifications * Fork 0 * Star 137 * Compile binaries for macOS on Linux License GPL-3.0 license 137 stars 0 forks Branches Tags Activity Star Notifications * Code * Issues 0 * Pull requests 0 * Actions * Security * Insights Additional navigation options * Code * Issues * Pull requests * Actions * Security * Insights shepherdjerred/macos-cross-compiler This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. main BranchesTags Go to file Code Folders and files Name Name Last commit message Last commit date Latest commit History 99 Commits assets assets samples samples sdks sdks zig zig .gitignore .gitignore Earthfile Earthfile Jenkinsfile Jenkinsfile LICENSE LICENSE README.md README.md View all files Repository files navigation * README * GPL-3.0 license macOS Cross Compiler A picture of Tux holding a red apple This project allows you to cross-compile code on Linux that will be executed on macOS. It supports: * C * C++ * Fortran * Rust Note This project is focused on supporting newer versions of macOS and C, C++, Fortran, and Rust. Versions older than macOS 13 (Ventura) are not well tested, though they should work fine. The cross-compilers are available as a Docker image. This is easiest way to distribute the project since there are so many host dependencies. If you are interested in using this without Docker, you should take a look at osxcross which forms the base of this project. The Docker image is hosted available at ghcr.io/shepherdjerred/ macos-cross-compiler:latest. # Run the container # Note: You'll probably want to bind-mount some files to compile. # The `samples` directory has some Hello World programs. $ docker run ghcr.io/shepherdjerred/macos-cross-compiler:latest /bin/bash Quick Start Install the requirements below, then follow the instructions in the usage section. Host Requirements * Docker Usage Important The Docker image is quite large. It includes several compilers and the 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 \ -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-darwin22-gcc hello.c -o hello $ aarch64-apple-darwin22-g++ hello.cpp -o hello ## targeting darwin x86_64 $ x86_64-apple-darwin22-gcc hello.c -o hello $ x86_64-apple-darwin22-g++ hello.cpp -o hello # Compile using clang ## for darwin arm64 $ aarch64-apple-darwin22-clang --target=aarch64-apple-darwin22 hello.c -o hello $ aarch64-apple-darwin22-clang --target=aarch64-apple-darwin22 hello.cpp -o hello ## for darwin x86_64 $ x86_64-apple-darwin22-clang --target==x86_64-apple-darwin22 hello.c -o hello $ x86_64-apple-darwin22-clang --target==x86_64-apple-darwin22 hello.cpp -o hello # Compile using gfortran ## for darwin arm64 $ aarch64-apple-darwin22-gfortran hello.f90 -o hello ## for darwin x86_64 $ x86_64-apple-darwin22-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 ## C++ targeting darwin arm64(change aarch64 -> x86_64 to target amd64) $ zig c++ \ -target aarch64-macos \ --sysroot=/sdk -I/sdk/usr/include \ -I/sdk/usr/include/c++/v1/ \ -L/sdk/usr/lib \ -lc++ \ -F/sdk/System/Library/Frameworks \ -framework CoreFoundation \ -o hello hello.cpp ## Rust targeting darwin arm64 (change aarch64 -> x86_64 to target amd64) $ export CC=zig-cc-aarch64-macos $ cd rust && cargo build --target aarch64-apple-darwin Rust Support for Rust requires a bit of project configuration. # .cargo/config.toml [build] [target.aarch64-apple-darwin] linker = "zig-cc-aarch64-macos" [target.x86_64-apple-darwin] linker = "zig-cc-x86_64-macos" Once configured, you can run cargo after setting the CC variable: 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-darwin C, C++ and Fortran Compiler Executables The table below shows the name of the executable for each architecture/compiler pair. Note By default the target kernel version is darwin22. You'll need to change darwin22 if you choose to compile for another kernel version. x86_64 aarch64 clang x86_64-apple-darwin22-clang aarch64-apple-darwin22-clang clang++ x86_64-apple-darwin22-clang++ aarch64-apple-darwin22-clang++ gcc x86_64-apple-darwin22-gcc aarch64-apple-darwin22-gcc g++ x86_64-apple-darwin22-g++ aarch64-apple-darwin22-g++ gfortran x86_64-apple-darwin22-gfortran aarch64-apple-darwin22-gfortran The relevant compilers are located at /osxcross/bin and /gcc/bin. Both these directories are already on the PATH in the Docker container. cctools This project compiles cctools, which is Apple's version of binutils. These programs are low-level utilities that are used by compilers, such as the archiver ar, the loader ld, and the assembler as. You probably don't need to run these programs directly, but if you do they are located at /cctools/bin, and they are also on the PATH. Complete tool list: * ObjectDump * ar * as * bitcode_strip * check_dylib * checksyms * cmpdylib * codesign_allocate * ctf_insert * dyldinfo * install_name_tool * ld * libtool * lipo * machocheck * makerelocs * mtoc * mtor * nm * nmedit * otool * pagestuff * ranlib * redo_prebinding * seg_addr_table * seg_hack * segedit * size * strings * strip * unwinddump * vtool Code Signing, Notarizing, and Universal Binaries Code signing (but not notarizing) should be possible with this project, but it is untested. Building universal binaries should also be possible, but again, this is not tested. Target Compatibility This project can build for macOS on both x86_64 and aarch64 archtictures, regardless of the host architecture. Linux x86_64 Linux arm64 macOS x86_64 macOS aarch64 Note aarch64 is Apple's internal name for arm64. They're used interchangably, but aarch64 is more correct when referring to macOS on arm64. This project supports the following languages: * C (up to C 17) * C++ (up to C++ 20) * Fortran (up to Fortran 2018) * Rust (any version) This project supports the following versions of macOS: * macOS 11 Big Sur * macOS 12 Monterey * macOS 13 Ventura Support for macOS 14 Sonoma has not been extensively tested. macOS 14-specific features can be added by updating the SDK version. The Docker image uses the 13.0 SDK by default. Important This project is tested on modern verisons of macOS, Clang, and GCC. It has not been tested with older versions of these softwares. If you need compatabiltiy with older versions, check out the osxcross project. Technical Details This repository is essentially a wrapper around the following projects: * https://github.com/tpoechtrager/apple-libtapi * https://github.com/tpoechtrager/cctools-port * https://github.com/tpoechtrager/xar * https://github.com/iains/gcc-darwin-arm64 These resources were helpful when working on this project: * https://www.lurklurk.org/linkers/linkers.html * http://www.yolinux.com/TUTORIALS/ LibraryArchives-StaticAndDynamic.html * https://gist.github.com/loderunner/b6846dd82967ac048439 * http://clarkkromenaker.com/post/library-dynamic-loading-mac/ * https://github.com/qyang-nj/llios The Zig and Rust portion were informed by these resources: * https://andrewkelley.me/post/ zig-cc-powerful-drop-in-replacement-gcc-clang.html * https://actually.fyi/posts/ zig-makes-rust-cross-compilation-just-work/ Development The Docker images for this repository are built with Earthly. # 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 +validate Inspiration This project would not have been possible without the osxcross project. About Compile binaries for macOS on Linux Topics c macos linux docker rust cpp fortran cross-compiler earthly Resources Readme License GPL-3.0 license Activity Stars 137 stars Watchers 2 watching Forks 0 forks Report repository Packages 1 Languages * Earthly 99.4% * Shell 0.6% Footer (c) 2024 GitHub, Inc. Footer navigation * Terms * Privacy * Security * Status * Docs * Contact * Manage cookies * Do not share my personal information You can't perform that action at this time.