Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Oct 2017 01:19:34 -0700
From:      Mark Millard <markmi@dsl-only.net>
To:        =?utf-8?Q?Eddy_Petri=C8=99or?= <eddy.petrisor@gmail.com>
Cc:        FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, freebsd-arm@freebsd.org
Subject:   Re: lib/clan/llvm.build.mk: Shouldn't BUILD_TRIPLE definition rely host 'cc -dumpmachine'?
Message-ID:  <87903F19-EF1B-4242-B36E-379E31152D43@dsl-only.net>
In-Reply-To: <CAK0XTWczya8vg_sQZPqz-ZyYZRMq1v6p%2Bjs90S%2BjaDHxo2=1gA@mail.gmail.com>
References:  <CAK0XTWczya8vg_sQZPqz-ZyYZRMq1v6p%2Bjs90S%2BjaDHxo2=1gA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2017-Oct-26, at 11:23 PM, Eddy Petri=C8=99or =
<eddy.petrisor@gmail.com> wrote:

> I am trying to make the FreeBSD code base build from a Linux host and
> found this bit which defines BUILD_TRIPLE in a way which to my
> untrained eyes look like overengineering.
>=20
> .if ${TARGET_ARCH:Marmv6*} && (!defined(CPUTYPE) || ${CPUTYPE:M*soft*} =
=3D=3D "")
> TARGET_ABI=3D    -gnueabihf
> .elif ${TARGET_ARCH:Marm*}
> TARGET_ABI=3D    -gnueabi
> .else
> TARGET_ABI=3D
> .endif
> VENDOR=3D        unknown
> OS_VERSION=3D    freebsd12.0

I'm using a context where armv[67]* would now
likely be in use above, in fact the context is
from an armv7 build, no longer armv6 .

> TARGET_TRIPLE?=3D
> =
${TARGET_ARCH:C/amd64/x86_64/:C/arm64/aarch64/}-${VENDOR}-${OS_VERSION}${T=
ARGET_ABI}
> BUILD_TRIPLE?=3D
> ${BUILD_ARCH:C/amd64/x86_64/:C/arm64/aarch64/}-${VENDOR}-${OS_VERSION}
>=20
>=20
> To support a Linux host I made these changes that is using 'cc
> -dumpmachine' to get the correct BUILD_TRIPLE, but I am wondering if
> it shouldn't be OK for building on a FreeBSD host

Using an arm FreeBSD head -r324743 context as an example. . .

For reference:

# grep  BUILD_ARCH Makefile*
Makefile.inc1:BUILD_ARCH!=3D	uname -p
Makefile.inc1:.if ${MACHINE_ARCH} !=3D ${BUILD_ARCH}


# uname -ap
FreeBSD bpim3 12.0-CURRENT FreeBSD 12.0-CURRENT  r324743M  arm armv7

# uname -m
arm
# uname -p
armv7

(A little endian, hard float context by default.)

Compare that to some Linux distributions:
(extractions from an old exchange)

On a Digi CCWiMX53 som (someone else sent this)
(buildroot busybox):

# uname -m
armv7l
# uname -p
unknown

I booted Ubuntu Mate on a BPI-M3 and tried:

$ uname -p
armv7l

$ uname -ap
Linux bpi-iot-ros-ai 3.4.39-BPI-M3-Kernel #1 SMP PREEMPT Tue May 3 =
13:47:01 UTC 2016 armv7l armv7l armv7l GNU/Linux

(Unfortunately I did not record -m for that back
then but it matched -p results --from memory.)

I tried another linux on the BPI-M3: gentoo .

# uname -p
ARMv7 Processor rev 5 (v7l)

# uname -pa
Linux bananapi 3.4.39-BPI-M3-Kernel #1 SMP PREEMPT Tue May 3 13:47:01 =
UTC 2016 armv7l ARMv7 Processor rev 5 (v7l) sun8i GNU/Linux

# uname -m
armv7l

[After looking into the details my preliminary
guess seemed to be correct: the only dependable
uname output among -m -p -i was for -m for linux.
The uname.c code used varies from distribution
to distribution and that changed the other
options' results.]

Back to the armv7 FreeBSD head -r324743 context. . .

# cc -dumpmachine
armv7-unknown-freebsd12.0-gnueabihf

Compare that to the results of:

${BUILD_ARCH:C/amd64/x86_64/:C/arm64/aarch64/}-${VENDOR}-${OS_VERSION}

Note that on FreeBSD itself on that machine BUILD_ARCH
would historically not have the "-gnueabihf" suffix for
such a host. Would the build tolerate it?

# cc --version
FreeBSD clang version 5.0.0 (tags/RELEASE_500/final 312559) (based on =
LLVM 5.0.0svn)
Target: armv7-unknown-freebsd12.0-gnueabihf
Thread model: posix
InstalledDir: /usr/bin

Note the "armv7" for what Linux might instead have
something like "armv7l" for a little endian, hard-float
context. Would this matter? Would the build tolerate a
armv7l (or other such) in BUILD_ARCH?

> .if ${TARGET_ARCH:Marmv6*} && (!defined(CPUTYPE) || ${CPUTYPE:M*soft*} =
=3D=3D "")
> TARGET_ABI=3D    -gnueabihf
> .elif ${TARGET_ARCH:Marm*}
> TARGET_ABI=3D    -gnueabi
> .else
> TARGET_ABI=3D
> .endif
> VENDOR=3D        unknown
> OS_VERSION=3D    freebsd12.0
> +BUILD_OS!=3D    uname -s
> +
>=20
> TARGET_TRIPLE?=3D
> =
${TARGET_ARCH:C/amd64/x86_64/:C/arm64/aarch64/}-${VENDOR}-${OS_VERSION}${T=
ARGET_ABI}
> +.if ${BUILD_OS} =3D=3D FreeBSD
> BUILD_TRIPLE?=3D
> ${BUILD_ARCH:C/amd64/x86_64/:C/arm64/aarch64/}-${VENDOR}-${OS_VERSION}
> +.else
> +HOST_CC_DUMPMACHINE!=3D    cc -dumpmachine
> +BUILD_TRIPLE?=3D    ${HOST_CC_DUMPMACHINE}
> +.endif

Keeping the historical BUILD_ARCH content for FreeBSD
hosts might be important.

But for non-FreeBSD hosts, such as a Linux distribution,
might other mismatches with FreeBSD conventions
matter? (See earlier above.)

Also: What of using alternative compilers (${CC} vs.
cc in classic notations, may be ${HOST_CC} or some such
here because multiple compilers can be involved)? Would
"cc" always exist and be appropriate?

In fact on FreeBSD it is possible to buildworld
buildkernel using a non-system compiler, such as
via the devel/powerpc64-gcc port, even on a
powerpc64 system. (This allows a modern build
instead of what gcc 4.2.1 is limited to since
lang does not sufficiently yet.) For that
context:

# /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc -dumpmachine
powerpc64-unknown-freebsd12.0

# /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc --version
powerpc64-unknown-freebsd12.0-gcc (FreeBSD Ports Collection for =
powerpc64) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is =
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR =
PURPOSE.


> What do you think, should the code be instead:
>=20
> .if ${TARGET_ARCH:Marmv6*} && (!defined(CPUTYPE) || ${CPUTYPE:M*soft*} =
=3D=3D "")
> TARGET_ABI=3D    -gnueabihf
> .elif ${TARGET_ARCH:Marm*}
> TARGET_ABI=3D    -gnueabi
> .else
> TARGET_ABI=3D
> .endif
> VENDOR=3D        unknown
> OS_VERSION=3D    freebsd12.0
>=20
> TARGET_TRIPLE?=3D
> =
${TARGET_ARCH:C/amd64/x86_64/:C/arm64/aarch64/}-${VENDOR}-${OS_VERSION}${T=
ARGET_ABI}
> +HOST_CC_DUMPMACHINE!=3D    cc -dumpmachine
> +BUILD_TRIPLE?=3D    ${HOST_CC_DUMPMACHINE}

I'd expect that the historical BUILD_ARCH content
for a FreeBSD host should be kept instead of ending
up with things like "-gnueabihf" tacked on sometimes.

=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?87903F19-EF1B-4242-B36E-379E31152D43>