Index: share/mk/Makefile =================================================================== --- share/mk/Makefile +++ share/mk/Makefile @@ -33,6 +33,7 @@ bsd.kmod.mk \ bsd.lib.mk \ bsd.libnames.mk \ + bsd.linker.mk \ bsd.links.mk \ bsd.man.mk \ bsd.mkopt.mk \ Index: share/mk/bsd.compiler.mk =================================================================== --- share/mk/bsd.compiler.mk +++ share/mk/bsd.compiler.mk @@ -194,4 +194,5 @@ .endif # ${cc} == "CC" || !empty(XCC) .endfor # .for cc in CC XCC +.include .endif # !target(____) Index: share/mk/bsd.linker.mk =================================================================== --- /dev/null +++ share/mk/bsd.linker.mk @@ -0,0 +1,35 @@ +# $FreeBSD$ + +# Setup variables for the linker. +# +# LINKER_TYPE is the major type of linker. Currently binutils and lld support +# automatic detection. +# +# LINKER_VERSION is a numeric constant equal to: +# major * 10000 + minor * 100 + tiny +# It too can be overriden on the command line. +# +# These variables with an X_ prefix will also be provided if XCC is set. +# +# This file may be included multiple times, but only has effect the first time. +# + +.if !target(____) +____: + +_ld_version!= ${LD} --version 2>/dev/null | head -n 1 || echo none +.if ${_ld_version} == "none" +.error Unable to determine linker type from LD=${LD} +.endif +.if ${_ld_version:[1..2]} == "GNU ld" +LINKER_TYPE= binutils +_v= ${_ld_version:[3]} +.elif ${_ld_version:[1]} == "LLD" +LINKER_TYPE= lld +_v= ${_ld_version:[2]} +.else +.error Unknown linker from LD=${LD}: ${_ld_version} +.endif +LINKER_VERSION!=echo "${_v:M[1-9].[0-9]*}" | awk -F. '{print $$1 * 10000 + $$2 * 100 + $$3;}' + +.endif # !target(____)