Date: Sun, 30 Oct 2011 22:44:10 GMT From: Dominic Fandrey <kamikaze@bsdforen.de> To: freebsd-gnats-submit@FreeBSD.org Subject: ports/162178: Add bsd.clang.mk with Clang/LLVM support Message-ID: <201110302244.p9UMiAOo024629@red.freebsd.org> Resent-Message-ID: <201110302250.p9UMoBf1033755@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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@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@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@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@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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110302244.p9UMiAOo024629>