summaryrefslogtreecommitdiff
path: root/mk/tools
diff options
context:
space:
mode:
authorjlam <jlam@pkgsrc.org>2005-04-15 00:00:21 +0000
committerjlam <jlam@pkgsrc.org>2005-04-15 00:00:21 +0000
commit32d92202818b9e0728a9cc8a52a0d5ef205638e0 (patch)
tree1a36dbd7b7cfce8f711a1bb2e377c2d827c3c663 /mk/tools
parent8596ac419754becb5dffdc57d05347b4325f07e4 (diff)
downloadpkgsrc-32d92202818b9e0728a9cc8a52a0d5ef205638e0.tar.gz
Initial commit of the new tools framework. This is currently designed
to be a drop-in replacement for mk/tools.mk, but isn't yet enabled pending further testing. To use, edit bsd.pkg.mk to include bsd.tools.mk instead of tools.mk. The major changes from the old tools framework are: (1) The new interface to using the tools framework is through setting USE_TOOLS in the package Makefile, e.g., USE_TOOLS+= autoconf gmake yacc (2) Bison/yacc handling is improved. Instead of adding checks for /usr/bin/yacc to the package Makefile and explicitly setting YACC, e.g., security/mit-krb5/Makefile, simply add "yacc" to USE_TOOLS. If bison is explicitly required, then add "bison" to USE_TOOLS instead. (3) GNU auto* tools are handled differently. "autoconf", "aclocal", "automake", etc. will be tools in ${TOOLS_DIR} that point to the correct versions of the auto* tools. Instead of patching Makefiles or scripts to use ${AUTOCONF}, ${ACLOCAL}, etc., the correct versions of the tools will be called if they are invoked simply by their bare names. This is selected by adding either "autoconf" or "autoconf213", or "automake" or "automake14" to USE_TOOLS. The new tools framework will deprecate the following variables: ACLOCAL AUTORECONF AUTOCONF BUILD_USES_GETTEXT_M4 AUTOHEADER USE_GNU_TOOLS AUTOMAKE USE_TBL The new tools framework will deprecate the following *.mk files: mk/autoconf.mk mk/automake.mk mk/tools.mk Additional documentation on how to use bsd.tools.mk to create new tools under ${TOOLS_DIR} may be found in the header comments in bsd.tools.mk.
Diffstat (limited to 'mk/tools')
-rw-r--r--mk/tools/autoconf.mk184
-rw-r--r--mk/tools/automake.mk138
-rw-r--r--mk/tools/bsd.tools.mk182
-rw-r--r--mk/tools/make.mk11
-rw-r--r--mk/tools/replace.mk306
-rw-r--r--mk/tools/rpcgen.mk36
-rw-r--r--mk/tools/texinfo.mk22
7 files changed, 879 insertions, 0 deletions
diff --git a/mk/tools/autoconf.mk b/mk/tools/autoconf.mk
new file mode 100644
index 00000000000..f26f79f38d1
--- /dev/null
+++ b/mk/tools/autoconf.mk
@@ -0,0 +1,184 @@
+# $NetBSD: autoconf.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+#
+# This Makefile fragment handles packages that use GNU autoconf.
+#
+# By default, all of the autoconf-related scripts are marked as
+# "missing" by running the GNU missing script in place of the utility.
+# This hides the autoconf-related scripts from makefiles that aggressively
+# call them when some of the inputs are modified in ways the makefiles
+# don't expect.
+#
+# If a package needs to use GNU autoconf, then the package Makefile
+# should contain one of the following lines:
+#
+# USE_TOOLS+= autoconf # use recent GNU autoconf (>=2.50)
+# USE_TOOLS+= autoconf213 # use GNU autoconf ~2.13
+#
+# This will allow the package to invoke "autoconf", "autoreconf", etc.
+# by their usual, bare names.
+#
+# If a particular minimum version of autoconf is required, then the
+# package Makefile can additionally set AUTOCONF_REQD to the desired
+# version, e.g.:
+#
+# AUTOCONF_REQD= 2.54 # use at least autoconf>=2.54
+#
+# To globally prevent any GNU autoconf handling, set the following
+# in the package Makefile:
+#
+# AUTOMAKE_OVERRIDE= no
+#
+
+# Only allow one of "autoconf" and "autoconf213" in USE_TOOLS.
+.if !empty(USE_TOOLS:Mautoconf) && !empty(USE_TOOLS:Mautoconf213)
+PKG_FAIL_REASON+= "\`\`autoconf'' and \`\`autoconf213'' conflict in USE_TOOLS."
+.endif
+
+# This is an exhaustive list of all of the scripts supplied by GNU
+# autoconf.
+#
+_TOOLS_AUTOCONF= autoconf autoheader autom4te autoreconf \
+ autoscan autoupdate ifnames
+
+_TOOLS_AUTOCONF.autoconf= autoconf autoconf-2.13
+_TOOLS_AUTOCONF.autoheader= autoheader autoheader-2.13
+_TOOLS_AUTOCONF.autom4te= autom4te
+_TOOLS_AUTOCONF.autoreconf= autoreconf autoreconf-2.13
+_TOOLS_AUTOCONF.autoscan= autoscan autoscan-2.13
+_TOOLS_AUTOCONF.autoupdate= autoupdate autoupdate-2.13
+_TOOLS_AUTOCONF.ifnames= ifnames ifnames-2.13
+
+_TOOLS_AUTOCONF_LINKS= # empty
+
+.if !empty(USE_TOOLS:Mautoconf)
+AUTOCONF_REQD?= 2.50
+BUILD_DEPENDS+= autoconf>=${AUTOCONF_REQD}:../../devel/autoconf
+
+_TOOLS_AUTOCONF_LINKS+= autoconf
+TOOLS_CMD.autoconf= ${TOOLS_DIR}/bin/autoconf
+TOOLS_REAL_CMD.autoconf= ${LOCALBASE}/bin/autoconf
+
+_TOOLS_AUTOCONF_LINKS+= autoheader
+TOOLS_CMD.autoheader= ${TOOLS_DIR}/bin/autoheader
+TOOLS_REAL_CMD.autoheader= ${LOCALBASE}/bin/autoheader
+
+_TOOLS_AUTOCONF_LINKS+= autom4te
+TOOLS_CMD.autom4te= ${TOOLS_DIR}/bin/autom4te
+TOOLS_REAL_CMD.autom4te= ${LOCALBASE}/bin/autom4te
+
+_TOOLS_AUTOCONF_LINKS+= autoreconf
+TOOLS_CMD.autoreconf= ${TOOLS_DIR}/bin/autoreconf
+TOOLS_REAL_CMD.autoreconf= ${LOCALBASE}/bin/autoreconf
+
+_TOOLS_AUTOCONF_LINKS+= autoscan
+TOOLS_CMD.autoscan= ${TOOLS_DIR}/bin/autoscan
+TOOLS_REAL_CMD.autoscan= ${LOCALBASE}/bin/autoscan
+
+_TOOLS_AUTOCONF_LINKS+= autoupdate
+TOOLS_CMD.autoupdate= ${TOOLS_DIR}/bin/autoupdate
+TOOLS_REAL_CMD.autoupdate= ${LOCALBASE}/bin/autoupdate
+
+_TOOLS_AUTOCONF_LINKS+= ifnames
+TOOLS_CMD.ifnames= ${TOOLS_DIR}/bin/ifnames
+TOOLS_REAL_CMD.ifnames= ${LOCALBASE}/bin/ifnames
+
+# Continue to define the following variables until packages have been
+# taught to just use "autoconf", "autoheader", and "autoreconf" instead.
+#
+AUTOCONF= ${TOOLS_CMD.autoconf}
+AUTOHEADER= ${TOOLS_CMD.autoheader}
+AUTORECONF= ${TOOLS_CMD.autoreconf}
+.endif
+
+.if !empty(USE_TOOLS:Mautoconf213)
+AUTOCONF_REQD?= 2.13
+BUILD_DEPENDS+= autoconf213>=${AUTOCONF_REQD}:../../devel/autoconf213
+
+_TOOLS_AUTOCONF_LINKS+= autoconf
+TOOLS_CMD.autoconf= ${TOOLS_DIR}/bin/autoconf
+TOOLS_REAL_CMD.autoconf= ${LOCALBASE}/bin/autoconf-2.13
+
+_TOOLS_AUTOCONF_LINKS+= autoheader
+TOOLS_CMD.autoheader= ${TOOLS_DIR}/bin/autoheader
+TOOLS_REAL_CMD.autoheader= ${LOCALBASE}/bin/autoheader-2.13
+
+_TOOLS_AUTOCONF_LINKS+= autoreconf
+TOOLS_CMD.autoreconf= ${TOOLS_DIR}/bin/autoreconf
+TOOLS_REAL_CMD.autoreconf= ${LOCALBASE}/bin/autoreconf-2.13
+
+_TOOLS_AUTOCONF_LINKS+= autoscan
+TOOLS_CMD.autoscan= ${TOOLS_DIR}/bin/autoscan
+TOOLS_REAL_CMD.autoscan= ${LOCALBASE}/bin/autoscan-2.13
+
+_TOOLS_AUTOCONF_LINKS+= autoupdate
+TOOLS_CMD.autoupdate= ${TOOLS_DIR}/bin/autoupdate
+TOOLS_REAL_CMD.autoupdate= ${LOCALBASE}/bin/autoupdate-2.13
+
+_TOOLS_AUTOCONF_LINKS+= ifnames
+TOOLS_CMD.ifnames= ${TOOLS_DIR}/bin/ifnames
+TOOLS_REAL_CMD.ifnames= ${LOCALBASE}/bin/ifnames-2.13
+
+# Continue to define the following variables until packages have been
+# taught to just use "autoconf", "autoheader", and "autoreconf" instead.
+#
+AUTOCONF= ${TOOLS_CMD.autoconf}
+AUTOHEADER= ${TOOLS_CMD.autoheader}
+AUTORECONF= ${TOOLS_CMD.autoreconf}
+
+. if defined(USE_LIBTOOL)
+pre-configure: tools-libtool-m4-override
+. endif
+.endif
+
+# For every script that hasn't already been symlinked, we mark it as
+# "GNU missing".
+#
+AUTOMAKE_OVERRIDE?= yes
+.if !empty(AUTOMAKE_OVERRIDE:M[yY][eE][sS])
+TOOLS_SYMLINK+= ${_TOOLS_AUTOCONF_LINKS}
+. for _t_ in ${_TOOLS_AUTOCONF_LINKS}
+. for _s_ in ${_TOOLS_AUTOCONF.${_t_}}
+. if empty(TOOLS_REAL_CMD.${_t_}:M*/${_s_})
+TOOLS_GNU_MISSING+= ${_s_}
+. endif
+. endfor
+. endfor
+. for _t_ in ${_TOOLS_AUTOCONF}
+. if empty(_TOOLS_AUTOCONF_LINKS:M${_t_})
+. for _s_ in ${_TOOLS_AUTOCONF.${_t_}}
+TOOLS_GNU_MISSING+= ${_s_}
+. endfor
+. endif
+. endfor
+. undef _s_
+. undef _t_
+.endif
+
+# LIBTOOL_M4_OVERRIDE lists the locations where the libtool.m4 symlink
+# will be created. The libtool.m4 symlink is only created if a GNU
+# configure script exists at that location.
+#
+LIBTOOL_M4_OVERRIDE?= libtool.m4 */libtool.m4 */*/libtool.m4
+
+# Symlink the libtool-1.4.m4 file into any directory in which there's
+# a configure script under ${WRKSRC}. The symlink is called "libtool.m4",
+# which is the name expected by the autoconf tools. The symlinking
+# is only done if we need autoconf-2.13 and libtool. This allows
+# autoconf-2.13, autoreconf-2.13 and aclocal-2.13 to use the older
+# libtool.m4 file when regenerating files. This is okay, because we
+# later override the generated libtool file anyway.
+#
+.PHONY: tools-libtool-m4-override
+tools-libtool-m4-override:
+.for _pattern_ in ${LIBTOOL_M4_OVERRIDE}
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ cd ${WRKSRC}; \
+ for cfile in ${_pattern_:S/libtool.m4$/configure/}; do \
+ if ${TEST} -f "$$cfile"; then \
+ libtool_m4=`${DIRNAME} $$cfile`/libtool.m4; \
+ ${LN} -sf ${PKGSRCDIR}/mk/gnu-config/libtool-1.4.m4 \
+ $$libtool_m4; \
+ fi; \
+ done
+.endfor
+.undef _pattern_
diff --git a/mk/tools/automake.mk b/mk/tools/automake.mk
new file mode 100644
index 00000000000..2241806afa3
--- /dev/null
+++ b/mk/tools/automake.mk
@@ -0,0 +1,138 @@
+# $NetBSD: automake.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+#
+# This Makefile fragment handles packages that use GNU automake.
+#
+# By default, all of the automake-related scripts are marked as
+# "missing" by running the GNU missing script in place of the utility.
+# This hides the automake-related scripts from makefiles that aggressively
+# call them when some of the inputs are modified in ways the makefiles
+# don't expect.
+#
+# If a package needs to use GNU automake, then the package Makefile
+# should contain one of the following lines:
+#
+# USE_TOOLS+= automake # use recent GNU automake (>=1.9)
+# USE_TOOLS+= automake14 # use GNU automake ~1.4
+#
+# This will allow the package to invoke "aclocal" and "automake" by
+# their usual, bare names.
+#
+# If a particular minimum version of automake is required, then the
+# package Makefile can additionally set AUTOMAKE_REQD to the desired
+# version, e.g.:
+#
+# AUTOMAKE_REQD= 1.8 # use at least automake>=1.8
+#
+# If a package additionally needs to regenerate configure scripts and
+# Makefiles that use gettext, then the package Makefile should contain
+# the following line:
+#
+# USE_TOOLS+= gettext-m4 # need gettext.m4 to re-gen files
+#
+# To globally prevent any GNU automake handling, set the following
+# in the package Makefile:
+#
+# AUTOMAKE_OVERRIDE= no
+#
+
+# This variable is obsoleted, but continue to allow it until packages
+# have been taught to use the new syntax.
+#
+.if defined(BUILD_USES_GETTEXT_M4)
+USE_TOOLS+= gettext-m4
+.endif
+
+# Only allow one of "automake" and "automake14" in USE_TOOLS.
+.if !empty(USE_TOOLS:Mautomake) && !empty(USE_TOOLS:Mautomake14)
+PKG_FAIL_REASON+= "\`\`automake'' and \`\`automake14'' conflict in USE_TOOLS."
+.endif
+
+# This is an exhaustive list of all of the scripts supplied by GNU
+# automake.
+#
+_TOOLS_AUTOMAKE= aclocal automake
+
+_TOOLS_AUTOMAKE.aclocal= aclocal aclocal-1.4 \
+ aclocal-1.5 \
+ aclocal-1.6 \
+ aclocal-1.7 \
+ aclocal-1.8 \
+ aclocal-1.9
+_TOOLS_AUTOMAKE.automake= automake automake-1.4 \
+ automake-1.5 \
+ automake-1.6 \
+ automake-1.7 \
+ automake-1.8 \
+ automake-1.9
+
+_TOOLS_AUTOMAKE_LINKS= # empty
+
+.if !empty(USE_TOOLS:Mautomake)
+AUTOMAKE_REQD?= 1.9
+BUILD_DEPENDS+= automake>=${AUTOMAKE_REQD}:../../devel/automake
+USE_TOOLS+= autoconf
+AUTOCONF_REQD?= 2.58
+
+_TOOLS_AUTOMAKE_LINKS+= aclocal
+TOOLS_CMD.aclocal= ${TOOLS_DIR}/bin/aclocal
+TOOLS_REAL_CMD.aclocal= ${LOCALBASE}/bin/aclocal
+
+_TOOLS_AUTOMAKE_LINKS+= automake
+TOOLS_CMD.automake= ${TOOLS_DIR}/bin/automake
+TOOLS_REAL_CMD.automake= ${LOCALBASE}/bin/automake
+
+# Continue to define the following variables until packages have been
+# taught to just use "aclocal" and "automake" instead.
+#
+ACLOCAL= ${TOOLS_CMD.aclocal}
+AUTOMAKE= ${TOOLS_CMD.automake}
+.endif
+
+.if !empty(USE_TOOLS:Mautomake14)
+AUTOMAKE_REQD?= 1.4
+BUILD_DEPENDS+= automake14>=${AUTOMAKE_REQD}:../../devel/automake14
+USE_TOOLS+= autoconf213
+AUTOCONF_REQD?= 2.13
+
+_TOOLS_AUTOMAKE_LINKS+= aclocal
+TOOLS_CMD.aclocal= ${TOOLS_DIR}/bin/aclocal
+TOOLS_REAL_CMD.aclocal= ${LOCALBASE}/bin/aclocal-1.4
+
+_TOOLS_AUTOMAKE_LINKS+= automake
+TOOLS_CMD.automake= ${TOOLS_DIR}/bin/automake
+TOOLS_REAL_CMD.automake= ${LOCALBASE}/bin/automake-1.4
+
+# Continue to define the following variables until packages have been
+# taught to just use "aclocal" and "automake" instead.
+#
+ACLOCAL= ${TOOLS_CMD.aclocal}
+AUTOMAKE= ${TOOLS_CMD.automake}
+.endif
+
+# For every script that hasn't already been symlinked, we mark it as
+# "GNU missing".
+#
+AUTOMAKE_OVERRIDE?= yes
+.if !empty(AUTOMAKE_OVERRIDE:M[yY][eE][sS])
+TOOLS_SYMLINK+= ${_TOOLS_AUTOMAKE_LINKS}
+. for _t_ in ${_TOOLS_AUTOMAKE_LINKS}
+. for _s_ in ${_TOOLS_AUTOMAKE.${_t_}}
+. if empty(TOOLS_REAL_CMD.${_t_}:M*/${_s_})
+TOOLS_GNU_MISSING+= ${_s_}
+. endif
+. endfor
+. endfor
+. for _t_ in ${_TOOLS_AUTOMAKE}
+. if empty(_TOOLS_AUTOMAKE_LINKS:M${_t_})
+. for _s_ in ${_TOOLS_AUTOMAKE.${_t_}}
+TOOLS_GNU_MISSING+= ${_s_}
+. endfor
+. endif
+. endfor
+. undef _s_
+. undef _t_
+.endif
+
+.if !empty(USE_TOOLS:Mgettext-m4)
+BUILD_DEPENDS+= {gettext-0.10.35nb1,gettext-m4-[0-9]*}:../../devel/gettext-m4
+.endif
diff --git a/mk/tools/bsd.tools.mk b/mk/tools/bsd.tools.mk
new file mode 100644
index 00000000000..a3b976d3124
--- /dev/null
+++ b/mk/tools/bsd.tools.mk
@@ -0,0 +1,182 @@
+# $NetBSD: bsd.tools.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+#
+# This Makefile fragment creates tools under ${TOOLS_DIR} that are
+# found before similarly-named tools in the system path.
+#
+# There are two ways to generate the tool: either create a wrapper script
+# or create a symlink:
+#
+# TOOLS_WRAP is a whitespace-separated list of tools for which a
+# wrapper script is created.
+#
+# TOOLS_SYMLINK is a whitespace-separated list of tools for which a
+# symlink is created.
+#
+# The following variables specify the details of each <tool>:
+#
+# TOOLS_CMD.<tool> is the path to the tool under ${TOOLS_DIR}
+#
+# TOOLS_REAL_CMD.<tool> is the path to the actual command that is
+# invoked when ${TOOLS_CMD.<tool>} is called.
+#
+# If TOOLS_REAL_CMD.<tool> isn't provided, then we search for the a tool
+# with the name "<tool>" in ${TOOLS_EXECDIRS.<tool>}, which defaults to
+# ${TOOLS_EXECDIRS} == "/bin /sbin /usr/bin /usr/sbin".
+#
+# The following variables specify further details of each <tool> and
+# are used only by tools listed in TOOLS_WRAP:
+#
+# TOOLS_ARGS.<tool> additional arguments that are passed to the real
+# command ahead of any command-line arguments.
+#
+# TOOLS_REAL_CMDLINE.<tool> specifies the full command-line to invoke
+# in the wrapper script when <tool> is called. By default, this
+# is built up from TOOLS_REAL_CMD.<tool> and TOOLS_ARGS.<tool>.
+#
+# The following variables provide shortcuts for creating certain classes
+# of tools:
+#
+# TOOLS_NOOP is a list of tools that do nothing and return true.
+#
+# TOOLS_BROKEN is a list of tools that do nothing and return false.
+#
+# TOOLS_GNU_MISSING is a list of tools for which the GNU missing
+# script is invoked in place of the real tool. This is used
+# primarily to hide GNU auto* tools.
+#
+
+.if !defined(BSD_TOOLS_MK)
+BSD_TOOLS_MK= defined
+
+.include "../../mk/bsd.prefs.mk"
+
+# Prepend ${TOOLS_DIR}/bin to the PATH so that our scripts are found
+# first when searching for executables.
+#
+TOOLS_DIR= ${WRKDIR}/.tools
+PREPEND_PATH+= ${TOOLS_DIR}/bin
+TOOLS_EXECDIRS= /bin /sbin /usr/bin /usr/sbin
+
+TOOLS_SHELL?= ${SH}
+_TOOLS_WRAP_LOG= ${WRKLOG}
+
+.PHONY: do-tools override-tools
+do-tools: override-tools
+override-tools: .OPTIONAL
+
+USE_TOOLS?= # empty
+
+.include "../../mk/tools/automake.mk"
+.include "../../mk/tools/autoconf.mk"
+.include "../../mk/tools/texinfo.mk"
+.include "../../mk/tools/rpcgen.mk"
+.include "../../mk/tools/replace.mk"
+.include "../../mk/tools/make.mk"
+
+######################################################################
+
+.for _t_ in ${TOOLS_NOOP}
+TOOLS_WRAP+= ${_t_}
+TOOLS_CMD.${_t_}?= ${TOOLS_DIR}/bin/${_t_}
+TOOLS_REAL_CMDLINE.${_t_}?= exit 0
+.endfor
+.undef _t_
+
+.for _t_ in ${TOOLS_BROKEN}
+TOOLS_WRAP+= ${_t_}
+TOOLS_CMD.${_t_}?= ${TOOLS_DIR}/bin/${_t_}
+TOOLS_REAL_CMDLINE.${_t_}?= exit 1
+.endfor
+.undef _t_
+
+.for _t_ in ${TOOLS_GNU_MISSING}
+TOOLS_WRAP+= ${_t_}
+TOOLS_REAL_CMD.${_t_}?= ${PKGSRCDIR}/mk/gnu-config/missing
+TOOLS_REAL_CMDLINE.${_t_}?= ${TOOLS_REAL_CMD.${_t_}} ${_t_:T:C/-[0-9].*$//}
+.endfor
+.undef _t_
+
+######################################################################
+
+# If TOOLS_REAL_CMD.<tool> isn't defined, then search the directories
+# listed in TOOLS_EXECDIRS.<tool> for something called <tool>. The
+# default wrapper script will invoke the real command, followed by
+# any arguments specified in TOOLS_ARGS.*, followed by any command-line
+# arguments passed to the wrapper script.
+#
+.for _t_ in ${TOOLS_WRAP}
+. if !defined(TOOLS_REAL_CMD.${_t_})
+TOOLS_EXECDIRS.${_t_}?= ${TOOLS_EXECDIRS}
+. for _d_ in ${TOOLS_EXECDIRS.${_t_}}
+. if exists(${_d_}/${_t_})
+TOOLS_REAL_CMD.${_t_}?= ${_d_}/${_t_}
+. endif
+. endfor
+. undef _d_
+TOOLS_REAL_CMD.${_t_}?= ${FALSE}
+. endif
+TOOLS_ARGS.${_t_}?= # empty
+TOOLS_REAL_CMDLINE.${_t_}?= ${TOOLS_REAL_CMD.${_t_}} ${TOOLS_ARGS.${_t_}} "$$@"
+TOOLS_CMD.${_t_}?= ${TOOLS_DIR}/bin/${_t_}
+
+# Small optimization: exec the command if it points to a real command
+# (specified by a full path).
+#
+. if !empty(TOOLS_REAL_CMDLINE.${_t_}:C/^/_asdf_/1:M_asdf_/*)
+_TOOLS_EXEC.${_t_}= exec
+. else
+_TOOLS_EXEC.${_t_}= # empty
+. endif
+
+. if !empty(TOOLS_CMD.${_t_}:M${TOOLS_DIR}/*) && \
+ !target(${TOOLS_CMD.${_t_}})
+override-tools: ${TOOLS_CMD.${_t_}}
+${TOOLS_CMD.${_t_}}:
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ ( ${ECHO} '#!'${TOOLS_SHELL:Q}; \
+ ${ECHO} 'wrapperlog="$${TOOLS_WRAPPER_LOG-'${_TOOLS_WRAP_LOG:Q}'}"'; \
+ ${ECHO} '${ECHO} "[*] '${TOOLS_CMD.${_t_}:Q}' $$*" >> $$wrapperlog'; \
+ ${ECHO} '${ECHO} "<.> '${TOOLS_REAL_CMDLINE.${_t_}:Q}'" >> $$wrapperlog'; \
+ ${ECHO} ${_TOOLS_EXEC.${_t_}:Q} ${TOOLS_REAL_CMDLINE.${_t_}:Q}; \
+ ) > ${.TARGET}
+ ${_PKG_SILENT}${_PKG_DEBUG}${CHMOD} +x ${.TARGET}
+. endif
+.endfor
+.undef _t_
+
+######################################################################
+
+# If TOOLS_REAL_CMD.<tool> isn't defined, then search the directories
+# listed in TOOLS_EXECDIRS.<tool> for something called <tool>. By
+# default, the symlinked tool in ${TOOLS_DIR} will have the same name as
+# the real command.
+#
+.for _t_ in ${TOOLS_SYMLINK}
+. if !defined(TOOLS_REAL_CMD.${_t_})
+TOOLS_EXECDIRS.${_t_}?= ${TOOLS_EXECDIRS}
+. for _d_ in ${TOOLS_EXECDIRS.${_t_}}
+. if exists(${_d_}/${_t_})
+TOOLS_REAL_CMD.${_t_}?= ${_d_}/${_t_}
+. endif
+. endfor
+. undef _d_
+TOOLS_REAL_CMD.${_t_}?= ${FALSE}
+. endif
+TOOLS_CMD.${_t_}?= \
+ ${TOOLS_REAL_CMD.${_t_}:C/.*\/${TOOLS_REAL_CMD.${_t_}:H:T}\//${TOOLS_DIR}\/${TOOLS_REAL_CMD.${_t_}:H:T}\//}
+
+. if !empty(TOOLS_CMD.${_t_}:M${TOOLS_DIR}/*) && \
+ !target(${TOOLS_CMD.${_t_}}) && exists(${TOOLS_REAL_CMD.${_t_}})
+override-tools: ${TOOLS_CMD.${_t_}}
+${TOOLS_CMD.${_t_}}: ${TOOLS_REAL_CMD.${_t_}}
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ if ${TEST} -x "${TOOLS_REAL_CMD.${_t_}}"; then \
+ ${MKDIR} ${.TARGET:H}; \
+ ${LN} -sf ${TOOLS_REAL_CMD.${_t_}} ${.TARGET}; \
+ fi
+. endif
+.endfor
+.undef _t_
+
+.endif # BSD_TOOLS_MK
diff --git a/mk/tools/make.mk b/mk/tools/make.mk
new file mode 100644
index 00000000000..1cd3a4a9792
--- /dev/null
+++ b/mk/tools/make.mk
@@ -0,0 +1,11 @@
+# $NetBSD: make.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+
+# Always provide a symlink from ${TOOLS_DIR}/bin/make to the "make"
+# used to build the package. This lets a bare "make" invoke the
+# correct program if called from within a makefile or script.
+#
+TOOLS_SYMLINK+= make
+TOOLS_CMD.make= ${TOOLS_DIR}/bin/make
+.if !empty(MAKE_PROGRAM:M/*)
+TOOLS_REAL_CMD.make= ${MAKE_PROGRAM}
+.endif
diff --git a/mk/tools/replace.mk b/mk/tools/replace.mk
new file mode 100644
index 00000000000..feafbc5cd3e
--- /dev/null
+++ b/mk/tools/replace.mk
@@ -0,0 +1,306 @@
+# $NetBSD: replace.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+#
+# This Makefile fragment handles "replacements" of system-supplied tools
+# with pkgsrc versions. The replacements are placed under ${TOOLS_DIR}
+# so that they appear earlier in the search path when invoked using the
+# bare name of the tool.
+#
+# The tools that could be replaced with pkgsrc counterparts (usually
+# GNU versions of the tools) should be listed in each package Makefile
+# as:
+#
+# USE_TOOLS+= awk gmake lex
+#
+# If a package requires yacc to generate a parser, then the package
+# Makefile should contain one of the following two lines:
+#
+# USE_TOOLS+= yacc # any yacc will do
+# USE_TOOLS+= bison # requires bison-specific features
+#
+# Adding either "yacc" or "bison" to USE_TOOLS will cause a "yacc" tool
+# to be generated that may be used as a yacc-replacement.
+#
+
+# Continue to allow USE_GNU_TOOLS and USE_TBL until packages have been
+# taught to use the new syntax.
+#
+.for _t_ in ${USE_GNU_TOOLS}
+. if "${_t_}" == "make"
+USE_TOOLS+= gmake
+. else
+USE_TOOLS+= ${_t_}
+. endif
+.endfor
+.if defined(USE_TBL) && !empty(USE_TBL:M[yY][eE][sS])
+USE_TOOLS+= tbl
+.endif
+
+.if defined(USE_PERL5)
+USE_TOOLS+= perl
+.endif
+
+# Only allow one of "bison" and "yacc".
+.if !empty(USE_TOOLS:Mbison) && !empty(USE_TOOLS:Myacc)
+PKG_FAIL_REASON+= "\`\`bison'' and \`\`yacc'' conflict in USE_TOOLS."
+.endif
+
+# This is an exhaustive list of tools for which we have pkgsrc
+# replacements.
+#
+_TOOLS_REPLACE_LIST= awk bison gmake grep lex m4 patch perl sed tbl yacc
+
+# TOOL variable names associated with each of the tools
+_TOOLS_VARNAME.awk= AWK
+_TOOLS_VARNAME.bison= YACC
+_TOOLS_VARNAME.gmake= GMAKE
+_TOOLS_VARNAME.grep= GREP
+_TOOLS_VARNAME.lex= LEX
+_TOOLS_VARNAME.m4= M4
+_TOOLS_VARNAME.patch= PATCH
+_TOOLS_VARNAME.perl= PERL5
+_TOOLS_VARNAME.sed= SED
+_TOOLS_VARNAME.tbl= TBL
+_TOOLS_VARNAME.yacc= YACC
+
+######################################################################
+
+# For each tool, _TOOLS_USE_PLATFORM.<tool> is a list of platforms for
+# which we will use the system-supplied tool instead of the pkgsrc
+# version.
+#
+# This table should probably be split amongst the various mk/platform
+# files as they are ${OPSYS}-specific.
+#
+_TOOLS_USE_PLATFORM.awk= FreeBSD-*-* Linux-*-* OpenBSD-*-* \
+ NetBSD-1.[0-6]*-* DragonFly-*-* \
+ SunOS-*-* Interix-*-*
+_TOOLS_USE_PLATFORM.bison= Linux-*-*
+_TOOLS_USE_PLATFORM.gmake= Darwin-*-*
+_TOOLS_USE_PLATFORM.grep= Darwin-*-* FreeBSD-*-* Linux-*-* \
+ NetBSD-*-* OpenBSD-*-* DragonFly-*-* \
+ SunOS-*-*
+_TOOLS_USE_PLATFORM.lex= FreeBSD-*-* Linux-*-* NetBSD-*-* \
+ OpenBSD-*-* DragonFly-*-*
+_TOOLS_USE_PLATFORM.m4= # empty
+_TOOLS_USE_PLATFORM.patch= Darwin-*-* FreeBSD-*-* Linux-*-* \
+ NetBSD-*-* OpenBSD-*-* DragonFly-*-* \
+ SunOS-*-*
+_TOOLS_USE_PLATFORM.perl= # This should always be empty.
+_TOOLS_USE_PLATFORM.sed= FreeBSD-*-* Linux-*-* NetBSD-*-* \
+ DragonFly-*-* SunOS-*-* Interix-*-*
+_TOOLS_USE_PLATFORM.tbl= FreeBSD-*-* NetBSD-*-* OpenBSD-*-* \
+ DragonFly-*-*
+_TOOLS_USE_PLATFORM.yacc= FreeBSD-*-* NetBSD-*-* OpenBSD-*-* \
+ DragonFly-*-*
+
+######################################################################
+
+# _TOOLS_USE_PKGSRC.<prog> is "yes" or "no" depending on whether we're
+# using a pkgsrc-supplied tool to replace the system-supplied one.
+#
+# This currently uses ${OPSYS}-based checking and ignores the scenario
+# where your kernel and userland aren't in sync. This should be turned
+# into a bunch of feature tests in the future.
+#
+.for _t_ in ${_TOOLS_REPLACE_LIST}
+. for _pattern_ in ${_TOOLS_USE_PLATFORM.${_t_}}
+. if !empty(MACHINE_PLATFORM:M${_pattern_})
+_TOOLS_USE_PKGSRC.${_t_}?= no
+. endif
+. endfor
+. undef _pattern_
+_TOOLS_USE_PKGSRC.${_t_}?= yes
+.endfor
+.undef _t_
+
+######################################################################
+
+# For each of the blocks below, we create either symlinks or wrappers
+# for each of the tools requested. We need to be careful that we don't
+# get into dependency loops; do this by setting and checking the value
+# of TOOLS_IGNORE.<tool>. If we're using the system-supplied tool, we
+# defer the setting of TOOLS_REAL_CMD.<tool> until the loop at the end.
+#
+.if !defined(TOOLS_IGNORE.awk) && !empty(USE_TOOLS:Mawk)
+. if !empty(PKGPATH:Mlang/gawk)
+MAKEFLAGS+= TOOLS_IGNORE.awk=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.awk:M[yY][eE][sS])
+BUILD_DEPENDS+= gawk>=3.1.1:../../lang/gawk
+TOOLS_REAL_CMD.awk= ${LOCALBASE}/bin/${GNU_PROGRAM_PREFIX}awk
+${_TOOLS_VARNAME.awk}= ${TOOLS_REAL_CMD.awk}
+. endif
+TOOLS_SYMLINK+= awk
+TOOLS_CMD.awk= ${TOOLS_DIR}/bin/awk
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.bison) && !empty(USE_TOOLS:Mbison)
+. if !empty(PKGPATH:Mdevel/bison)
+MAKEFLAGS+= TOOLS_IGNORE.bison=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.bison:M[yY][eE][sS])
+BUILD_DEPENDS+= bison>=1.0:../../devel/bison
+TOOLS_REAL_CMD.bison= ${LOCALBASE}/bin/bison
+. endif
+TOOLS_WRAP+= bison
+TOOLS_CMD.bison= ${TOOLS_DIR}/bin/yacc
+TOOLS_ARGS.bison= -y
+${_TOOLS_VARNAME.bison}= ${TOOLS_REAL_CMD.bison} ${TOOLS_ARGS.bison}
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.gmake) && !empty(USE_TOOLS:Mgmake)
+. if !empty(PKGPATH:Mdevel/gmake)
+MAKEFLAGS+= TOOLS_IGNORE.gmake=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.gmake:M[yY][eE][sS])
+BUILD_DEPENDS+= gmake>=3.78:../../devel/gmake
+TOOLS_REAL_CMD.gmake= ${LOCALBASE}/bin/gmake
+${_TOOLS_VARNAME.gmake}= ${TOOLS_REAL_CMD.gmake}
+. endif
+TOOLS_SYMLINK+= gmake
+TOOLS_CMD.gmake= ${TOOLS_DIR}/bin/gmake
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.grep) && !empty(USE_TOOLS:Mgrep)
+. if !empty(PKGPATH:Mtextproc/grep)
+MAKEFLAGS+= TOOLS_IGNORE.grep=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.grep:M[yY][eE][sS])
+BUILD_DEPENDS+= grep>=2.5.1:../../textproc/grep
+TOOLS_REAL_CMD.grep= ${LOCALBASE}/bin/${GNU_PROGRAM_PREFIX}grep
+${_TOOLS_VARNAME.grep}= ${TOOLS_REAL_CMD.grep}
+. endif
+TOOLS_SYMLINK+= grep
+TOOLS_CMD.grep= ${TOOLS_DIR}/bin/grep
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.lex) && !empty(USE_TOOLS:Mlex)
+. if !empty(PKGPATH:Mdevel/flex)
+MAKEFLAGS+= TOOLS_IGNORE.lex=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.lex:M[yY][eE][sS])
+. include "../../devel/flex/buildlink3.mk"
+TOOLS_REAL_CMD.lex= ${LOCALBASE}/bin/flex
+${_TOOLS_VARNAME.lex}= ${TOOLS_REAL_CMD.lex}
+. endif
+TOOLS_SYMLINK+= lex
+TOOLS_CMD.lex= ${TOOLS_DIR}/bin/lex
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.m4) && !empty(USE_TOOLS:Mm4)
+. if !empty(PKGPATH:Mdevel/m4)
+MAKEFLAGS+= TOOLS_IGNORE.m4=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.m4:M[yY][eE][sS])
+BUILD_DEPENDS+= m4>=1.4:../../devel/m4
+TOOLS_REAL_CMD.m4= ${LOCALBASE}/bin/gm4
+${_TOOLS_VARNAME.m4}= ${TOOLS_REAL_CMD.m4}
+. endif
+TOOLS_SYMLINK+= m4
+TOOLS_CMD.m4= ${TOOLS_DIR}/bin/m4
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.patch) && !empty(USE_TOOLS:Mpatch)
+. if !empty(PKGPATH:Mdevel/patch)
+MAKEFLAGS+= TOOLS_IGNORE.patch=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.patch:M[yY][eE][sS])
+BUILD_DEPENDS+= patch>=2.2:../../devel/patch
+TOOLS_REAL_CMD.patch= ${LOCALBASE}/bin/gpatch
+${_TOOLS_VARNAME.patch}= ${TOOLS_REAL_CMD.patch}
+. endif
+TOOLS_SYMLINK+= patch
+TOOLS_CMD.patch= ${TOOLS_DIR}/bin/patch
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.perl) && !empty(USE_TOOLS:Mperl)
+. if !empty(PKGPATH:Mlang/perl5)
+MAKEFLAGS+= TOOLS_IGNORE.perl=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.perl:M[yY][eE][sS])
+. include "../../lang/perl5/buildlink3.mk"
+TOOLS_REAL_CMD.perl= ${LOCALBASE}/bin/perl
+${_TOOLS_VARNAME.perl}= ${TOOLS_REAL_CMD.perl}
+. endif
+TOOLS_SYMLINK+= perl
+TOOLS_CMD.perl= ${TOOLS_DIR}/bin/perl
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.sed) && !empty(USE_TOOLS:Msed)
+. if !empty(PKGPATH:Mtextproc/sed)
+MAKEFLAGS+= TOOLS_IGNORE.sed=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.sed:M[yY][eE][sS])
+BUILD_DEPENDS+= gsed>=3.0.2:../../textproc/gsed
+TOOLS_REAL_CMD.sed= ${LOCALBASE}/bin/${GNU_PROGRAM_PREFIX}sed
+${_TOOLS_VARNAME.sed}= ${TOOLS_REAL_CMD.sed}
+. endif
+TOOLS_SYMLINK+= sed
+TOOLS_CMD.sed= ${TOOLS_DIR}/bin/sed
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.tbl) && !empty(USE_TOOLS:Mtbl)
+. if !empty(PKGPATH:Mtextproc/groff)
+MAKEFLAGS+= TOOLS_IGNORE.tbl=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.tbl:M[yY][eE][sS])
+BUILD_DEPENDS+= groff>=1.19nb4:../../textproc/groff
+TOOLS_REAL_CMD.tbl= ${LOCALBASE}/bin/tbl
+${_TOOLS_VARNAME.tbl}= ${TOOLS_REAL_CMD.tbl}
+. endif
+TOOLS_SYMLINK+= tbl
+TOOLS_CMD.tbl= ${TOOLS_DIR}/bin/tbl
+. endif
+.endif
+
+.if !defined(TOOLS_IGNORE.yacc) && !empty(USE_TOOLS:Myacc)
+. if !empty(PKGPATH:Mdevel/bison)
+MAKEFLAGS+= TOOLS_IGNORE.yacc=
+. else
+. if !empty(_TOOLS_USE_PKGSRC.yacc:M[yY][eE][sS])
+BUILD_DEPENDS+= bison>=1.0:../../devel/bison
+TOOLS_REAL_CMD.yacc= ${LOCALBASE}/bin/bison
+TOOLS_ARGS.yacc= -y
+${_TOOLS_VARNAME.yacc}= ${TOOLS_REAL_CMD.yacc} ${TOOLS_ARGS.yacc}
+TOOLS_WRAP+= yacc
+. else
+TOOLS_SYMLINK+= yacc
+. endif
+TOOLS_CMD.yacc= ${TOOLS_DIR}/bin/yacc
+. endif
+.endif
+
+######################################################################
+
+# Set TOOLS_REAL_CMD.<tool> appropriately in the case where we are
+# using the system-supplied tool. Here, we check to see if TOOL is
+# defined. If it is, then use that as the path to the real command.
+# Otherwise, set TOOL to be TOOLS_REAL_CMD.<tool>, which we defer
+# until TOOLS_{WRAP,SYMLINK} is processed within bsd.tools.mk.
+#
+# Also, set the TOOL name for each tool to point to the real command
+# in the event that it's not predefined, e.g. TBL, YACC.
+#
+.for _t_ in ${_TOOLS_REPLACE_LIST}
+. if !defined(TOOLS_IGNORE.${_t_}) && !empty(USE_TOOLS:M${_t_}) && \
+ !empty(_TOOLS_USE_PKGSRC.${_t_}:M[nN][oO])
+. if defined(${_TOOLS_VARNAME.${_t_}})
+. if !empty(${_TOOLS_VARNAME.${_t_}}:M/*)
+TOOLS_REAL_CMD.${_t_}?= \
+ ${${_TOOLS_VARNAME.${_t_}}:C/^/_asdf_/1:M_asdf_*:S/^_asdf_//}
+. endif
+. else
+${_TOOLS_VARNAME.${_t_}}= ${TOOLS_REAL_CMD.${_t_}}
+. endif
+. endif
+.endfor
+.undef _t_
diff --git a/mk/tools/rpcgen.mk b/mk/tools/rpcgen.mk
new file mode 100644
index 00000000000..37228484d2e
--- /dev/null
+++ b/mk/tools/rpcgen.mk
@@ -0,0 +1,36 @@
+# $NetBSD: rpcgen.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+
+# Create an rpcgen script that correctly sets the CPP environment
+# variable to a stat(2)able path to a C preprocessor, then invokes
+# the real rpcgen.
+#
+.if !defined(TOOLS_REAL_CMD.rpcgen)
+TOOLS_EXECDIRS.rpcgen?= ${TOOLS_EXECDIRS}
+. for _d_ in ${TOOLS_EXECDIRS.rpcgen}
+. if exists(${_d_}/rpcgen)
+TOOLS_REAL_CMD.rpcgen?= ${_d_}/rpcgen
+. endif
+. endfor
+. undef _d_
+TOOLS_REAL_CMD.rpcgen?= ${FALSE}
+.endif
+TOOLS_CMD.rpcgen= ${TOOLS_DIR}/bin/rpcgen
+.if ${OPSYS} == "NetBSD"
+TOOLS_ARGS.rpcgen?= -b
+.endif
+RPCGEN?= rpcgen
+
+.if !target(${TOOLS_CMD.rpcgen})
+override-tools: ${TOOLS_CMD.rpcgen}
+${TOOLS_CMD.rpcgen}:
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ ( ${ECHO} '#!'${TOOLS_SHELL:Q}; \
+ ${ECHO} 'wrapperlog="$${TOOLS_WRAPPER_LOG-'${_TOOLS_WRAP_LOG:Q}'}"'; \
+ ${ECHO} 'CPP='${WRAPPER_BINDIR:Q}'/cpp"; export CPP'; \
+ ${ECHO} '${ECHO} "[*] '${TOOLS_CMD.rpcgen:Q}' $$*" >> $$wrapperlog'; \
+ ${ECHO} '${ECHO} "<.> '${TOOLS_REAL_CMD.rpcgen:Q} ${TOOLS_ARGS.rpcgen:Q}' $$*" >> $$wrapperlog'; \
+ ${ECHO} ${TOOLS_REAL_CMD.rpcgen:Q} ${TOOLS_ARGS.rpcgen:Q} '"$$@"'; \
+ ) > ${.TARGET}
+ ${_PKG_SILENT}${_PKG_DEBUG}${CHMOD} +x ${.TARGET}
+.endif
diff --git a/mk/tools/texinfo.mk b/mk/tools/texinfo.mk
new file mode 100644
index 00000000000..0b7e693c008
--- /dev/null
+++ b/mk/tools/texinfo.mk
@@ -0,0 +1,22 @@
+# $NetBSD: texinfo.mk,v 1.1 2005/04/15 00:00:21 jlam Exp $
+
+# Create an install-info script that is a "no operation" command, as
+# registration of info files is handled by the INSTALL script.
+#
+TOOLS_NOOP+= install-info
+CONFIGURE_ENV+= INSTALL_INFO=${TOOLS_CMD.install-info:Q}
+MAKE_ENV+= INSTALL_INFO=${TOOLS_CMD.install-info:Q}
+
+# Create a makeinfo script that will invoke the right makeinfo command
+# if USE_MAKEINFO is "yes" or will exit on error if not. MAKEINFO is
+# defined by mk/texinfo.mk if USE_MAKEINFO is "yes".
+#
+USE_MAKEINFO?= no
+.if empty(USE_MAKEINFO:M[nN][oO])
+TOOLS_SYMLINK+= makeinfo
+TOOLS_REAL_CMD.makeinfo= ${MAKEINFO}
+.else
+TOOLS_BROKEN+= makeinfo
+.endif
+CONFIGURE_ENV+= MAKEINFO=${TOOLS_CMD.makeinfo:Q}
+MAKE_ENV+= MAKEINFO=${TOOLS_CMD.makeinfo:Q}