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