A libc++ .depend status mismatch between /usr/src/Makefile.inc1 and bsd.prog.mk for ${X_COMPILER_TYPE} == gcc?
Mark Millard
markmi at dsl-only.net
Sun Mar 22 09:17:10 UTC 2015
Basic context:
> # dmesg | head
> ...
> FreeBSD 11.0-CURRENT #1 r279514M: Sat Mar 21 05:15:23 PDT 2015
> root at FBSDG5C0:/usr/obj/usr/srcC/sys/GENERIC64vtsc-NODEBUG powerpc
> gcc version 4.9.1 (FreeBSD Ports Collection for powerpc64)
> ...
(I used powerpc64-xtoolchain-gcc in a powerpc64 context to self-host, WITHOUT_CLANG= WITHOUT_LLDB= WITHOUT_GCC= WITHOUT_GNUCXX= WITHOUT_BOOT= WITHOUT_LIB32= . powerpc64-xtoolchain-gcc did not provide itself with a libstdc++ of its own.)
> # freebsd-version -ku; uname -apKU 11.0-CURRENT
> 11.0-CURRENT
> FreeBSD FBSDG5C0 11.0-CURRENT FreeBSD 11.0-CURRENT #1 r279514M: Sat Mar 21 05:15:23 PDT 2015 root at FBSDG5C0:/usr/obj/usr/srcC/sys/GENERIC64vtsc-NODEBUG powerpc powerpc64 1100062 1100062
> make -j 8 CROSS_TOOLCHAIN=powerpc64-gcc \
> WITHOUT_CLANG_BOOTSTRAP= WITHOUT_CLANG= WITHOUT_CLANG_IS_CC= \
> WITHOUT_LLDB= \
> WITH_GCC_BOOTSTRAP= WITH_GCC= WITHOUT_GNUCXX= \
> WITHOUT_BOOT= WITHOUT_LIB32= \
> buildworld buildkernel \
> KERNCONF=GENERIC64vtsc-NODEBUG \
> TARGET=powerpc TARGET_ARCH=powerpc64
> # more /etc/src.conf
> NO_WERROR=
> WITH_LIBCPLUSPLUS=
> #CFLAGS+=-DELF_VERBOSE
> #WITH_DEBUG_FILES=
> #
> # For trying powerpc64-xtoolchain-gcc...
> # (Force stages that do not use XCC, XCXX, XCPP to
> # also use powerpc64-xtoolchain.gcc's programs.)
> #
> CC=/usr/local/bin/powerpc64-portbld-freebsd11.0-gcc
> CXX=/usr/local/bin/powerpc64-portbld-freebsd11.0-g++
> CPP=/usr/local/bin/powerpc64-portbld-freebsd11.0-cpp
> CROSS_BINUTILS_PREFIX=/usr/local/powerpc64-freebsd/bin/
> X_COMPILER_TYPE=gcc
> #
> # CXXFLAGS For buildworld/buildkernel CROSS_TOOLCHAIN=powerpc64-gcc use...
> # spans being-built and (failing finding those directories) live and so for
> # -DNO_CLEAN after being-built ones are in place and the results depend on
> # self-hosting where the two are sufficiently compatibile.
> #
> # I've used .../. paths below so I can tell use of these from other sources of paths.
> #
> # Actually only appropriate for for _includes _libraries _depend everything build32 :
> CXXFLAGS+=-I/usr/obj/usr/srcC/tmp/usr/include/c++/v1/. -std=gnu++11 -L/usr/obj/usr/srcC/lib/libc++/.
> #
> # Actually only appropriate for for _worldtmp _legacy _bootstrap-tools _cleanobj _obj _build-tools _cross-tools :
> CXXFLAGS+=-I/usr/include/c++/v1/. -std=gnu++11 -L/usr/lib/.
> #
> # But for self-hosting in a cross tools like manor sometimes having both can work.
The problem:
/usr/src/Makefile.inc1 has the following code for cross compilation contexts:
> .if ${XCC:M/*}
> ...
> .if defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc
> XCFLAGS+= -isystem ${WORLDTMP}/usr/include -L${WORLDTMP}/usr/lib
> XCXXFLAGS+= -I${WORLDTMP}/usr/include/c++/v1 -std=gnu++11 -L${WORLDTMP}/../lib/libc++
> DEPFLAGS+= -I${WORLDTMP}/usr/include/c++/v1
> .else
> ...
In essence having gcc based XCXX cross compilers (X_COMPILER_TYPE) use libc++'s headers and library for XCXX with gnu++11 (so implicitly c++11) enabled. libstdc++ is not used.
[Note: atf-c++ did did not get automatic header access from the above for some reason but my /etc/src.conf assignments covered that case.]
bsd.prog.mk has the following contrasting code:
> .if defined(PROG)
> _EXTRADEPEND:
> .if defined(LDFLAGS) && !empty(LDFLAGS:M-nostdlib)
> .if defined(DPADD) && !empty(DPADD)
> echo ${PROG_FULL}: ${DPADD} >> ${DEPENDFILE}
> .endif
> .else
> echo ${PROG_FULL}: ${LIBC} ${DPADD} >> ${DEPENDFILE}
> .if defined(PROG_CXX)
> .if ${COMPILER_TYPE} == "clang" && empty(CXXFLAGS:M-stdlib=libstdc++)
> echo ${PROG_FULL}: ${LIBCPLUSPLUS} >> ${DEPENDFILE}
> .else
> echo ${PROG_FULL}: ${LIBSTDCPLUSPLUS} >> ${DEPENDFILE}
> .endif
> .endif
> .endif
> .endif
[There is no direct tie between X_COMPILER_TYPE and COMPILER_TYPE in general but with my /etc/src.conf there is.]
In essence (other than -nostdlib and also non-c++ code):
Only when COMPILER_TYPE for c++ indicates clang explicitly (without there being a -stdlib=libstdc++) is a libc++ dependency written out. The other c++ cases without -nostdlib always write out a libstdc++ dependency.
My powerpc64-xtoolchain-gcc buildworld buildkernel logs do not show libc++ additions to .depend files.
But they do show the following (from grep activity), although not necessarily from the above code in every case:
echo gperf: /usr/lib/libstdc++.a >> .depend
echo grodvi: /usr/lib/libstdc++.a >> .depend
echo addftinfo: /usr/lib/libstdc++.a >> .depend
echo groff: /usr/lib/libstdc++.a >> .depend
echo hpftodit: /usr/lib/libstdc++.a >> .depend
echo grn: /usr/lib/libstdc++.a >> .depend
...
echo troff: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
echo hpftodit: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
echo tests_test: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend.tests_test
echo indxbib: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
echo lkbib: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
echo utils_test: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend.utils_test
echo lookbib: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
echo tfmtodit: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
echo cpp_helpers: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend.cpp_helpers
echo users: /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a >> .depend
Some stale .depend notices for libstdc++.a are also generated (more grep activity):
make[5]: /usr/obj/usr/srcC/libexec/atf/atf-check/.depend, 105: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[5]: /usr/obj/usr/srcC/libexec/atf/atf-sh/.depend, 89: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[4]: /usr/obj/usr/srcC/sbin/devd/.depend, 99: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[8]: /usr/obj/usr/srcC/gnu/usr.bin/groff/src/devices/grodvi/.depend, 34: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[8]: /usr/obj/usr/srcC/gnu/usr.bin/groff/src/devices/grohtml/.depend, 151: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[8]: /usr/obj/usr/srcC/gnu/usr.bin/groff/src/devices/grolbp/.depend, 36: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
...
make[4]: /usr/obj/usr/srcC/usr.bin/users/.depend, 77: ignoring stale .depend for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/libatf-c++/tests/.depend.atf_c++_test, 197: ignoring stale .depend.atf_c++_test for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/libatf-c++/tests/.depend.build_test, 199: ignoring stale .depend.build_test for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/libatf-c++/tests/.depend.check_test, 204: ignoring stale .depend.check_test for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/libatf-c++/tests/.depend.macros_test, 201: ignoring stale .depend.macros_test for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/libatf-c++/tests/.depend.tests_test, 187: ignoring stale .depend.tests_test for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/libatf-c++/tests/.depend.utils_test, 186: ignoring stale .depend.utils_test for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
make[7]: /usr/obj/usr/srcC/lib/atf/tests/test-programs/.depend.cpp_helpers, 95: ignoring stale .depend.cpp_helpers for /usr/obj/usr/srcC/tmp/usr/lib/libstdc++.a
Context details:
# more /etc/make.conf
WRKDIRPREFIX=/usr/obj/portswork
#WITH_DEBUG=
MALLOC_PRODUCTION=
# svnlite info /usr/srcC/
Path: .
Working Copy Root Path: /usr/srcC
URL: https://svn0.us-west.freebsd.org/base/head
Relative URL: ^/head
Repository Root: https://svn0.us-west.freebsd.org/base
Repository UUID: ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
Revision: 279514
Node Kind: directory
Schedule: normal
Last Changed Author: adrian
Last Changed Rev: 279514
Last Changed Date: 2015-03-01 18:27:25 -0800 (Sun, 01 Mar 2015)
# svnlite status /usr/srcC/ --no-ignore
? /usr/srcC/.snap
M /usr/srcC/contrib/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h
M /usr/srcC/lib/libpjdlog/pjdlog.c
? /usr/srcC/restoresymtable
M /usr/srcC/sys/ddb/db_main.c
M /usr/srcC/sys/ddb/db_script.c
? /usr/srcC/sys/powerpc/conf/GENERIC64vtsc
? /usr/srcC/sys/powerpc/conf/GENERIC64vtsc-NODEBUG
? /usr/srcC/sys/powerpc/conf/GENERICvtsc
? /usr/srcC/sys/powerpc/conf/GENERICvtsc-NODEBUG
M /usr/srcC/sys/powerpc/ofw/ofw_machdep.c
M /usr/srcC/sys/powerpc/ofw/ofwcall64.S
===
Mark Millard
markmi at dsl-only.net
More information about the freebsd-toolchain
mailing list