summaryrefslogtreecommitdiff
path: root/mk/compiler/gcc.mk
diff options
context:
space:
mode:
authorjlam <jlam@pkgsrc.org>2004-02-01 00:31:00 +0000
committerjlam <jlam@pkgsrc.org>2004-02-01 00:31:00 +0000
commitff13724574a627fd1746aa476846d59f5035a9ec (patch)
tree7cb3836535a745f7a065ffd61260b1bbffbf3a6c /mk/compiler/gcc.mk
parent9c6526fe00d934af29ada4cedf4e3fdef9b07407 (diff)
downloadpkgsrc-ff13724574a627fd1746aa476846d59f5035a9ec.tar.gz
New compiler specification framework, based on mk/compiler.mk. The
changes from the old compiler.mk are: * Split apart the compiler-specific logic into separate files. This should make supporting other compilers a bit easier. * Deprecate all of the USE_* compiler.mk variables, e.g. USE_GCC[23], USE_SUNPRO, etc. It's all replaced with a new PKGSRC_COMPILER variable. * Clean up the GCC handling so that it's all controlled by a single variable GCC_REQD. The following behaviour is expected: (a) If USE_PKGSRC_GCC is defined, then pretend there is no GCC on the system. (b) If there is no GCC, then the appropriate GCC corresponding to GCC_REQD is installed and used. (c) If there is a GCC, if it satisfies GCC_REQD, then use it; otherwise install and use the appropriate GCC package. (d) If lang/gcc is installed and GCC_REQD > 2.95.3, then lang/gcc3 is installed and used. (e) If lang/gcc3 is installed and GCC_REQD = 2.95.3, then gcc3 is still used instead of installing lang/gcc. New features include: * PKGSRC_COMPILER takes a list of values specifying the chain of compilers to call when building packages. Valid values are: distcc distributed C/C++ (chainable) ccache compiler cache (chainable) gcc GNU mipspro Silicon Graphics, Inc. MIPSpro sunpro Sun Microsystems, Inc. WorkShip/Forte/Sun ONE Studio The default is "gcc". You can use ccache and/or distcc with an appropriate PKGSRC_COMPILER setting, e.g. "ccache distcc gcc". * Change GCC_REQD to hold a list of values that we scan through to find the highest version of GCC required by the build. Package Makefiles should now do "GCC_REQD+=..." instead of "GCC_REQD=...".
Diffstat (limited to 'mk/compiler/gcc.mk')
-rw-r--r--mk/compiler/gcc.mk224
1 files changed, 224 insertions, 0 deletions
diff --git a/mk/compiler/gcc.mk b/mk/compiler/gcc.mk
new file mode 100644
index 00000000000..69a6b60ede0
--- /dev/null
+++ b/mk/compiler/gcc.mk
@@ -0,0 +1,224 @@
+# $NetBSD: gcc.mk,v 1.1 2004/02/01 00:31:00 jlam Exp $
+
+.if !defined(COMPILER_GCC_MK)
+COMPILER_GCC_MK= defined
+
+.include "../../mk/bsd.prefs.mk"
+
+GCC_REQD?= 2.8.0
+
+# _GCC_DIST_VERSION is the highest version of GCC installed by the pkgsrc
+# without the PKGREVISIONs.
+#
+_GCC_DIST_VERSION= 3.3
+
+# _GCC2_PATTERNS matches N s.t. N <= 2.95.3.
+_GCC2_PATTERNS= 2.8 2.8.* 2.9 2.9.* 2.[1-8][0-9] 2.[1-8][0-9].* \
+ 2.9[0-4] 2.9[0-4].* 2.95 2.95.[0-3]
+
+# _GCC3_PATTERNS matches N s.t. 2.95.3 < N.
+_GCC3_PATTERNS= 2.95.[4-9]* 2.95.[1-9][0-9]* 2.9[6-9] 2.9[6-9].* \
+ 2.[1-9][0-9][0-9]* 3.* [4-9]*
+
+.if !defined(_IS_BUILTIN_GCC)
+#
+# GCC in older versions of Darwin report "Apple Computer ... based on gcc
+# version ...", so we can't just grep for "^gcc".
+#
+_IS_BUILTIN_GCC!= \
+ gccpath="`${TYPE} ${CC} | ${AWK} '{ print $$NF }'`"; \
+ case $$gccpath in \
+ ${LOCALBASE}/*) \
+ ${ECHO} "NO"; \
+ ;; \
+ *) \
+ if ${CC} -v 2>&1 | ${GREP} -q 'gcc version'; then \
+ ${ECHO} "YES"; \
+ else \
+ ${ECHO} "NO"; \
+ fi; \
+ ;; \
+ esac
+.endif
+
+# Distill the GCC_REQD list into a single _GCC_REQD value that is the
+# highest version of GCC required.
+#
+_GCC_STRICTEST_REQD?= none
+.for _version_ in ${GCC_REQD}
+. for _pkg_ in gcc-${_version_}
+. if ${_GCC_STRICTEST_REQD} == "none"
+_GCC_PKG_SATISFIES_DEP= YES
+. for _vers_ in ${GCC_REQD}
+. if !empty(_GCC_PKG_SATISFIES_DEP:M[yY][eE][sS])
+_GCC_PKG_SATISFIES_DEP!= \
+ if ${PKG_ADMIN} pmatch 'gcc>=${_vers_}' ${_pkg_}; then \
+ ${ECHO} "YES"; \
+ else \
+ ${ECHO} "NO"; \
+ fi
+. endif
+. endfor
+. if !empty(_GCC_PKG_SATISFIES_DEP:M[yY][eE][sS])
+_GCC_STRICTEST_REQD= ${_version_}
+. endif
+. endif
+. endfor
+.endfor
+_GCC_REQD= ${_GCC_STRICTEST_REQD}
+
+# Determine whether we require GCC-2.x or GCC-3.x by examining _GCC_REQD.
+.for _pattern_ in ${_GCC2_PATTERNS}
+. if !empty(_GCC_REQD:M${_pattern_})
+_GCC2_REQD:= ${_GCC_REQD}
+. endif
+.endfor
+.for _pattern_ in ${_GCC3_PATTERNS}
+. if !empty(_GCC_REQD:M${_pattern_})
+_GCC3_REQD:= ${_GCC_REQD}
+. endif
+.endfor
+.if defined(_GCC2_REQD)
+_GCC_REQD:= ${_GCC2_REQD}
+_GCC_PKGBASE= gcc
+_GCC_PKGSRCDIR= ../../lang/gcc
+. if !empty(PKGPATH:Mlang/gcc)
+_IGNORE_GCC_REQD= yes
+MAKEFLAGS+= _IGNORE_GCC_REQD=yes
+. endif
+.elif defined(_GCC3_REQD)
+_GCC_REQD:= ${_GCC3_REQD}
+_GCC_PKGBASE= gcc3
+_GCC_PKGSRCDIR= ../../lang/gcc3
+. if !empty(PKGPATH:Mlang/gcc3)
+_IGNORE_GCC_REQD= yes
+MAKEFLAGS+= _IGNORE_GCC_REQD=yes
+. endif
+.endif
+_GCC_DEPENDS= ${_GCC_PKGBASE}>=${_GCC_REQD}
+
+.if defined(_IGNORE_GCC_REQD)
+_USE_PKGSRC_GCC= NO
+.endif
+
+.if !defined(_USE_PKGSRC_GCC)
+. if !empty(_IS_BUILTIN_GCC:M[nN][oO])
+_USE_PKGSRC_GCC= YES
+. else
+_GCC_VERSION_STRING!= ${CC} -v 2>&1 | ${GREP} 'gcc version'
+. if !empty(_GCC_VERSION_STRING:Megcs*)
+_GCC_VERSION= 2.8.1 # egcs is considered to be gcc-2.8.1.
+. elif !empty(_GCC_VERSION_STRING:Mgcc*)
+_GCC_VERSION!= ${CC} -dumpversion
+. else
+_GCC_VERSION= 0
+. endif
+#
+# Note that the actual package name isn't really important here as we're
+# just trying to do comparisons of version numbers.
+#
+_GCC_TEST_DEPENDS= cc>=${GCC_REQD}
+_GCC_PKG= cc-${_GCC_VERSION}
+_USE_PKGSRC_GCC!= \
+ if ${PKG_ADMIN} pmatch '${_GCC_TEST_DEPENDS}' ${_GCC_PKG}; then \
+ ${ECHO} "NO"; \
+ else \
+ ${ECHO} "YES"; \
+ fi
+. endif
+.endif
+
+.if !empty(_USE_PKGSRC_GCC:M[yY][eE][sS])
+#
+# Ensure that the correct rpath is passed to the linker if we need to
+# link against gcc shared libs.
+#
+_COMPILER_LD_FLAG= -Wl,
+_GCC_SUBPREFIX!= \
+ if ${PKG_INFO} -qe ${_GCC_PKGBASE}; then \
+ ${PKG_INFO} -f ${_GCC_PKGBASE} | \
+ ${GREP} "File:.*bin/gcc" | \
+ ${SED} -e "s/.*File: *//;s/bin\/gcc.*//;q"; \
+ else \
+ ${ECHO} "not_found/"; \
+ fi
+_GCC_PREFIX= ${LOCALBASE}/${_GCC_SUBPREFIX}
+_GCC_LIBGCCDIR!= \
+ if [ -x ${_GCC_PREFIX}bin/gcc ]; then \
+ ${DIRNAME} `${_GCC_PREFIX}bin/gcc --print-libgcc-file-name`; \
+ else \
+ ${ECHO} "not_found"; \
+ fi
+_GCC_ARCHSUBDIR= ${_GCC_LIBGCCDIR:S|^${LOCALBASE}/${_GCC_SUBPREFIX}||}
+_GCC_ARCHDIR= ${_GCC_PREFIX}${_GCC_ARCHSUBDIR}
+
+_GCC_LDFLAGS= # empty
+.for _dir_ in ${_GCC_ARCHDIR} ${_GCC_PREFIX}lib
+_GCC_LDFLAGS+= -L${_dir_} ${_COMPILER_LD_FLAG}${RPATH_FLAG}${_dir_}
+.endfor
+LDFLAGS+= ${_GCC_LDFLAGS}
+.endif
+
+# Check if any of the versions of GCC in pkgsrc can satisfy the _GCC_REQD
+# requirement.
+#
+.if !defined(_NEED_NEWER_GCC)
+_PKGSRC_GCC_VERSION= ${_GCC_PKGBASE}-${_GCC_DIST_VERSION}
+_NEED_NEWER_GCC!= \
+ if ${PKG_ADMIN} pmatch '${_GCC_DEPENDS}' ${_PKGSRC_GCC_VERSION}; then \
+ ${ECHO} "NO"; \
+ else \
+ ${ECHO} "YES"; \
+ fi
+MAKEFLAGS+= _NEED_NEWER_GCC="${_NEED_NEWER_GCC}"
+.endif
+.if !empty(_USE_PKGSRC_GCC:M[yY][eE][sS]) && \
+ !empty(_NEED_NEWER_GCC:M[yY][eE][sS])
+PKG_SKIP_REASON= "Unable to satisfy dependency: ${_GCC_DEPENDS}"
+.endif
+
+# Add the dependency on GCC.
+.if !empty(_USE_PKGSRC_GCC:M[yY][eE][sS])
+. if empty(USE_BUILDLINK2:M[nN][oO])
+. include "${_GCC_PKGSRCDIR}/buildlink2.mk"
+#. elif !empty(USE_BUILDLINK3:M[yY][eE][sS])
+#. include "${_GCC_PKGSRCDIR}/buildlink3.mk"
+. else
+. if defined(USE_GCC_SHLIB)
+DEPENDS+= ${_GCC_DEPENDS}:${_GCC_PKGSRCDIR}
+. else
+BUILD_DEPENDS+= ${_GCC_DEPENDS}:${_GCC_PKGSRCDIR}
+. endif
+. endif
+.endif
+
+# Point the variables that specify the compiler to the installed
+# GCC executables.
+#
+.if !empty(_USE_PKGSRC_GCC:M[yY][eE][sS])
+. if exists(${_GCC_PREFIX}bin/gcc)
+PATH:= ${_GCC_PREFIX}bin:${PATH}
+CC= ${_GCC_PREFIX}bin/gcc
+CPP= ${_GCC_PREFIX}bin/cpp
+CXX= ${_GCC_PREFIX}bin/g++
+F77= ${_GCC_PREFIX}bin/g77
+PKG_FC:= ${F77}
+. endif
+.endif
+
+# Pass the required flags to imake to tell it we're using gcc on Solaris.
+.if ${OPSYS} == "SunOS"
+IMAKEOPTS+= -DHasGcc2=YES -DHasGcc2ForCplusplus=YES
+.endif
+
+.if !empty(_USE_PKGSRC_GCC:M[yY][eE][sS])
+CC_VERSION!= if ${CC} -dumpversion > /dev/null 2>&1; then \
+ ${ECHO} "gcc-`${CC} -dumpversion`"; \
+ else \
+ ${ECHO} "gcc-${_GCC_REQD}"; \
+ fi
+.else
+CC_VERSION= ${_GCC_PKG}
+.endif
+
+.endif # COMPILER_GCC_MK