Remix.run Logo
kccqzy 5 days ago

Sure. How else would you build a universal binary then? Given the low-level nature of the language not many tasks can be usefully shared between different architectures.

geraldcombs 5 days ago | parent [-]

For plain C/C++ you can just pass `-arch x86_64 -arch arm64` to clang. CMake takes care of this for you if you specify `CMAKE_OSX_ARCHITECTURES=x86_64;arm64` and IIRC Meson has similar functionality.

kccqzy 5 days ago | parent | next [-]

TIL. I didn't know clang supports this natively.

delta_p_delta_x 5 days ago | parent | next [-]

Clang is natively a cross-compiler. Pass in --sysroot and a corresponding valid sysroot tree for any micro architecture/platform (arm-eabi, macOS, Windows MSVC, PowerPC, Alpine Linux with musl, you name it) and Clang will happily retarget the binary to the correct target platform.

mrpippy 5 days ago | parent | prev [-]

Apple has supported that ‘-arch’ option in their GCC/Clang since at least the PPC->Intel transition, maybe even earlier (PPC64? NeXT/OPENSTEP?)

lukeh 4 days ago | parent [-]

Yes, since NEXTSTEP.

pjmlp 4 days ago | parent [-]

That would be NeXT, and their GCC fork.

zdw 5 days ago | parent | prev | next [-]

I assume this is faster than doing two separate builds, because it can skip certain steps of the complier pipeline, and only the items that are arch specific (codegen, probably others) are done twice?

astrange 5 days ago | parent [-]

They can't really share anything since the preprocessor stage can be different.

bee_rider 4 days ago | parent | prev [-]

How much work does clang have to do for this sort of thing (as opposed to llvm). Hypothetically could we start distributing programs in llvm ir, and compile that locally to ARM, x86, risc-v, or whatever else?

I mean, no, that’s silly, right? But it would be kind of neat…

dundarious 4 days ago | parent [-]

llvm-ir is not architecture independent, even excluding issues like the C pre-processor.