ports/162178: Add bsd.clang.mk with Clang/LLVM support

Dominic Fandrey kamikaze at bsdforen.de
Sun Oct 30 22:50:11 UTC 2011


>Number:         162178
>Category:       ports
>Synopsis:       Add bsd.clang.mk with Clang/LLVM support
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Oct 30 22:50:10 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Dominic Fandrey
>Release:        RELENG_8 and RELENG_9
>Organization:
private
>Environment:
FreeBSD mobileKamikaze.norad 8.2-STABLE FreeBSD 8.2-STABLE #0: Mon Aug 29 19:15:43 CEST 2011     root at mobileKamikaze.norad:/usr/obj/HP6510b-8/amd64/usr/src/sys/HP6510b-8  amd64

FreeBSD AryaStark.norad 9.0-RC1 FreeBSD 9.0-RC1 #0: Fri Oct 28 17:49:42 CEST 2011     root at AryaStark.norad:/usr/obj/GENERIC/amd64/usr/src/sys/GENERIC  amd64
>Description:
This adds Clang/LLVM support to ports/Mk/.

For port users:
	PREFER_CLANG	Defining this results in the use of Clang/LLVM if a
			port defines CLANG_SAFE
	FORCE_CLANG	Defining this results in the use of Clang/LLVM unless
			a port defines CLANG_UNSAFE

Note that setting PREFER_CLANG or FORCE_CLANG only has an effect if clang is
available.

For port developers:
	CLANG_PREFERRED	Defining this results in the use of clang if available
	CLANG_SAFE	Defining this allows the use of clang if the user
			defines PREFER_CLANG
	CLANG_UNSAFE	Defining this prohibits the use of clang even if the
			user defined FORCE_CLANG
	USE_CLANG	Defining this results in the use of clang and a build
			dependency if clang is not available from the base
			system

CLANG_* and USE_CLANG should be set to a version string. Each macro only
has an effect if the available version of clang matches the string.
>How-To-Repeat:

>Fix:
--- ports/Mk.orig/bsd.port.mk	2011-10-30 15:18:11.000000000 +0100
+++ ports/Mk/bsd.port.mk	2011-10-30 16:54:58.000000000 +0100
@@ -1686,6 +1686,11 @@
 .include "${PORTSDIR}/Mk/bsd.gcc.mk"
 .endif
 
+.if defined(USE_CLANG) || defined(CLANG_PREFERRED) \
+	|| defined(PREFER_CLANG) || defined(FORCE_CLANG)
+.include "${PORTSDIR}/Mk/bsd.clang.mk"
+.endif
+
 .if defined(USE_BINUTILS) && !defined(DISABLE_BINUTILS)
 BUILD_DEPENDS+=	${LOCALBASE}/bin/as:${PORTSDIR}/devel/binutils
 BINUTILS?=	ADDR2LINE AR AS CPPFILT GPROF LD NM OBJCOPY OBJDUMP RANLIB \


Patch attached with submission follows:

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	ports/Mk/bsd.clang.mk
#
echo x - ports/Mk/bsd.clang.mk
sed 's/^X//' >ports/Mk/bsd.clang.mk << '91aee25ec158037b3330f0ab68e2ef31'
X#
X# bsd.clang.mk - Support for Clang/LLVM usage
X#
X# Created by: Dominic Fandrey <kamikaze at bsdforen.de>
X#
X# For port users:
X#	PREFER_CLANG	Defining this results in the use of Clang/LLVM if a
X#			port defines CLANG_SAFE
X#	FORCE_CLANG	Defining this results in the use of Clang/LLVM unless
X#			a port defines CLANG_UNSAFE
X#
X# Note that setting PREFER_CLANG or FORCE_CLANG only has an effect if clang is
X# available.
X#
X# For port developers:
X#	CLANG_PREFERRED	Defining this results in the use of clang if available
X#	CLANG_SAFE	Defining this allows the use of clang if the user
X#			defines PREFER_CLANG
X#	CLANG_UNSAFE	Defining this prohibits the use of clang even if the
X#			user defined FORCE_CLANG
X#	USE_CLANG	Defining this results in the use of clang and a build
X#			dependency if clang is not available from the base
X#			system
X#
X# CLANG_* and USE_CLANG should be set to a version string. Each macro only
X# has an effect if the available version of clang matches the string.
X#
X# A version string may contain an arbitrary number of version definitions,
X# each definition may take one of the following forms:
X# TYPE		EREGEX					EXAMPLES
X# Open range	([0-9]+\.)*[0-9]+(\+|-)			2.9-, 3+
X# Range		([0-9]+\.)*[0-9]+-([0-9]+\.)*[0-9]+	2.9-3.0
X# Version	([0-9]+\.)*[0-9]+			3.0
X#
X# Not specified subversions are ignored. Ranges are inclusive.
X#
X
XCLANG_Include_MAINTAINER=	kamikaze at bsdforen.de
X
X.if !defined(_CLANGMKINCLUDED)
X
X_CLANGMKINCLUDED=		yes
X
X#
X# Basic setup of bsd.clang.mk.
X#
X
X# Valid version range regexes.
X_CLANG_OPENRANGE_REGEX=		${_CLANG_VERSION_REGEX}(\+|-)
X_CLANG_RANGE_REGEX=		${_CLANG_VERSION_REGEX}-${_CLANG_VERSION_REGEX}
X_CLANG_VERSION_REGEX=		([0-9]+\.)*[0-9]+
X# Clang binaries.
X_CLANG_CC=			clang
X_CLANG_CXX=			clang++
X_CLANG_CPP=			clang-cpp
X_CLANG_CPP_FALLBACK=		clang -E
X
X#
X# Determine available clang versions.
X#
X
X_CLANG_GET_VERSION_ARGS=	-v 2>&1 | ${SED} -nE '/clang version/s/.*version (${_CLANG_VERSION_REGEX}).*/\1/p'
X_CLANG_PATHS!=		${WHICH} -a ${_CLANG_CC} || ${TRUE}
X.for _path in ${_CLANG_PATHS:S/${_CLANG_CC}$//}
X_version!=			${_path}${_CLANG_CC} ${_CLANG_GET_VERSION_ARGS}
X_CLANG_VERSIONS:=		${_CLANG_VERSIONS} ${_path}:${_version}
X.endfor
X
X#
X# Version check shell code.
X#
X# @param 1
X#	The version range to check against
X# @param 2
X#	The version to check
X# @return
X#	Outputs 1 on range match, nothing otherwise
X#
X_CLANG_CHECK_VERSION= \
X		vdiff() { \
X			v1=$$1.; \
X			v2=$$2.; \
X			result=; \
X			while [ -n "$$v2" ]; do \
X				result="$${result:+$$result.}$$(($${v1%%.*} - $${v2%%.*}))"; \
X				v1="$${v1\#*.}"; \
X				v2="$${v2\#*.}"; \
X			done; \
X			${ECHO_CMD} "$$result"; \
X		}; \
X		checkOpenRange() { \
X			diff=$$(vdiff "$$version" "$${range%?}").; \
X			while [ -n "$$diff" ]; do \
X				if [ -z "$${range\#\#*+}" ]; then \
X					if [ "$${diff%%.*}" -lt 0 ]; then \
X						return; \
X					elif [ "$${diff%%.*}" -gt 0 ]; then \
X						${ECHO_CMD} 1; \
X						return; \
X					fi; \
X				else \
X					if [ "$${diff%%.*}" -gt 0 ]; then \
X						return; \
X					elif [ "$${diff%%.*}" -lt 0 ]; then \
X						${ECHO_CMD} 1; \
X						return; \
X					fi; \
X				fi; \
X				diff="$${diff\#*.}"; \
X			done; \
X			${ECHO_CMD} 1; \
X		}; \
X		checkRange() { \
X			lboundary=$$(range="$${range%%-*}+"; checkOpenRange); \
X			rboundary=$$(range="$${range\#*-}-"; checkOpenRange); \
X			if [ -n "$$lboundary" -a -n "$$rboundary" ]; then \
X				${ECHO_CMD} 1; \
X			fi; \
X		}; \
X		checkVersion() { \
X			diff=$$(vdiff "$$version" "$$range").; \
X			while [ -n "$$diff" ]; do \
X				if [ "$${diff%%.*}" -ne 0 ]; then \
X					return; \
X				fi; \
X				diff="$${diff\#*.}"; \
X			done; \
X			${ECHO_CMD} 1; \
X		}; \
X		check() { \
X			range="$$1"; \
X			version="$${2\#\#*:}"; \
X			if ${ECHO_CMD} "$$range" | ${EGREP} -qx '${_CLANG_OPENRANGE_REGEX}'; then \
X				checkOpenRange; \
X			elif ${ECHO_CMD} "$$range" | ${EGREP} -qx '${_CLANG_RANGE_REGEX}'; then \
X				checkRange; \
X			elif ${ECHO_CMD} "$$range" | ${EGREP} -qx '${_CLANG_VERSION_REGEX}'; then \
X				checkVersion; \
X			else \
X				${ECHO_CMD} "Invalid clang version range '$$range'!" 1>&2; \
X			fi; \
X		}; \
X		check
X
X#
X# Handle USE_CLANG prior to version selection.
X#
X.if defined(USE_CLANG)
X# Feed the desired versions to the version selection.
XCLANG_PREFERRED=	${USE_CLANG}
X
X# Get the versions available from the ports tree.
X_rel_version!=	${MAKE} -f ${PORTSDIR}/lang/clang/Makefile -VPORTVERSION -D_CLANGMKINCLUDED
X_dev_version!=	${MAKE} -f ${PORTSDIR}/lang/clang-devel/Makefile -VPORTVERSION -D_CLANGMKINCLUDED
X_CLANG_VERSIONS:=	${_CLANG_VERSIONS} \
X		PORTS/lang/clang:${_rel_version:C/(${_CLANG_VERSION_REGEX}).*/\1/} \
X		PORTS/lang/clang-devel:${_dev_version:C/(${_CLANG_VERSION_REGEX}).*/\1/}
X.endif
X
X#
X# Select one of the available versions of clang.
X#
X.for _version in ${_CLANG_VERSIONS}
X.if !defined(_USE_CLANG)
X
X# User wants clang, look for a safe version.
X.if defined(PREFER_CLANG)
X.for _safe in ${CLANG_SAFE}
X_match!=	${_CLANG_CHECK_VERSION} ${_safe} ${_version}
X.if ${_match} == 1
X_USE_CLANG:=	${_version}
X.endif
X.endfor
X.endif
X
X# User forces clang, look for a non-unsafe version.
X.if defined(FORCE_CLANG)
X_USE_CLANG:=	${_version}
X.for _unsafe in ${CLANG_UNSAFE}
X_match!=	${_CLANG_CHECK_VERSION} ${_unsafe} ${_version}
X.if ${_match} == 1
X.undef _USE_CLANG
X.endif
X.endfor
X.endif
X
X# The port author wants clang.
X.if defined(CLANG_PREFERRED)
X.for _preferred in ${CLANG_PREFERRED}
X_match!=	${_CLANG_CHECK_VERSION} ${_preferred} ${_version}
X.if ${_match} == 1
X_USE_CLANG:=	${_version}
X.endif
X.endfor
X.endif
X
X.endif # !defined(_USE_CLANG)
X.endfor # _version
X
X#
X# Create USE_CLANG build dependency entry.
X#
X.if defined(USE_CLANG)
X# Make the build dependency entry.
X.if defined(_USE_CLANG)
X_path:=		${_USE_CLANG:C/:.*//}
X.if ${_path:MPORTS/*}
X# A not yet installed version from the ports was selected.
X_CLANG_PORTSDIR:=	${PORTSDIR}/${_path:S/^PORTS\///}
XBUILD_DEPENDS+=	${LOCALBASE}/bin/${_CLANG_CC}:${_CLANG_PORTSDIR}
X_USE_CLANG:=	${LOCALBASE}/bin/:${_USE_CLANG:C/.*://}
X.else
X# An installed version of clang was selected.
X_pkg!=		${PKG_INFO} -qW ${_path}${_CLANG_CC} 2> /dev/null || ${TRUE}
X_origin!=	${PKG_INFO} -qo ${_pkg} 2> /dev/null || ${TRUE}
X.if ${_origin}
XBUILD_DEPENDS+=	${_path}${_CLANG_CC}:${PORTSDIR}/${_origin}
X.endif
X.endif
X.else # defined(_USE_CLANG)
XIGNORE=		version ${USE_CLANG:S/^/\'/:S/$/\',/:Q:S/,$//:S/\\//g} of clang not available for building
X.endif # defined(_USE_CLANG)
X.endif
X
X#
X# Set CC, CXX and CPP.
X#
X
X.if defined(_USE_CLANG)
X_path:=		${_USE_CLANG:C/:.*//}
X.if ${_path:M/usr/bin/}
XCC:=		${CC:S;^cc$;${_CLANG_CC};}
XCXX:=		${CXX:S;^c++$;${_CLANG_CXX};}
XCPP:=		${CPP:S;^cpp$;${_CLANG_CPP};}
X.else
XCC:=		${CC:S;^cc$;${_path}${_CLANG_CC};}
XCXX:=		${CXX:S;^c++$;${_path}${_CLANG_CXX};}
X.if exists(${_path}${_CLANG_CPP})
XCPP:=		${CPP:S;^cpp$;${_path}${_CLANG_CPP};}
X.else
XCPP:=		${CPP:S;^cpp$;${_path}${_CLANG_CPP_FALLBACK};}
X.endif
X.endif 
X
X.endif # defined(_USE_CLANG)
X
X.endif # !defined(_CLANGMKINCLUDED)
X
91aee25ec158037b3330f0ab68e2ef31
exit



>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list