multiarch / crossbuild

:earth_africa: multiarch cross compiling environments
MIT License
938 stars 143 forks source link

Support for Apple M1 arm64/aarch64 chips #51

Open Willena opened 3 years ago

Willena commented 3 years ago

I've been using this docker container to cross-compile some libraries for Mac OS for quite a long time. It works great ! After a quick look to the content of the container, it seems that it contains some of the things needed to build for aarch64 / Apple M1 processor. Adding a new CROSS_TRIPLE case and setting -arch arm64 with an arm64 compatible GCC could do the work.

I don't know how difficult it would be to implement this new processor. Correct me if I'm wrong.

ofek commented 3 years ago

cc @moul @junaruga @aimxhaisse @lafin @QuentinPerez

Hello! Has there been any progress on this?

junaruga commented 3 years ago

Sorry I do not know any progress.

ofek commented 3 years ago

@Willena Could you try to open a pull request?

kroggen commented 3 years ago

I suspect that currently only clang compiles to Apple Silicon, requiring Xcode 12.2 on Mac.

gcc has a suspended ticket for its support, but there is a work-in-progress implementation here.

mcandre commented 3 years ago

The upstream crossbuild project has added code for M1 ARM (64) support.

https://github.com/tpoechtrager/osxcross/commit/261de1051107e47e34a0afc2aed75b8173bc6856

Willena commented 3 years ago

The only issue is that to target arm64e ( M1 chips if I'm correct ) we still need to build the llvm-compiler from scratch (not very difficult, but requires a lot of computing resources and it is a quite long process). I'm not very familiar with arm architecture, but if arm64 is compatible with arm64e then this becomes much easier.

mcandre commented 3 years ago

Confirmed, building the Apple Clang compiler is able to generate arm64[e] toolchains for osxcross. This is documented in the osxcross README.

https://github.com/tpoechtrager/osxcross#what-is-the-goal-of-osxcross

Example compilation of Apple Clang on Ubuntu:

https://github.com/mcandre/apple-clang/blob/master/Dockerfile

yuzawa-san commented 2 years ago

My use case was to build a universal2 binary on x86_64. I was able to get it working by doing the following:

I can make a PR if you want, but I don't know where that original SDK came from (dropbox?). Perhaps we can add a copy step to the Dockerfile. Also it may become necessary to do more creative tagging as mentioned in https://github.com/multiarch/crossbuild/issues/48 as to support more diverse sets of build environments:

andrewleech commented 2 years ago

@yuzawa-san I believe the newer cmake can typically be installed via python, eg. apt-get install -y python3-pip; python3 -m pip install cmake which may remove the need to upgrade distribution for this?

gotson commented 2 years ago

I'm trying to make this work without cmake, as our current build chain uses make, i need to pass the path to the cross-compiler (i suppose clang from what i read above).

Anyone managed to do that ?

I can compile our library, and it seems to be recognized as arm64, but when i try to use it the process crash without much information. I'm probably doing something wrong.

gotson commented 2 years ago

Turns out it was a signature problem, as M1 macs always check the signature. You need at least the adhoc signature for a binary to run.

andrewleech commented 2 years ago

@gotson that all sounds quite promising, nice job figuring out the couple of extra steps!

So are you able to build a binary using a docker built from your fork/commit referenced above?

That ad-hoc signing, can that be done with the tools in the docker too?

gotson commented 2 years ago

@andrewleech yes so far it works, i still need to do a couple of checks to make sure everything is fine before merging this to the master branch.

We are building a dynamic library for multiple platforms, and after some digging i found out a few things:

While checking the issues for M1 mac in the osxcross repo, i stumbled upon this: https://github.com/tpoechtrager/osxcross/issues/355#issuecomment-1213001460

Given codesign is not available on Linux, i created my own Docker image with rcodesign (source). That way i can sign Mac binaries from Docker.

I use a fork of crossbuild following the super helpful comments of @yuzawa-san above.

It seems another tool (sigtool) could be automatically called by osxcross, but i didn't manage to get that working.

andrewleech commented 2 years ago

Thanks for those details! I can see from the osxcross issues some more details about sigtool:

I'm guessing I could also just skip strip for a basic open-source executable :-D

gotson commented 2 years ago

I'm guessing I could also just skip strip for a basic open-source executable :-D

Not an option for us, we ship the library in the jar, and every kb counts! Stripping saves around 100-200kb.

Note that rcodesign doesn't have those limitations from what i checked, so you could even use it to sign with your AppleID, and it can also notarize your app.

KhanMechAI commented 1 year ago

any update on this?