On Thu, Nov 12, 2020 at 05:48:34PM +0200, Taw via curl-library wrote:
> I am trying to build cURL for Apple Silicon ARM (cross-compilation) using a
> macOS Intel host.
> How is done with other libraries (zlib, cjson, etc): just add "-target
> arm64-apple-macos11" to CFLAGS and that's it.
> 
> I am using this command
> "CFLAGS=" -fPIC -DPIC -m64 -target arm64-apple-macos11 " ./configure
> --without-libssh2 --without-zlib --without-gnutls --without-nss
> --without-libidn --without-libidn2 --without-nghttp2 --without-librtmp
> --without-brotli --without-libpsl
> --prefix="/Users/test/work/curl-7.73.0/prefix"
> --with-ssl="/Users/test/work/openssl-1.1.1h/prefix/"
> 
> I get this error
> "configure:4488: gcc -o conftest  -fPIC -DPIC -m64 -target
> arm64-apple-macos11    conftest.c  >&5
> configure:4492: $? = 0
> configure:4499: ./conftest
> ./configure: line 4501: ./conftest: Bad CPU type in executable
> configure:4503: $? = 126
> configure:4510: error: in `/Users/test/work/curl-7.73.0':
> configure:4512: error: cannot run C compiled programs.
> If you meant to cross compile, use `--host'."
> 
> But I don't know what "--host" to use.

./configure has three options related to a platform:

--build     where the executable will be built
--host      where the executable will be run
--target    what platform will the executable able to process

See
<https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Specifying-Target-Triplets.html>
for more details.

--target option is not used by curl build script. What you did is that you
requested a compiler for Intel platform (no --host), but you commanded the
compiler to produce a code for 64-bit ARM (CFLAGS="-m64 -target
arm64-apple-macos11").

When ./configure run a self test, it used those flags to build a program
and because --build matched --host (you did not provide any of them),
./configure attempted to execute the program. And ARM code does not run on
Intel and thus dynamic linker (or a kernel) refused to execute it.

> So I put a dummy "--host=arm" and it seems to work.

Then ./configure knew that you were crosscompiling and did not attempt to
execute the program.

> On configure I get "Host setup:       arm-unknown-none", but after "make
> install" the binary seems ok.
> "prefix/bin/curl: Mach-O 64-bit executable arm64"
> 
> Am I doing this in a correct manner? Does it matter what I put to "host"?
> 
The correct way is specifying a name of a toolchain that you want to use for
cross-compilation with --host option and putting the compiler options that
selects the optimizations for the architecture into a CFLAGS argument.
Which one it is depends on the compiler and the hardware you cross-compile to.
See a manual of your compiler for the CFLAGS options and a documentation of
the hardware vendor.

I have no experience with MacOS, neither with the new Apple ARM chips, so
I cannot help you more.

-- Petr

Attachment: signature.asc
Description: PGP signature

-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:   https://curl.haxx.se/mail/etiquette.html

Reply via email to