This will still build the compiler for the target but will not build the
bootstrap cross-compiler in the cross-tools phase. Other toolchain
bootstrapping, such as elftoolchan an binutils, currently still occurs.
This is planned to be on-by-default eventually.
This will utilize the __FreeBSD_cc_version compiler macro defined in the
source tree and compare it to CC's version. If they match then the
cross-compiler is skipped. If [X]CC is an external compiler (absolute
path) or WITHOUT_CROSS_COMPILER is already set, then this logic is skipped.
If the expected bootstrap compiler type no longer matches the found CC
compiler type (clang vs gcc), then the logic is skipped. As an extra
safety check the version number is also compared from the compiler to
the tree version.
Clang:
The macro FREEBSD_CC_VERSION is defined in: lib/clang/include/clang/Basic/Version.inc For clang -target will be used if TARGET_ARCH != MACHINE_ARCH. This is from the current external toolchain logic. There is currently an assumption that the host compiler can build the TARGET_ARCH. This will usually be the case since we don't conditionalize target arch support in clang, but it will break when introducing new architectures. This problem is mitigated by incrementing the version when adding new architectures.
GCC:
The macro FBSD_CC_VER is defined in: gnu/usr.bin/cc/cc_tools/freebsd-native.h For GCC there is no simple -target support when TARGET_ARCH != MACHINE_ARCH. In this case the opportunistic skip is not done. If we add proper support for this case in external toolchain logic then it will be fine to enable.
This relies on the macros being incremented whenever any change occurs
to these compilers that warrant rebuilding files. It also should never
repeat earlier values.
Sponsored by: EMC / Isilon Storage Division
This also depends on http://reviews.llvm.org/D20037
and a change such as this:
diff --git lib/clang/include/clang/Basic/Version.inc lib/clang/include/clang/Basic/Version.inc index 94dc282..373cdb4 100644 --- lib/clang/include/clang/Basic/Version.inc +++ lib/clang/include/clang/Basic/Version.inc @@ -8,3 +8,5 @@ #define CLANG_VENDOR "FreeBSD " #define SVN_REVISION "262564" + +#define FREEBSD_CC_VERSION 1100001U
Here is a ministat as well (no ccache and clean build on all 6 builds):
x before + after +--------------------------------------------------------------------------+ | + x| |+ + x| ||AM| A| +--------------------------------------------------------------------------+ N Min Max Median Avg Stddev x 3 2966 2968 2966 2966.6667 1.1547005 + 3 2300 2319 2318 2312.3333 10.692677 Difference at 95.0% confidence -654.333 +/- 17.2371 -22.0562% +/- 0.581024% (Student's t, pooled s = 7.60482)