xref: /freebsd-src/share/mk/bsd.compiler.mk (revision 2a44cccd404d94c273c78e279df3fdc5531d25a2)
19215d178SBrooks Davis
299929852SWarner Losh# Setup variables for the compiler
399929852SWarner Losh#
49f1bd9c1SEnji Cooper# COMPILER_TYPE is the major type of compiler. Currently gcc and clang support
59f1bd9c1SEnji Cooper# automatic detection. Other compiler types can be shoe-horned in, but require
69f1bd9c1SEnji Cooper# explicit setting of the compiler type. The compiler type can also be set
79f1bd9c1SEnji Cooper# explicitly if, say, you install gcc as clang...
899929852SWarner Losh#
99f1bd9c1SEnji Cooper# COMPILER_VERSION is a numeric constant equal to:
109f1bd9c1SEnji Cooper#     major * 10000 + minor * 100 + tiny
11b2f4fa1aSBryan Drewery# It too can be overridden on the command line. When testing it, be sure to
129f1bd9c1SEnji Cooper# make sure that you are limiting the test to a specific compiler. Testing
139f1bd9c1SEnji Cooper# against 30300 for gcc likely isn't  what you wanted (since versions of gcc
149f1bd9c1SEnji Cooper# prior to 4.2 likely have no prayer of working).
1599929852SWarner Losh#
1695a83d05SBryan Drewery# COMPILER_FREEBSD_VERSION is the compiler's __FreeBSD_cc_version value.
1795a83d05SBryan Drewery#
189f1bd9c1SEnji Cooper# COMPILER_FEATURES will contain one or more of the following, based on
199f1bd9c1SEnji Cooper# compiler support for that feature:
209f1bd9c1SEnji Cooper#
21776e5661SAlan Somers# - c++17:     supports full (or nearly full) C++17 programming environment.
22776e5661SAlan Somers# - c++14:     supports full (or nearly full) C++14 programming environment.
239f1bd9c1SEnji Cooper# - c++11:     supports full (or nearly full) C++11 programming environment.
2448164080SEd Maste# - retpoline: supports the retpoline speculative execution vulnerability
2548164080SEd Maste#              mitigation.
26e268fd0aSBrooks Davis# - init-all:  supports stack variable initialization.
27*2a44cccdSAlexander Leidinger# - zeroregs:  supports zeroing used registers on return
28629b5e87SAndrew Turner# - aarch64-sha512: supports the AArch64 sha512 intrinsic functions.
2999929852SWarner Losh#
30ba1182e2SAlex Richardson# When bootstrapping on macOS, 'apple-clang' will be set in COMPILER_FEATURES
31ba1182e2SAlex Richardson# to differentiate Apple's version of Clang. Apple Clang uses a different
32ba1182e2SAlex Richardson# versioning scheme and may not support the same -W/-Wno warning flags. For a
33ba1182e2SAlex Richardson# mapping of Apple Clang versions to upstream clang versions see
34ba1182e2SAlex Richardson# https://en.wikipedia.org/wiki/Xcode#Xcode_7.0_-_12.x_(since_Free_On-Device_Development)
35ba1182e2SAlex Richardson#
3667b0a15aSBryan Drewery# These variables with an X_ prefix will also be provided if XCC is set.
3767b0a15aSBryan Drewery#
3899929852SWarner Losh# This file may be included multiple times, but only has effect the first time.
3999929852SWarner Losh#
4099929852SWarner Losh
41bd871f14SWarner Losh.if !target(__<bsd.compiler.mk>__)
42bd871f14SWarner Losh__<bsd.compiler.mk>__:
43bd871f14SWarner Losh
449160419cSBryan Drewery.include <bsd.opts.mk>
459160419cSBryan Drewery
46d6be9fddSAlex Richardson.if defined(_NO_INCLUDE_COMPILERMK)
47d6be9fddSAlex Richardson# If _NO_INCLUDE_COMPILERMK is set we are doing a make obj/cleandir/cleanobj
48d6be9fddSAlex Richardson# and might not have a valid compiler in $PATH yet. In this case just set the
49d6be9fddSAlex Richardson# variables that are expected by the other .mk files and return
50d6be9fddSAlex RichardsonCOMPILER_TYPE=none
51d6be9fddSAlex RichardsonX_COMPILER_TYPE=none
52d6be9fddSAlex RichardsonCOMPILER_VERSION=0
53d6be9fddSAlex RichardsonX_COMPILER_VERSION=0
54d6be9fddSAlex RichardsonCOMPILER_FEATURES=none
55d6be9fddSAlex Richardson.else
56e2a659eaSBryan Drewery# command = /usr/local/bin/ccache cc ...
57e2a659eaSBryan Drewery# wrapper = /usr/local/libexec/ccache/cc ...
58e2a659eaSBryan DreweryCCACHE_BUILD_TYPE?=	command
599160419cSBryan Drewery# Handle ccache after CC is determined, but not if CC/CXX are already
609160419cSBryan Drewery# overridden with a manual setup.
619160419cSBryan Drewery.if ${MK_CCACHE_BUILD:Uno} == "yes" && \
626e6be2bbSBryan Drewery    !make(test-system-*) && !make(print-dir) && !make(showconfig) && \
639160419cSBryan Drewery    (${CC:M*ccache/world/*} == "" || ${CXX:M*ccache/world/*} == "")
649160419cSBryan Drewery# CC is always prepended with the ccache wrapper rather than modifying
659160419cSBryan Drewery# PATH since it is more clear that ccache is used and avoids wasting time
669160419cSBryan Drewery# for mkdep/linking/asm builds.
679160419cSBryan DreweryLOCALBASE?=		/usr/local
686da773cbSBryan DreweryCCACHE_PKG_PREFIX?=	${LOCALBASE}
696da773cbSBryan DreweryCCACHE_WRAPPER_PATH?=	${CCACHE_PKG_PREFIX}/libexec/ccache
706da773cbSBryan DreweryCCACHE_BIN?=		${CCACHE_PKG_PREFIX}/bin/ccache
719160419cSBryan Drewery.if exists(${CCACHE_BIN})
729160419cSBryan Drewery# Export to ensure sub-makes can filter it out for mkdep/linking and
739160419cSBryan Drewery# to chain down into kernel build which won't include this file.
749160419cSBryan Drewery.export CCACHE_BIN
759160419cSBryan Drewery# Expand and export some variables so they may be based on make vars.
769160419cSBryan Drewery# This allows doing something like the following in the environment:
779160419cSBryan Drewery# CCACHE_BASEDIR='${SRCTOP:H}' MAKEOBJDIRPREFIX='${SRCTOP:H}/obj'
789160419cSBryan Drewery.for var in CCACHE_LOGFILE CCACHE_BASEDIR
799160419cSBryan Drewery.if defined(${var})
809160419cSBryan Drewery${var}:=	${${var}}
819160419cSBryan Drewery.export		${var}
829160419cSBryan Drewery.endif
839160419cSBryan Drewery.endfor
849160419cSBryan Drewery# Handle bootstrapped compiler changes properly by hashing their content
859160419cSBryan Drewery# rather than checking mtime.  For external compilers it should be safe
869160419cSBryan Drewery# to use the more optimal mtime check.
879160419cSBryan Drewery# XXX: CCACHE_COMPILERCHECK= string:<compiler_version, compiler_build_rev, compiler_patch_rev, compiler_default_target, compiler_default_sysroot>
889160419cSBryan Drewery.if ${CC:N${CCACHE_BIN}:[1]:M/*} == ""
899160419cSBryan DreweryCCACHE_COMPILERCHECK?=	content
909160419cSBryan Drewery.else
919160419cSBryan DreweryCCACHE_COMPILERCHECK?=	mtime
929160419cSBryan Drewery.endif
939160419cSBryan Drewery.export CCACHE_COMPILERCHECK
949160419cSBryan Drewery# Ensure no bogus CCACHE_PATH leaks in which might avoid the in-tree compiler.
95b7df39ccSBryan Drewery.if !empty(CCACHE_PATH)
969160419cSBryan DreweryCCACHE_PATH=
979160419cSBryan Drewery.export CCACHE_PATH
98b7df39ccSBryan Drewery.endif
99e2a659eaSBryan Drewery.if ${CCACHE_BUILD_TYPE} == "command"
100e2a659eaSBryan Drewery# Remove ccache from the PATH to prevent double calls and wasted CPP/LD time.
101e2a659eaSBryan DreweryPATH:=	${PATH:C,:?${CCACHE_WRAPPER_PATH}(/world)?(:$)?,,g}
1029160419cSBryan Drewery# Override various toolchain vars.
1039160419cSBryan Drewery.for var in CC CXX HOST_CC HOST_CXX
1049160419cSBryan Drewery.if defined(${var}) && ${${var}:M${CCACHE_BIN}} == ""
1059160419cSBryan Drewery${var}:=	${CCACHE_BIN} ${${var}}
1069160419cSBryan Drewery.endif
1079160419cSBryan Drewery.endfor
10891234af7SBryan Drewery.else
10991234af7SBryan Drewery# Need to ensure CCACHE_WRAPPER_PATH is the first in ${PATH}
11091234af7SBryan DreweryPATH:=	${PATH:C,:?${CCACHE_WRAPPER_PATH}(/world)?(:$)?,,g}
111e2a659eaSBryan DreweryPATH:=	${CCACHE_WRAPPER_PATH}:${PATH}
11291234af7SBryan DreweryCCACHE_WRAPPER_PATH_PFX=	${CCACHE_WRAPPER_PATH}:
113e2a659eaSBryan Drewery.endif	# ${CCACHE_BUILD_TYPE} == "command"
1149160419cSBryan Drewery# GCC does not need the CCACHE_CPP2 hack enabled by default in devel/ccache.
1159160419cSBryan Drewery# The port enables it due to ccache passing preprocessed C to clang
1169160419cSBryan Drewery# which fails with -Wparentheses-equality, -Wtautological-compare, and
1179160419cSBryan Drewery# -Wself-assign on macro-expanded lines.
1189160419cSBryan Drewery.if defined(COMPILER_TYPE) && ${COMPILER_TYPE} == "gcc"
1199160419cSBryan DreweryCCACHE_NOCPP2=	1
1209160419cSBryan Drewery.export CCACHE_NOCPP2
1219160419cSBryan Drewery.endif
1229160419cSBryan Drewery# Canonicalize CCACHE_DIR for meta mode usage.
1232eed38a0SBryan Drewery.if !defined(CCACHE_DIR)
1242eed38a0SBryan DreweryCCACHE_DIR!=	${CCACHE_BIN} -p | awk '$$2 == "cache_dir" {print $$4}'
1252eed38a0SBryan Drewery.export CCACHE_DIR
1262eed38a0SBryan Drewery.endif
1272eed38a0SBryan Drewery.if !empty(CCACHE_DIR) && empty(.MAKE.META.IGNORE_PATHS:M${CCACHE_DIR})
1289160419cSBryan DreweryCCACHE_DIR:=	${CCACHE_DIR:tA}
1299160419cSBryan Drewery.MAKE.META.IGNORE_PATHS+= ${CCACHE_DIR}
1309160419cSBryan Drewery.export CCACHE_DIR
1319160419cSBryan Drewery.endif
1326c24213eSBryan Drewery# ccache doesn't affect build output so let it slide for meta mode
1336c24213eSBryan Drewery# comparisons.
1346c24213eSBryan Drewery.MAKE.META.IGNORE_PATHS+= ${CCACHE_BIN}
1359160419cSBryan Dreweryccache-print-options: .PHONY
1369160419cSBryan Drewery	@${CCACHE_BIN} -p
1379160419cSBryan Drewery.endif	# exists(${CCACHE_BIN})
1389160419cSBryan Drewery.endif	# ${MK_CCACHE_BUILD} == "yes"
1399160419cSBryan Drewery
14074f65486SAlex Richardson_cc_vars=CC $${_empty_var_}
14174f65486SAlex Richardson.if !empty(_WANT_TOOLCHAIN_CROSS_VARS)
14274f65486SAlex Richardson# Only the toplevel makefile needs to compute the X_COMPILER_* variables.
14374f65486SAlex Richardson# Skipping the computation of the unused X_COMPILER_* in the subdirectory
14474f65486SAlex Richardson# makefiles can save a noticeable amount of time when walking the whole source
14574f65486SAlex Richardson# tree (e.g. during make includes, etc.).
14674f65486SAlex Richardson_cc_vars+=XCC X_
14774f65486SAlex Richardson.endif
14874f65486SAlex Richardson
14974f65486SAlex Richardson.for cc X_ in ${_cc_vars}
15067b0a15aSBryan Drewery.if ${cc} == "CC" || !empty(XCC)
15116a5c008SBryan Drewery# Try to import COMPILER_TYPE and COMPILER_VERSION from parent make.
15216a5c008SBryan Drewery# The value is only used/exported for the same environment that impacts
15316a5c008SBryan Drewery# CC and COMPILER_* settings here.
15495a83d05SBryan Drewery_exported_vars=	${X_}COMPILER_TYPE ${X_}COMPILER_VERSION \
155f382bac4SBrooks Davis		${X_}COMPILER_FREEBSD_VERSION ${X_}COMPILER_RESOURCE_DIR
156f661dbeeSBryan Drewery${X_}_cc_hash=	${${cc}}${MACHINE}${PATH}
157f661dbeeSBryan Drewery${X_}_cc_hash:=	${${X_}_cc_hash:hash}
158489377c0SAlex Richardson# Only import if none of the vars are set differently somehow else.
15913569c0aSBryan Drewery_can_export=	yes
16013569c0aSBryan Drewery.for var in ${_exported_vars}
161489377c0SAlex Richardson.if defined(${var}) && (!defined(${var}__${${X_}_cc_hash}) || ${${var}__${${X_}_cc_hash}} != ${${var}})
162489377c0SAlex Richardson.if defined(${var}__${${X_}_ld_hash})
163bca92be6SJohn Baldwin.info Cannot import ${X_}COMPILER variables since cached ${var} is different: ${${var}__${${X_}_cc_hash}} != ${${var}}
164489377c0SAlex Richardson.endif
16513569c0aSBryan Drewery_can_export=	no
16613569c0aSBryan Drewery.endif
16713569c0aSBryan Drewery.endfor
16813569c0aSBryan Drewery.if ${_can_export} == yes
16916a5c008SBryan Drewery.for var in ${_exported_vars}
170dc3c6ad6SAlex Richardson.if defined(${var}__${${X_}_cc_hash})
171dc3c6ad6SAlex Richardson${var}=	${${var}__${${X_}_cc_hash}}
17216a5c008SBryan Drewery.endif
17316a5c008SBryan Drewery.endfor
17413569c0aSBryan Drewery.endif
17516a5c008SBryan Drewery
17667b0a15aSBryan Drewery.if ${cc} == "CC" || (${cc} == "XCC" && ${XCC} != ${CC})
1779d82612eSSimon J. Gerraty.if ${MACHINE} == "common"
17810b60135SSimon J. Gerraty# common is a pseudo machine for architecture independent
17910b60135SSimon J. Gerraty# generated files - thus there is no compiler.
18067b0a15aSBryan Drewery${X_}COMPILER_TYPE= none
18167b0a15aSBryan Drewery${X_}COMPILER_VERSION= 0
18295a83d05SBryan Drewery${X_}COMPILER_FREEBSD_VERSION= 0
18367b0a15aSBryan Drewery.elif !defined(${X_}COMPILER_TYPE) || !defined(${X_}COMPILER_VERSION)
184759aa20dSBryan Drewery_v!=	${${cc}:N${CCACHE_BIN}} --version || echo 0.0.0
1859d82612eSSimon J. Gerraty
18667b0a15aSBryan Drewery.if !defined(${X_}COMPILER_TYPE)
18767b0a15aSBryan Drewery. if ${${cc}:T:M*gcc*}
18867b0a15aSBryan Drewery${X_}COMPILER_TYPE:=	gcc
18967b0a15aSBryan Drewery. elif ${${cc}:T:M*clang*}
19067b0a15aSBryan Drewery${X_}COMPILER_TYPE:=	clang
19199929852SWarner Losh. elif ${_v:Mgcc}
19267b0a15aSBryan Drewery${X_}COMPILER_TYPE:=	gcc
193806b3bbeSJohn Baldwin. elif ${_v:M\(GCC\)} || ${_v:M*GNU}
19467b0a15aSBryan Drewery${X_}COMPILER_TYPE:=	gcc
1955b424cbaSMarcel Moolenaar. elif ${_v:Mclang} || ${_v:M(clang-*.*.*)}
19667b0a15aSBryan Drewery${X_}COMPILER_TYPE:=	clang
1979215d178SBrooks Davis. else
1989c695432SJessica Clarke# With GCC, cc --version prints "cc $VERSION ($PKGVERSION)", so if a
1999c695432SJessica Clarke# distribution overrides the default GCC PKGVERSION it is not identified.
2009c695432SJessica Clarke# However, its -v output always says "gcc version" in it, so fall back on that.
2019c695432SJessica Clarke_gcc_version!=	${${cc}:N${CCACHE_BIN}} -v 2>&1 | grep "gcc version"
2029c695432SJessica Clarke.  if !empty(_gcc_version)
2039c695432SJessica Clarke${X_}COMPILER_TYPE:=	gcc
2049c695432SJessica Clarke.  else
20567b0a15aSBryan Drewery.error Unable to determine compiler type for ${cc}=${${cc}}.  Consider setting ${X_}COMPILER_TYPE.
2069215d178SBrooks Davis.  endif
2079c695432SJessica Clarke.undef _gcc_version
2089c695432SJessica Clarke. endif
2099215d178SBrooks Davis.endif
21067b0a15aSBryan Drewery.if !defined(${X_}COMPILER_VERSION)
211e90bb1adSMitchell Horne${X_}COMPILER_VERSION!=echo "${_v:M[1-9]*.[0-9]*}" | awk -F. '{print $$1 * 10000 + $$2 * 100 + $$3;}'
2129215d178SBrooks Davis.endif
213ba1182e2SAlex Richardson# Detect apple clang when bootstrapping to select appropriate warning flags.
214ba1182e2SAlex Richardson.if !defined(${X_}COMPILER_FEATURES) && ${_v:[*]:M*Apple clang version*}
215ba1182e2SAlex Richardson${X_}COMPILER_FEATURES=	apple-clang
216ba1182e2SAlex Richardson.endif
21799929852SWarner Losh.undef _v
218a8374a76SEnji Cooper.endif
21995a83d05SBryan Drewery.if !defined(${X_}COMPILER_FREEBSD_VERSION)
220759aa20dSBryan Drewery${X_}COMPILER_FREEBSD_VERSION!=	{ echo "__FreeBSD_cc_version" | ${${cc}:N${CCACHE_BIN}} -E - 2>/dev/null || echo __FreeBSD_cc_version; } | sed -n '$$p'
22195a83d05SBryan Drewery# If we get a literal "__FreeBSD_cc_version" back then the compiler
22295a83d05SBryan Drewery# is a non-FreeBSD build that doesn't support it or some other error
22395a83d05SBryan Drewery# occurred.
22495a83d05SBryan Drewery.if ${${X_}COMPILER_FREEBSD_VERSION} == "__FreeBSD_cc_version"
22595a83d05SBryan Drewery${X_}COMPILER_FREEBSD_VERSION=	unknown
22695a83d05SBryan Drewery.endif
22795a83d05SBryan Drewery.endif
228815e67ddSBrooks Davis
229f382bac4SBrooks Davis.if !defined(${X_}COMPILER_RESOURCE_DIR)
230f382bac4SBrooks Davis${X_}COMPILER_RESOURCE_DIR!=	${${cc}:N${CCACHE_BIN}} -print-resource-dir 2>/dev/null || echo unknown
231f382bac4SBrooks Davis.endif
232f382bac4SBrooks Davis
233ba1182e2SAlex Richardson${X_}COMPILER_FEATURES+=		c++11 c++14
234fac6dee9SEric van Gyzen.if ${${X_}COMPILER_TYPE} == "clang" || \
235776e5661SAlan Somers	(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 70000)
236776e5661SAlan Somers${X_}COMPILER_FEATURES+=	c++17
237776e5661SAlan Somers.endif
238063b380fSJohn Baldwin.if (${${X_}COMPILER_TYPE} == "clang" && ${${X_}COMPILER_VERSION} >= 100000) || \
239063b380fSJohn Baldwin	(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 100100)
240063b380fSJohn Baldwin${X_}COMPILER_FEATURES+=	c++20
241063b380fSJohn Baldwin.endif
242c3273622SDimitry Andric.if ${${X_}COMPILER_TYPE} == "clang" || \
243c3273622SDimitry Andric	(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 120000)
244c3273622SDimitry Andric${X_}COMPILER_FEATURES+=	init-all
245c3273622SDimitry Andric.endif
246fac6dee9SEric van Gyzen.if ${${X_}COMPILER_TYPE} == "clang"
247c3273622SDimitry Andric${X_}COMPILER_FEATURES+=	retpoline
24847363e99SEd Maste# PR257638 lld fails with BE compressed debug.  Fixed in main but external tool
24947363e99SEd Maste# chains will initially not have the fix.  For now limit the feature to LE
25047363e99SEd Maste# targets.
251cef65082SJessica Clarke# When compiling bootstrap tools on non-FreeBSD, the various MACHINE variables
252cef65082SJessica Clarke# for the host can be missing or not match FreeBSD's naming (e.g. Linux/amd64
253cef65082SJessica Clarke# reports as MACHINE=x86_64 MACHINE_ARCH=x86_64), causing TARGET_ENDIANNESS to
254cef65082SJessica Clarke# be undefined; be conservative and default to off until we turn this on by
255cef65082SJessica Clarke# default everywhere.
25647363e99SEd Maste.include <bsd.endian.mk>
257cef65082SJessica Clarke.if (${.MAKE.OS} == "FreeBSD" || defined(TARGET_ENDIANNESS)) && \
258cef65082SJessica Clarke    ${TARGET_ENDIANNESS} == "1234"
25947363e99SEd Maste${X_}COMPILER_FEATURES+=	compressed-debug
26047363e99SEd Maste.endif
26167b0a15aSBryan Drewery.endif
262d616ae46SDan McGregor.if ${${X_}COMPILER_TYPE} == "clang" && ${${X_}COMPILER_VERSION} >= 100000 || \
263d616ae46SDan McGregor	(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 80100)
264d616ae46SDan McGregor${X_}COMPILER_FEATURES+=	fileprefixmap
265d616ae46SDan McGregor.endif
26667b0a15aSBryan Drewery
267*2a44cccdSAlexander Leidinger.if (${${X_}COMPILER_TYPE} == "clang" && ${${X_}COMPILER_VERSION} >= 150000) || \
268*2a44cccdSAlexander Leidinger	(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 110000)
269*2a44cccdSAlexander Leidinger${X_}COMPILER_FEATURES+=	zeroregs
270*2a44cccdSAlexander Leidinger.endif
271*2a44cccdSAlexander Leidinger
272629b5e87SAndrew Turner.if (${${X_}COMPILER_TYPE} == "clang" && ${${X_}COMPILER_VERSION} >= 130000) || \
273629b5e87SAndrew Turner	(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 90000)
274629b5e87SAndrew Turner# AArch64 sha512 intrinsics are supported (and have been tested) in
275629b5e87SAndrew Turner# clang 13 and gcc 9.
276629b5e87SAndrew Turner${X_}COMPILER_FEATURES+=	aarch64-sha512
277629b5e87SAndrew Turner.endif
278629b5e87SAndrew Turner
27967b0a15aSBryan Drewery.else
28067b0a15aSBryan Drewery# Use CC's values
28167b0a15aSBryan DreweryX_COMPILER_TYPE=	${COMPILER_TYPE}
28267b0a15aSBryan DreweryX_COMPILER_VERSION=	${COMPILER_VERSION}
28395a83d05SBryan DreweryX_COMPILER_FREEBSD_VERSION=	${COMPILER_FREEBSD_VERSION}
28467b0a15aSBryan DreweryX_COMPILER_FEATURES=	${COMPILER_FEATURES}
285f382bac4SBrooks DavisX_COMPILER_RESOURCE_DIR=	${COMPILER_RESOURCE_DIR}
28667b0a15aSBryan Drewery.endif	# ${cc} == "CC" || (${cc} == "XCC" && ${XCC} != ${CC})
28767b0a15aSBryan Drewery
28816a5c008SBryan Drewery# Export the values so sub-makes don't have to look them up again, using the
28916a5c008SBryan Drewery# hash key computed above.
29016a5c008SBryan Drewery.for var in ${_exported_vars}
291dc3c6ad6SAlex Richardson${var}__${${X_}_cc_hash}:=	${${var}}
292dc3c6ad6SAlex Richardson.export-env ${var}__${${X_}_cc_hash}
293dc3c6ad6SAlex Richardson.undef ${var}__${${X_}_cc_hash}
29416a5c008SBryan Drewery.endfor
29516a5c008SBryan Drewery
29667b0a15aSBryan Drewery.endif	# ${cc} == "CC" || !empty(XCC)
29767b0a15aSBryan Drewery.endfor	# .for cc in CC XCC
298bd871f14SWarner Losh
299a7d84af8SBryan Drewery.if !defined(_NO_INCLUDE_LINKERMK)
300125902b6SBryan Drewery.include <bsd.linker.mk>
301a7d84af8SBryan Drewery.endif
302d6be9fddSAlex Richardson.endif	# defined(_NO_INCLUDE_COMPILERMK)
303bd871f14SWarner Losh.endif	# !target(__<bsd.compiler.mk>__)
304