11.0: head/lib/libsysdecode/Makefile for . . ./libsoft/usr/include uses CPP when XCPP needed?

Mark Millard markmi at dsl-only.net
Mon Apr 4 18:05:11 UTC 2016


On 2016-Apr-4, at 10:24 AM, Mark Millard <markmi at dsl-only.net> wrote:
> 
> On 2016-Apr-4, at 8:28 AM, Warner Losh <imp at bsdimp.com> wrote:
>> However, I'm not sure I agree with that:
>> We see that's it's part of WMAKEENV, which is used by WMAKE:
>> 
>> WMAKEENV=       ${CROSSENV} \
> 
> You are correct. I just missed it somehow when I looked.
> 
> 
> 
> 
> But (Makefile.inc1):
> (no use here of WMAKE for build${libcompat} for buildsoft)
> 
>> .if !defined(NO_CLEAN)
>>        @echo
>>        @echo "--------------------------------------------------------------"
>>        @echo ">>> stage 2.1: cleaning up the object tree"
>>        @echo "--------------------------------------------------------------"
>>        ${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR}
>> .if defined(LIBCOMPAT)
>>        ${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} -f Makefile.inc1 ${CLEANDIR}
>> .endif
>> .endif
> . . . and separately . . .
>> .if defined(LIBCOMPAT) && empty(SUBDIR_OVERRIDE)
>> WMAKE_TGTS+=    build${libcompat}
>> .endif
>> 
>> buildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
> 
> and (Makefile.libcompat):
> (again no use here of WMAKE for build${libcompat} for buildsoft)
> (just direct use of LIBSOFTWMAKEENV and LIBSOFTWMAKEFLAGS that do not deal with ${XCPP} at all)
> 
>> # soft-fp world
>> .if ${TARGET_ARCH} == "armv6"
>> LIBSOFTCFLAGS=        -DCOMPAT_SOFTFP
>> LIBSOFTCPUFLAGS= -mfloat-abi=softfp
>> LIBSOFTWMAKEENV= CPUTYPE=soft MACHINE=arm MACHINE_ARCH=armv6
>> LIBSOFTWMAKEFLAGS=        -DCOMPAT_SOFTFP
>> .endif
>> . . .

I was interrupted and I see that I missed some macros:

libcompat=      ${LIBCOMPAT:tl}
_LIBCOMPAT_MAKEVARS=    _OBJTREE TMP CPUFLAGS CFLAGS CXXFLAGS WMAKEENV \
                        WMAKEFLAGS WMAKE
.for _var in ${_LIBCOMPAT_MAKEVARS}
.if !empty(LIB${LIBCOMPAT}${_var})
LIBCOMPAT${_var}?=      ${LIB${LIBCOMPAT}${_var}}
.endif
.endfor
. . .
LIBCOMPATWMAKEENV+= MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTREE} \
                INSTALL="sh ${.CURDIR}/tools/install.sh" \
                PATH=${TMPPATH} \
                LIBDIR=/usr/lib${libcompat} \
                SHLIBDIR=/usr/lib${libcompat} \
                DTRACE="${LIB$COMPATDTRACE:U${DTRACE}}"
LIBCOMPATWMAKEFLAGS+= CC="${XCC} ${LIBCOMPATCFLAGS}" \
                CXX="${XCXX} ${LIBCOMPATCFLAGS} ${LIBCOMPATCXXFLAGS}" \
                DESTDIR=${LIBCOMPATTMP} \
                -DNO_CPU_CFLAGS \
                MK_CTF=no \
                -DNO_LINT \
                MK_TESTS=no

>> LIBCOMPATWMAKE+=        ${LIBCOMPATWMAKEENV} ${MAKE} ${LIBCOMPATWMAKEFLAGS} \
>>                        MK_MAN=no MK_HTML=no
>> . . .
>> build${libcompat}: .PHONY
>>        @echo
>>        @echo "--------------------------------------------------------------"
>>        @echo ">>> stage 5.1: building lib${libcompat} shim libraries"
>>        @echo "--------------------------------------------------------------"
>> . . .
>>        ${_+_}cd ${.CURDIR}; \
>>            ${LIBCOMPATWMAKE} -f Makefile.inc1 -DNO_FSCHG libraries
> 
> 
> ===
> Mark Millard
> markmi at dsl-only.net

Still no use of ${XCPP} .

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

On 2016-Apr-4, at 8:28 AM, Warner Losh <imp at bsdimp.com> wrote:



On Mon, Apr 4, 2016 at 12:18 AM, Mark Millard <markmi at dsl-only.net> wrote:
The following may be suggestive of the "upstream" issue:

Makefile.libcompat has things like. . .

> .if ${TARGET_ARCH} == "amd64"
. . .
> LIB32WMAKEFLAGS=        \
>                AS="${XAS} --32" \
>                LD="${XLD} -m elf_i386_fbsd -Y P,${LIBCOMPATTMP}/usr/lib32" \
>                OBJCOPY="${XOBJCOPY}"
> 

> .elif ${TARGET_ARCH} == "powerpc64"
. . .
> LIB32WMAKEFLAGS=        \
>                LD="${XLD} -m elf32ppc_fbsd" \
>                OBJCOPY="${XOBJCOPY}"
> .endif

that set up to deal with some host vs. cross distinctions.

But:

> # soft-fp world
> .if ${TARGET_ARCH} == "armv6"
> LIBSOFTCFLAGS=        -DCOMPAT_SOFTFP
> LIBSOFTCPUFLAGS= -mfloat-abi=softfp
> LIBSOFTWMAKEENV= CPUTYPE=soft MACHINE=arm MACHINE_ARCH=armv6
> LIBSOFTWMAKEFLAGS=        -DCOMPAT_SOFTFP
> .endif

in the file has no such translations and Makefile.libcompat has no examples of ${XCPP} anywhere.

The only place that has ${XCPP} in /usr/src/Makefile* and /usr/src/share/mk/* is Makefile.inc1 :

Yes, X* is an invention of the top level Makefile*. I've long been uneasy about it, but haven't
been able to articulate why.

> CROSSENV+=      CC="${XCC} ${XCFLAGS}" CXX="${XCXX} ${XCFLAGS} ${XCXXFLAGS}" \
>                CPP="${XCPP} ${XCFLAGS}" \
>                AS="${XAS}" AR="${XAR}" LD="${XLD}" NM=${XNM} \
>                OBJDUMP=${XOBJDUMP} OBJCOPY="${XOBJCOPY}" \
>                RANLIB=${XRANLIB} STRINGS=${XSTRINGS} \
>                SIZE="${XSIZE}"

but WMAKE does not use CROSSENV.

Maybe it got removed over time? It there's one more layer of indirection?

However, I'm not sure I agree with that:
We see that's it's part of WMAKEENV, which is used by WMAKE:

WMAKEENV=       ${CROSSENV} \

...


WMAKE=          ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 DESTDIR=${WORLDTMP}

And several others. Am I missing something or looking at old code?

Warner





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

On 2016-Apr-3, at 10:22 PM, Mark Millard <markmi at dsl-only.net> wrote:

On 2016-Apr-3, at 9:48 PM, Warner Losh <imp bsdimp.com> wrote:
> 
> On Sun, Apr 3, 2016 at 10:25 PM, Mark Millard <markmi dsl-only.net> wrote:
> For an amd64 -> armv7a (rpi2 targeting) cross-compile the code
> 
>> # $FreeBSD: head/lib/libsysdecode/Makefile 295931 2016-02-23 20:00:55Z jhb $
>> 
>> . . .
>> ioctl.c: mkioctls
>>       env MACHINE=${MACHINE} CPP="${CPP}" \
>>               /bin/sh ${.CURDIR}/mkioctls ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
> 
> (with its use of CPP instead of the XCPP) got:
> 
>> --- all_subdir_lib/libsysdecode ---
>> --- ioctl.c ---
>> env MACHINE=arm CPP="/usr/bin/clang-cpp"  /bin/sh /usr/src/lib/libsysdecode/mkioctls /usr/obj/clang/arm.armv6/usr/src/libsoft/usr/include > ioctl.c
>> . . .
>> --- all_subdir_lib/libsysdecode ---
>> In file included from <stdin>:17:
>> In file included from /usr/obj/clang/arm.armv6/usr/src/libsoft/usr/include/dev/nvme/nvme.h:36:
>> In file included from /usr/obj/clang/arm.armv6/usr/src/libsoft/usr/include/sys/param.h:135:
>> In file included from /usr/obj/clang/arm.armv6/usr/src/libsoft/usr/include/machine/param.h:49:
>> /usr/obj/clang/arm.armv6/usr/src/libsoft/usr/include/machine/acle-compat.h:182:4: error: Unable to determine architecture version.
>> #  error Unable to determine architecture version.
>>  ^
> 
> In my case I had the following in the in-use src.conf in order to control the cross compile specifics:
> 
>> XCC=/usr/bin/clang -target ${TO_TYPE}--freebsd11.0-gnueabi -march=armv7a -mcpu=cortex-a7 -mno-unaligned-access
>> XCXX=/usr/bin/clang++ -target ${TO_TYPE}--freebsd11.0-gnueabi -march=armv7a -mcpu=cortex-a7 -mno-unaligned-access
>> XCPP=/usr/bin/clang-cpp -target ${TO_TYPE}--freebsd11.0-gnueabi -march=armv7a -mcpu=cortex-a7 -mno-unaligned-access
> 
> 
> (I've been doing such for a long time but only just progressed to a 11.0 source vintage with libsoft involved.)
> 
> Even if I'm out of bounds for technique in some way I expect that
> 
>> ioctl.c: mkioctls
>>       env MACHINE=${MACHINE} CPP="${CPP}" \
>>               /bin/sh ${.CURDIR}/mkioctls ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
> 
> is not doing everything it should to have the full context needed for . . ./machine/acle-compat.h .
> 
> It's gotta be upstream. XCPP XCC and XCXX are all exclusive to Makefile.inc1. It's up to it to sort out the
> rest...  And none of the X{AR,AS,LD,etc} are defined, so there's bound to be an impedance mismatch. :)
> In the past when I've seen this it's been due to some kind of variable contamination, perhaps one that's
> not otherwise known...
> 
> Warner

For reference the src.conf used for amd64 -> arm is:

> KERNCONF=RPI2-NODBG
> TARGET=arm
> .if ${.MAKE.LEVEL} == 0
> TARGET_ARCH=armv6
> .export TARGET_ARCH
> .endif
> #
> WITH_LIBSOFT=
> WITH_FAST_DEPEND=
> WITH_LIBCPLUSPLUS=
> WITH_BINUTILS_BOOTSTRAP=
> WITH_CLANG=
> WITH_CLANG_IS_CC=
> WITH_CLANG_FULL=
> WITH_LLDB=
> WITH_CLANG_EXTRAS=
> WITH_BOOT=
> #
> WITHOUT_LIB32=
> WITHOUT_ELFTOOLCHAIN_BOOTSTRAP=
> WITHOUT_CLANG_BOOTSTRAP=
> WITHOUT_GCC_BOOTSTRAP=
> WITHOUT_GCC=
> WITHOUT_GNUCXX=
> #
> NO_WERROR=
> MALLOC_PRODUCTION=
> #
> WITH_DEBUG_FILES=
> #
> .if ${.MAKE.LEVEL} == 0
> XCC=/usr/bin/clang -target ${TARGET_ARCH}--freebsd11.0-gnueabi -march=armv7a -mcpu=cortex-a7 -mno-unaligned-access
> XCXX=/usr/bin/clang++ -target ${TARGET_ARCH}--freebsd11.0-gnueabi -march=armv7a -mcpu=cortex-a7 -mno-unaligned-access
> XCPP=/usr/bin/clang-cpp -target ${TARGET_ARCH}--freebsd11.0-gnueabi -march=armv7a -mcpu=cortex-a7 -mno-unaligned-access
> .export XCC
> .export XCXX
> .export XCPP
> .endif
> #
> .if ${.MAKE.LEVEL} == 0
> CC=/usr/bin/clang
> CXX=/usr/bin/clang++
> CPP=/usr/bin/clang-cpp
> .export CC
> .export CXX
> .export CPP
> .endif


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




More information about the freebsd-toolchain mailing list