summaryrefslogtreecommitdiff
path: root/mk/buildlink2
diff options
context:
space:
mode:
authorjlam <jlam@pkgsrc.org>2002-08-22 08:21:26 +0000
committerjlam <jlam@pkgsrc.org>2002-08-22 08:21:26 +0000
commitb119dbc8efa99f4f13917497dfc754c8c6198d85 (patch)
tree69a889ca0e05738ba516fadb4850a77ad43da185 /mk/buildlink2
parentf53ae645aa36bf9dbeb34fce513f5a6eb2a37fd2 (diff)
downloadpkgsrc-b119dbc8efa99f4f13917497dfc754c8c6198d85.tar.gz
Merge pkgsrc/mk from the buildlink2 branch back into the main trunk.
Diffstat (limited to 'mk/buildlink2')
-rw-r--r--mk/buildlink2/README38
-rw-r--r--mk/buildlink2/bsd.buildlink2.mk611
-rw-r--r--mk/buildlink2/buildlink2.txt91
-rw-r--r--mk/buildlink2/libtool-fix-la100
-rw-r--r--mk/buildlink2/libtool.sh80
-rw-r--r--mk/buildlink2/post-cache61
-rw-r--r--mk/buildlink2/pre-cache7
-rw-r--r--mk/buildlink2/wrapper.sh29
8 files changed, 1017 insertions, 0 deletions
diff --git a/mk/buildlink2/README b/mk/buildlink2/README
new file mode 100644
index 00000000000..732c1ce599e
--- /dev/null
+++ b/mk/buildlink2/README
@@ -0,0 +1,38 @@
+$NetBSD: README,v 1.2 2002/08/22 08:21:28 jlam Exp $
+
+ 0 buildlink2 Wrapper Script System
+ ==================================
+
+The purpose of the buildlink2 wrapper script system is to replace calls to
+compiler tool with scripts that tranlate any arguments into their buildlink
+equivalents, then invoke the actual compiler tools with the translated
+arguments. The pkgsrc/mk/buildlink2 directory contains bits of the wrapper
+script system for the buildlink2 framework. The wrapper script system is
+composed of three parts: the main wrapper script, the "cache", and the
+"logic" script generated from the cache.
+
+ 0.1 Main wrapper script
+ =======================
+
+The main wrapper script for a compiler tool (cc, ld, as, etc.) is
+generated from wrapper.sh, except for the libtool wrapper script which is
+generated from libtool.sh. The wrapper scripts share a common set of logic
+files that translate arguments into their buildlink equivalents.
+
+ 0.2 Cache
+ =========
+
+The cache contains a series of lines that may be directly used as the
+contents of a Bourne shell "case" statement. They contain only arguments
+that have already been seen and their buildlink equivalents.
+
+ 0.3 Logic script
+ ================
+
+The logic script contains a large "case" statement that handles the
+translation of an argument into its buildlink equivalent. It is generated
+from three files: the pre-cache, cache, and post-cache files. The cache is
+described above. The pre- and post-cache files simply complete the "case"
+statement. The post-cache also contains the final case that performs the
+actual argument translation and, as an optimization, saves the result into
+the cache.
diff --git a/mk/buildlink2/bsd.buildlink2.mk b/mk/buildlink2/bsd.buildlink2.mk
new file mode 100644
index 00000000000..03c71bb5dcb
--- /dev/null
+++ b/mk/buildlink2/bsd.buildlink2.mk
@@ -0,0 +1,611 @@
+# $NetBSD: bsd.buildlink2.mk,v 1.2 2002/08/22 08:21:28 jlam Exp $
+#
+# An example package buildlink2.mk file:
+#
+# -------------8<-------------8<-------------8<-------------8<-------------
+# BUILDLINK_PACKAGES+= foo
+# BUILDLINK_DEPENDS.foo?= foo>=1.0
+# BUILDLINK_PKGSRCDIR.foo?= ../../category/foo
+#
+# EVAL_PREFIX+= BUILDLINK_PREFIX.foo=foo
+# BUILDLINK_PREFIX.foo_DEFAULT= ${LOCALBASE}
+# BUILDLINK_FILES.foo= include/foo.h
+# BUILDLINK_FILES.foo+= include/bar.h
+# BUILDLINK_FILES.foo+= lib/libfoo.*
+#
+# # We need "libbar.*" to look like "libfoo.*".
+# BUILDLINK_TRANSFORM+= l:bar:foo
+#
+# BUILDLINK_TARGETS+= foo-buildlink
+#
+# foo-buildlink: _BUILDLINK_USE
+# -------------8<-------------8<-------------8<-------------8<-------------
+#
+# The different variables that may be set in a buildlink2.mk file are
+# described below.
+#
+# The variable name convention used in this Makefile are:
+#
+# BUILDLINK_* public buildlink-related variables usable in other Makefiles
+# _BLNK_* private buildlink-related variables to this Makefile
+
+ECHO_BUILDLINK_MSG?= ${TRUE}
+
+BUILDLINK_DIR= ${WRKDIR}/.buildlink
+_BLNK_X11PKG_DIR= ${BUILDLINK_DIR:H}/.buildlink-x11pkg
+CONFIGURE_ENV+= BUILDLINK_DIR="${BUILDLINK_DIR}"
+MAKE_ENV+= BUILDLINK_DIR="${BUILDLINK_DIR}"
+_BLNK_CPPFLAGS= -I${LOCALBASE}/include
+_BLNK_LDFLAGS= -L${LOCALBASE}/lib
+
+# The configure process usually tests for outlandish or missing things
+# that we don't want polluting the argument cache.
+#
+CONFIGURE_ENV+= BUILDLINK_UPDATE_CACHE=no
+
+.if defined(USE_X11) || defined(USE_X11BASE) || defined(USE_IMAKE)
+. if !defined(_FOR_X11_LINKS_ONLY)
+BUILD_DEPENDS+= x11-links>=0.8:../../pkgtools/x11-links
+. endif
+BUILDLINK_X11_DIR= ${LOCALBASE}/share/x11-links
+CONFIGURE_ENV+= BUILDLINK_X11_DIR="${BUILDLINK_X11_DIR}"
+MAKE_ENV+= BUILDLINK_X11_DIR="${BUILDLINK_X11_DIR}"
+_BLNK_CPPFLAGS+= -I${X11BASE}/include
+_BLNK_LDFLAGS+= -L${X11BASE}/lib
+.endif
+
+CFLAGS:= ${_BLNK_CPPFLAGS} ${CFLAGS}
+CXXFLAGS:= ${_BLNK_CPPFLAGS} ${CXXFLAGS}
+CPPFLAGS:= ${_BLNK_CPPFLAGS} ${CPPFLAGS}
+LDFLAGS:= ${_BLNK_LDFLAGS} ${LDFLAGS}
+
+# Prepend ${BUILDLINK_DIR}/bin to the PATH so that the wrappers are found
+# first when searching for executables.
+#
+PATH:= ${BUILDLINK_DIR}/bin:${PATH}
+
+# Add the proper dependency on each package pulled in by buildlink2.mk
+# files. BUILDLINK_DEPMETHOD.<pkg> is either "full" or "build" to represent
+# either a full dependency or a build dependency on <pkg>. By default,
+# we use a full dependency.
+#
+.for _pkg_ in ${BUILDLINK_PACKAGES}
+. if !defined(BUILDLINK_DEPMETHOD.${_pkg_})
+BUILDLINK_DEPMETHOD.${_pkg_}= full
+. endif
+. if (${BUILDLINK_DEPMETHOD.${_pkg_}} == "full")
+_BUILDLINK_DEPMETHOD.${_pkg_}= DEPENDS
+. elif (${BUILDLINK_DEPMETHOD.${_pkg_}} == "build")
+_BUILDLINK_DEPMETHOD.${_pkg_}= BUILD_DEPENDS
+. endif
+. if defined(BUILDLINK_DEPENDS.${_pkg_}) && \
+ defined(BUILDLINK_PKGSRCDIR.${_pkg_})
+${_BUILDLINK_DEPMETHOD.${_pkg_}}+= \
+ ${BUILDLINK_DEPENDS.${_pkg_}}:${BUILDLINK_PKGSRCDIR.${_pkg_}}
+. endif
+.endfor
+
+# Add each of the *-buildlink targets as a prerequisite for the
+# buildlink target. This ensures that the symlinks are created
+# before any configure scripts or build commands are called.
+#
+.for _target_ in ${BUILDLINK_TARGETS}
+do-buildlink: ${_target_}
+.endfor
+
+# _LT_ARCHIVE_TRANSFORM creates $${dest} from $${file}, where $${file} is
+# a libtool archive (*.la). It allows libtool to properly interact with
+# buildlink at link time by linking against the libraries pointed to by
+# symlinks in ${BUILDLINK_DIR}.
+#
+_LT_ARCHIVE_TRANSFORM_SED= \
+ -e "s|${LOCALBASE}\(/lib/[^ ]*\.la\)|${BUILDLINK_DIR}\1|g" \
+ -e "s|${X11BASE}\(/lib/[^ ]*\.la\)|${BUILDLINK_DIR}\1|g"
+
+_LT_ARCHIVE_TRANSFORM= \
+ ${SED} ${_LT_ARCHIVE_TRANSFORM_SED} $${file} > $${dest}
+
+# _BUILDLINK_USE is a macro target that symlinks package files into a new
+# hierarchy under ${BUILDLINK_DIR}.
+#
+# The variables required to be defined to use this target are listed
+# below. <pkgname> refers to the name of the package and should be used
+# consistently.
+#
+# The target that uses this macro target should perform no other actions
+# and be named "<pkgname>-buildlink".
+#
+# BUILDLINK_PREFIX.<pkgname> installation prefix of the package
+#
+# BUILDLINK_FILES.<pkgname> files relative to ${BUILDLINK_PREFIX.<pkgname>}
+# to be symlinked into ${BUILDLINK_DIR};
+# libtool archive files are automatically
+# filtered out and not linked
+#
+# BUILDLINK_TARGETS targets to be invoked during buildlink;
+# the targets should be appended to this variable
+# using +=
+#
+# The variables that may optionally be defined:
+#
+# BUILDLINK_TRANSFORM.<pkgname> sed arguments used to transform the name of
+# the source filename into a destination
+# filename
+#
+_BUILDLINK_USE: .USE
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ cookie=${BUILDLINK_DIR}/.${.TARGET:S/-buildlink//}_buildlink_done; \
+ if [ ! -f $${cookie} ]; then \
+ ${ECHO_BUILDLINK_MSG} "Linking ${.TARGET:S/-buildlink//} files into ${BUILDLINK_DIR}."; \
+ ${MKDIR} ${BUILDLINK_DIR}; \
+ case "${BUILDLINK_PREFIX.${.TARGET:S/-buildlink//}}" in \
+ ${X11BASE}) \
+ ${RM} -f ${_BLNK_X11PKG_DIR} 2>/dev/null; \
+ ${LN} -sf ${BUILDLINK_DIR} ${_BLNK_X11PKG_DIR}; \
+ buildlink_dir="${_BLNK_X11PKG_DIR}"; \
+ ;; \
+ *) \
+ buildlink_dir="${BUILDLINK_DIR}"; \
+ ;; \
+ esac; \
+ files="${BUILDLINK_FILES.${.TARGET:S/-buildlink//}:S/^/${BUILDLINK_PREFIX.${.TARGET:S/-buildlink//}}\//g}"; \
+ for file in $${files}; do \
+ rel_file=`${ECHO} $${file} | ${SED} -e "s|${BUILDLINK_PREFIX.${.TARGET:S/-buildlink//}}/||"`; \
+ if [ -z "${BUILDLINK_TRANSFORM.${.TARGET:S/-buildlink//}:Q}" ]; then \
+ dest="$${buildlink_dir}/$${rel_file}"; \
+ else \
+ dest=`${ECHO} $${buildlink_dir}/$${rel_file} | ${SED} ${BUILDLINK_TRANSFORM.${.TARGET:S/-buildlink//}}`; \
+ fi; \
+ if [ -f $${file} ]; then \
+ dir=`${DIRNAME} $${dest}`; \
+ if [ ! -d $${dir} ]; then \
+ ${MKDIR} $${dir}; \
+ fi; \
+ ${RM} -f $${dest}; \
+ case $${file} in \
+ *.la) \
+ ${_LT_ARCHIVE_TRANSFORM}; \
+ ;; \
+ *) \
+ ${LN} -sf $${file} $${dest}; \
+ ;; \
+ esac; \
+ if [ -z "${BUILDLINK_TRANSFORM.${.TARGET:S/-buildlink//}:Q}" ]; then \
+ ${ECHO} $${file} >> $${cookie}; \
+ else \
+ ${ECHO} "$${file} -> $${dest}" >> $${cookie}; \
+ fi; \
+ else \
+ ${ECHO} "$${file}: not found" >> $${cookie}; \
+ fi; \
+ done; \
+ ${TOUCH} ${TOUCH_FLAGS} $${cookie}; \
+ fi
+
+do-buildlink: buildlink-wrappers
+
+# _BLNK_TRANSFORM mini language for translating wrapper arguments into
+# their buildlink equivalents:
+#
+# I:src:dst translates "-Isrc" into "-Idst"
+# II:src:dst1,dst2 translates "-Isrc" into "-Idst1 -Idst2"
+# L:src:dst translates "-Lsrc" into "-Ldst"
+# LL:src:dst1,dst2 translates "-Lsrc" into "-Ldst1 -Ldst2"
+# l:foo:bar translates "-lfoo" into "-lbar"
+# r:dir removes "dir" and "dir/*"
+#
+_BLNK_TRANSFORM+= I:${LOCALBASE}:${BUILDLINK_DIR}
+_BLNK_TRANSFORM+= L:${LOCALBASE}:${BUILDLINK_DIR}
+_BLNK_TRANSFORM+= ${BUILDLINK_TRANSFORM}
+.if defined(USE_X11) || defined(USE_X11BASE) || defined(USE_IMAKE)
+_BLNK_TRANSFORM+= II:${X11BASE}:${_BLNK_X11PKG_DIR},${BUILDLINK_X11_DIR}
+_BLNK_TRANSFORM+= LL:${X11BASE}:${_BLNK_X11PKG_DIR},${BUILDLINK_X11_DIR}
+.endif
+.if ${LOCALBASE} != "/usr/pkg"
+_BLNK_TRANSFORM+= r:-I/usr/pkg
+_BLNK_TRANSFORM+= r:-L/usr/pkg
+.endif
+.if ${LOCALBASE} != "/usr/local"
+_BLNK_TRANSFORM+= r:-I/usr/local
+_BLNK_TRANSFORM+= r:-L/usr/local
+.endif
+#
+# Create _BLNK_TRANSFORM_SED.{1,2,3} from _BLNK_TRANSFORM. We must use
+# separate variables instead of just one because the contents are too long
+# for one variable when we substitute into a shell script later on.
+#
+# Change "/usr/pkg/lib/libfoo.so" into "-L/usr/pkg/lib -lfoo" and
+# "/usr/X11R6/lib/libbar.so" into "-L/usr/X11R6/lib -lbar".
+#
+_BLNK_TRANSFORM_SED.1+= \
+ -e "s|\(${LOCALBASE}/[^ ]*\)/lib\([^ ]*\)\.a|-L\1 -l\2|g" \
+ -e "s|\(${LOCALBASE}/[^ ]*\)/lib\([^ ]*\)\.so|-L\1 -l\2|g"
+_BLNK_TRANSFORM_SED.1+= \
+ -e "s|\(${X11BASE}/[^ ]*\)/lib\([^ ]*\)\.a|-L\1 -l\2|g" \
+ -e "s|\(${X11BASE}/[^ ]*\)/lib\([^ ]*\)\.so|-L\1 -l\2|g"
+#
+# Transform "I:/usr/pkg:/buildlink" into:
+# -e "s|-I/usr/pkg |-I/buildlink |g"
+# -e "s|-I/usr/pkg$|-I/buildlink|g"
+# -e "s|-I/usr/pkg/\([^ ]*\)|-I/buildlink/\1|g"
+#
+.for _transform_ in ${_BLNK_TRANSFORM:MI\:*\:*}
+_BLNK_TRANSFORM_SED.2+= \
+ -e "s|-I${_transform_:C/^I\:([^\:]*)\:([^\:]*)$/\1/} |-I${_transform_:C/^I\:([^\:]*)\:([^\:]*)$/\2/} |g" \
+ -e "s|-I${_transform_:C/^I\:([^\:]*)\:([^\:]*)$/\1/}$$|-I${_transform_:C/^I\:([^\:]*)\:([^\:]*)$/\2/}|g" \
+ -e "s|-I${_transform_:C/^I\:([^\:]*)\:([^\:]*)$/\1/}/\([^ ]*\)|-I${_transform_:C/^I\:([^\:]*)\:([^\:]*)$/\2/}/\1|g"
+.endfor
+#
+# Transform "II:/usr/X11R6:/buildlink,/x11-links" into:
+# -e "s|-I/usr/X11R6 |-I/buildlink -I/x11-links |g"
+# -e "s|-I/usr/X11R6$|-I/buildlink -I/x11-links|g"
+# -e "s|-I/usr/X11R6/\([^ ]*\)|-I/buildlink/\1 -I/x11-links/\1|g"
+#
+.for _transform_ in ${_BLNK_TRANSFORM:MII\:*\:*,*}
+_BLNK_TRANSFORM_SED.2+= \
+ -e "s|-I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/} |-I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/} -I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/} |g" \
+ -e "s|-I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}$$|-I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/} -I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/}|g" \
+ -e "s|-I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}/\([^ ]*\)|-I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/}/\1 -I${_transform_:C/^II\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/}/\1|g"
+.endfor
+#
+# Transform "L:/usr/pkg:/buildlink" into:
+# -e "s|-L/usr/pkg |-L/buildlink |g"
+# -e "s|-L/usr/pkg$|-L/buildlink|g"
+# -e "s|-L/usr/pkg/\([^ ]*\)|-L/buildlink/\1|g"
+#
+.for _transform_ in ${_BLNK_TRANSFORM:ML\:*\:*}
+_BLNK_TRANSFORM_SED.2+= \
+ -e "s|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\1/} |-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\2/} |g" \
+ -e "s|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\1/}$$|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\2/}|g" \
+ -e "s|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\1/}/\([^ ]*\)|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\2/}/\1|g"
+_BLNK_UNTRANSFORM_SED.2+= \
+ -e "s|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\2/} |-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\1/} |g" \
+ -e "s|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\2/}$$|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\1/}|g" \
+ -e "s|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\2/}/\([^ ]*\)|-L${_transform_:C/^L\:([^\:]*)\:([^\:]*)$/\1/}/\1|g"
+.endfor
+#
+# Transform "LL:/usr/X11R6:/buildlink,/x11-links" into:
+# -e "s|-L/usr/X11R6 |-L/buildlink -L/x11-links |g"
+# -e "s|-L/usr/X11R6$|-L/buildlink -L/x11-links|g"
+# -e "s|-L/usr/X11R6/\([^ ]*\)|-L/buildlink/\1 -L/x11-links/\1|g"
+#
+.for _transform_ in ${_BLNK_TRANSFORM:MLL\:*\:*,*}
+_BLNK_TRANSFORM_SED.2+= \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/} |-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/} -L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/} |g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}$$|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/} -L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/}|g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}/\([^ ]*\)|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/}/\1 -L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/}/\1|g"
+_BLNK_UNTRANSFORM_SED.2+= \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/} |-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/} |g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/} |-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/} |g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/}$$|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}|g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/}$$|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}|g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\2/}/\([^ ]*\)|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}/\1|g" \
+ -e "s|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\3/}/\([^ ]*\)|-L${_transform_:C/^LL\:([^\:]*)\:([^\:]*),([^\:]*)$/\1/}/\1|g"
+.endfor
+#
+# Transform "l:foo:bar" into:
+# -e "s|-lfoo |-lbar |g"
+# -e "s|-lfoo$|-lbar|g"
+#
+.for _transform_ in ${_BLNK_TRANSFORM:Ml\:*}
+_BLNK_TRANSFORM_SED.2+= \
+ -e "s|-l${_transform_:C/^l\:([^\:]*)\:([^\:]*)$/\1/} |-l${_transform_:C/^l\:([^\:]*)\:([^\:]*)$/\2/} |g" \
+ -e "s|-l${_transform_:C/^l\:([^\:]*)\:([^\:]*)$/\1/}$$|-l${_transform_:C/^l\:([^\:]*)\:([^\:]*)$/\2/}|g"
+.endfor
+#
+# Fix up references to the x11-links directory.
+#
+.if defined(USE_X11) || defined(USE_X11BASE) || defined(USE_IMAKE)
+_BLNK_TRANSFORM_SED.3+= \
+ -e "s|${BUILDLINK_DIR}/\(${BUILDLINK_X11_DIR:S/^${LOCALBASE}\///}\)|${LOCALBASE}/\1|g"
+.endif
+#
+# Transform "r:-I/usr/local" into:
+# -e "s|-I/usr/local ||g"
+# -e "s|-I/usr/local$||g"
+# -e "s|-I/usr/local/\([^ ]*\)||g"
+#
+.for _transform_ in ${_BLNK_TRANSFORM:Mr\:*}
+_BLNK_TRANSFORM_SED.3+= \
+ -e "s|${_transform_:S/^r://} ||g" \
+ -e "s|${_transform_:S/^r://}$$||g" \
+ -e "s|${_transform_:S/^r://}/[^ ]*||g"
+.endfor
+#
+# Explicitly remove "-I/usr/include" and "-L/usr/lib" as they're redundant.
+#
+_BLNK_TRANSFORM_SED.3+= \
+ -e "s|-I/usr/include ||g" \
+ -e "s|-I/usr/include$$||g" \
+ -e "s|-L/usr/lib ||g" \
+ -e "s|-L/usr/lib$$||g"
+
+# Generate wrapper scripts for the compiler tools that sanitize the
+# argument list by converting references to ${LOCALBASE} and ${X11BASE}
+# into references to ${BUILDLINK_DIR}, ${_BLNK_X11PKG_DIR}, and
+# ${BUILDLINK_X11_DIR}. These wrapper scripts are to be used instead of
+# the actual compiler tools when building software.
+#
+# BUILDLINK_CC, BUILDLINK_LD, etc. are the full paths to the wrapper
+# scripts.
+#
+# ALIASES.CC, ALIASES.LD, etc. are the other names by which each wrapper
+# may be invoked.
+#
+_BLNK_WRAPPEES= AS CC CXX CPP LD
+.if defined(USE_FORTRAN)
+_BLNK_WRAPPEES+= FC F77
+.endif
+.if defined(USE_LIBTOOL)
+PKGLIBTOOL= ${BUILDLINK_LIBTOOL}
+.endif
+_BLNK_WRAPPEES+= LIBTOOL
+.if defined(USE_X11) || defined(USE_X11BASE) || defined(USE_IMAKE)
+IMAKE?= ${X11BASE}/bin/imake
+_BLNK_WRAPPEES+= IMAKE
+.endif
+_ALIASES.AS= as
+_ALIASES.CC= cc gcc
+_ALIASES.CXX= c++ g++
+_ALIASES.CPP= cpp
+_ALIASES.FC= f77 g77
+_ALIASES.LD= ld
+
+# On Darwin, protect against using /bin/sh if it's zsh.
+.if ${OPSYS} == "Darwin"
+. if exists(/bin/bash)
+BUILDLINK_SHELL?= /bin/bash
+. else
+BUILD_DEPENDS+= bash-[0-9]*:../../shells/bash2
+BUILDLINK_SHELL?= ${LOCALBASE}/bin/bash
+. endif
+.else
+BUILDLINK_SHELL?= ${SH}
+.endif
+
+# _BLNK_WRAP_*.<wrappee> variables represent "template methods" of the
+
+# wrapper script that may be customized per wrapper:
+#
+# _BLNK_WRAP_ENV.<wrappee> resets the value of CC, CPP, etc. in the
+# configure and make environments (CONFIGURE_ENV, MAKE_ENV) so that
+# they point to the wrappers.
+#
+# _BLNK_WRAP_{*CACHE*,*LOGIC*}.<wrappee> are parts of the wrapper script
+# system as described in pkgsrc/mk/buildlink2/README. The files not
+# ending in "-trans" represent pieces of the wrapper script that may
+# be used to form a wrapper that doesn't translate its arguments,
+# and conversely for the files ending in "-trans". By default, all
+# wrappers use the "-trans" scripts.
+#
+# _BLNK_WRAP_SANITIZE_PATH.<wrappee> sets the PATH for calling executables
+# from within the wrapper. By default, it removes the buildlink
+# directory from the PATH so that sub-invocations of compiler tools
+# will use the wrappees instead of the wrappers.
+#
+_BLNK_WRAP_SANITIZE_PATH= \
+ PATH="${PATH:C/:${BUILDLINK_DIR}[^:]*//:C/${BUILDLINK_DIR}[^:]*://}"
+_BLNK_WRAP_PRE_CACHE= ${BUILDLINK_DIR}/bin/.pre-cache
+_BLNK_WRAP_POST_CACHE= ${BUILDLINK_DIR}/bin/.post-cache
+_BLNK_WRAP_CACHE= ${BUILDLINK_DIR}/bin/.cache
+_BLNK_WRAP_LOGIC= ${BUILDLINK_DIR}/bin/.logic
+_BLNK_WRAP_POST_CACHE_TRANSFORM= ${BUILDLINK_DIR}/bin/.post-cache-trans
+_BLNK_WRAP_CACHE_TRANSFORM= ${BUILDLINK_DIR}/bin/.cache-trans
+_BLNK_WRAP_LOGIC_TRANSFORM= ${BUILDLINK_DIR}/bin/.logic-trans
+_BLNK_WRAP_LOG= ${BUILDLINK_DIR}/.wrapper.log
+_BLNK_LIBTOOL_FIX_LA= ${BUILDLINK_DIR}/bin/.libtool-fix-la
+
+.for _wrappee_ in ${_BLNK_WRAPPEES}
+#
+# _BLNK_WRAPPER_SH.<wrappee> points to the main wrapper script used to
+# generate the wrapper for the wrappee.
+#
+_BLNK_WRAPPER_SH.${_wrappee_}= ${.CURDIR}/../../mk/buildlink2/wrapper.sh
+_BLNK_WRAP_ENV.${_wrappee_}= ${_wrappee_}="${BUILDLINK_${_wrappee_}:T}"
+_BLNK_WRAP_SANITIZE_PATH.${_wrappee_}= ${_BLNK_WRAP_SANITIZE_PATH}
+_BLNK_WRAP_PRE_CACHE.${_wrappee_}= ${_BLNK_WRAP_PRE_CACHE}
+_BLNK_WRAP_POST_CACHE.${_wrappee_}= ${_BLNK_WRAP_POST_CACHE_TRANSFORM}
+_BLNK_WRAP_CACHE.${_wrappee_}= ${_BLNK_WRAP_CACHE_TRANSFORM}
+_BLNK_WRAP_LOGIC.${_wrappee_}= ${_BLNK_WRAP_LOGIC_TRANSFORM}
+.endfor
+
+# Don't bother adding AS, CPP to the configure or make environments as
+# adding them seems to break some GNU configure scripts.
+#
+_BLNK_WRAP_ENV.AS= # empty
+_BLNK_WRAP_ENV.CPP= # empty
+
+# Don't override the default LIBTOOL setting in the environment, as
+# it already correctly points to ${PKGLIBTOOL}, and don't sanitize the PATH
+# because we want libtool to invoke the wrapper scripts, too.
+#
+_BLNK_WRAP_ENV.LIBTOOL= # empty
+_BLNK_WRAPPER_SH.LIBTOOL= ${.CURDIR}/../../mk/buildlink2/libtool.sh
+_BLNK_WRAP_SANITIZE_PATH.LIBTOOL= # empty
+
+# In the libtool archives, we must remove references to the buildlink
+# directories and change any -llib to the proper replacement libraries
+# (-lreadline -> -ledit, etc.). Redundant -Ldir options are removed to
+# optimize the resulting libtool archives.
+#
+_BLNK_WRAP_LT_UNTRANSFORM_SED= ${LIBTOOL_ARCHIVE_UNTRANSFORM_SED}
+_BLNK_WRAP_LT_UNTRANSFORM_SED+= ${_BLNK_UNTRANSFORM_SED.1}
+_BLNK_WRAP_LT_UNTRANSFORM_SED+= ${_BLNK_UNTRANSFORM_SED.2}
+_BLNK_WRAP_LT_UNTRANSFORM_SED+= ${_BLNK_UNTRANSFORM_SED.3}
+_BLNK_WRAP_LT_UNTRANSFORM_SED+= -e "s|-L/usr/lib ||g"
+_BLNK_WRAP_LT_UNTRANSFORM_SED+= -e "s|-L/usr/lib$$||g"
+
+# Don't transform the arguments for imake, which uses the C preprocessor
+# to generate Makefiles, so that imake will find its config files.
+#
+.if defined(USE_X11) || defined(USE_X11BASE) || defined(USE_IMAKE)
+_BLNK_WRAP_PRE_CACHE.IMAKE= ${_BLNK_WRAP_PRE_CACHE}
+_BLNK_WRAP_POST_CACHE.IMAKE= ${_BLNK_WRAP_POST_CACHE}
+_BLNK_WRAP_CACHE.IMAKE= ${_BLNK_WRAP_CACHE}
+_BLNK_WRAP_LOGIC.IMAKE= ${_BLNK_WRAP_LOGIC}
+.endif
+
+buildlink-wrappers: ${_BLNK_WRAP_CACHE}
+buildlink-wrappers: ${_BLNK_WRAP_CACHE_TRANSFORM}
+buildlink-wrappers: ${_BLNK_WRAP_LOGIC}
+buildlink-wrappers: ${_BLNK_WRAP_LOGIC_TRANSFORM}
+.if defined (USE_LIBTOOL)
+buildlink-wrappers: ${_BLNK_LIBTOOL_FIX_LA}
+.endif
+
+.for _wrappee_ in ${_BLNK_WRAPPEES}
+CONFIGURE_ENV+= ${_BLNK_WRAP_ENV.${_wrappee_}}
+MAKE_ENV+= ${_BLNK_WRAP_ENV.${_wrappee_}}
+
+BUILDLINK_${_wrappee_}= \
+ ${BUILDLINK_DIR}/bin/${${_wrappee_}:T:C/^/_asdf_/1:M_asdf_*:S/^_asdf_//}
+
+buildlink-wrappers: ${BUILDLINK_${_wrappee_}}
+${BUILDLINK_${_wrappee_}}: \
+ ${_BLNK_WRAPPER_SH.${_wrappee_}} \
+ ${_BLNK_WRAP_PRE_CACHE.${_wrappee_}} \
+ ${_BLNK_WRAP_POST_CACHE.${_wrappee_}}
+ ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_BUILDLINK_MSG} \
+ "Creating wrapper: ${.TARGET}"
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ wrappee="${${_wrappee_}:C/^/_asdf_/1:M_asdf_*:S/^_asdf_//}"; \
+ case $${wrappee} in \
+ /*) absdir=; \
+ ;; \
+ *) OLDIFS="$$IFS"; \
+ IFS=":"; \
+ for dir in $${PATH}; do \
+ case $${dir} in \
+ *${BUILDLINK_DIR}*) \
+ ;; \
+ *) if [ -x $${dir}/$${wrappee} ]; then \
+ absdir=$${dir}/; \
+ wrappee=$${absdir}$${wrappee}; \
+ break; \
+ fi; \
+ ;; \
+ esac; \
+ done; \
+ IFS="$$OLDIFS"; \
+ if [ ! -x "$${wrappee}" ]; then \
+ ${ECHO_BUILDLINK_MSG} "$${wrappee}: No such file"; \
+ exit 1; \
+ fi; \
+ ;; \
+ esac; \
+ ${MKDIR} ${.TARGET:H}; \
+ ${CAT} ${_BLNK_WRAPPER_SH.${_wrappee_}} | \
+ ${SED} -e "s|@BUILDLINK_DIR@|${BUILDLINK_DIR}|g" \
+ -e "s|@BUILDLINK_SHELL@|${BUILDLINK_SHELL}|g" \
+ -e "s|@CAT@|${CAT:Q}|g" \
+ -e "s|@ECHO@|${ECHO:Q}|g" \
+ -e "s|@SED@|${SED:Q}|g" \
+ -e "s|@TOUCH@|${TOUCH:Q}|g" \
+ -e "s|@WRAPPEE@|$${absdir}${${_wrappee_}:Q}|g" \
+ -e "s|@_BLNK_LIBTOOL_FIX_LA@|${_BLNK_LIBTOOL_FIX_LA:Q}|g" \
+ -e "s|@_BLNK_WRAP_LOG@|${_BLNK_WRAP_LOG:Q}|g" \
+ -e "s|@_BLNK_WRAP_PRE_CACHE@|${_BLNK_WRAP_PRE_CACHE.${_wrappee_}:Q}|g" \
+ -e "s|@_BLNK_WRAP_POST_CACHE@|${_BLNK_WRAP_POST_CACHE.${_wrappee_}:Q}|g" \
+ -e "s|@_BLNK_WRAP_CACHE@|${_BLNK_WRAP_CACHE.${_wrappee_}:Q}|g" \
+ -e "s|@_BLNK_WRAP_LOGIC@|${_BLNK_WRAP_LOGIC.${_wrappee_}:Q}|g" \
+ -e "s|@_BLNK_WRAP_SANITIZE_PATH@|${_BLNK_WRAP_SANITIZE_PATH.${_wrappee_}:Q}|g" \
+ > ${.TARGET}; \
+ ${CHMOD} +x ${.TARGET}
+
+. for _alias_ in ${_ALIASES.${_wrappee_}:S/^/${BUILDLINK_DIR}\/bin\//}
+. if !target(${_alias_})
+buildlink-wrappers: ${_alias_}
+${_alias_}: ${BUILDLINK_${_wrappee_}}
+ ${_PKG_SILENT}${_PKG_DEBUG}${ECHO_BUILDLINK_MSG} \
+ "Linking wrapper: ${.TARGET}"
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${LN} -f ${BUILDLINK_${_wrappee_}} ${.TARGET}
+. endif
+. endfor # _alias_
+.endfor # _wrappee_
+
+${_BLNK_WRAP_PRE_CACHE}: ${.CURDIR}/../../mk/buildlink2/pre-cache
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${SED} \
+ -e "s|@WRKDIR@|${WRKDIR}|g" \
+ -e "s|@BUILDLINK_DIR@|${BUILDLINK_DIR}|g" \
+ -e "s|@BUILDLINK_X11_DIR@|${BUILDLINK_X11_DIR}|g" \
+ -e "s|@_BLNK_X11PKG_DIR@|${_BLNK_X11PKG_DIR}|g" \
+ ${.ALLSRC} > ${.TARGET}.tmp
+ ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET}
+
+${_BLNK_WRAP_POST_CACHE}: ${.CURDIR}/../../mk/buildlink2/post-cache
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${SED} \
+ -e "s|@LOCALBASE@|${LOCALBASE}|g" \
+ -e "s|@X11BASE@|${X11BASE}|g" \
+ -e 's|@ECHO@|${ECHO}|g' \
+ -e 's|@_BLNK_TRANSFORM_SED.1@||g' \
+ -e 's|@_BLNK_TRANSFORM_SED.2@||g' \
+ -e 's|@_BLNK_TRANSFORM_SED.3@||g' \
+ ${.ALLSRC} > ${.TARGET}.tmp
+ ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET}
+
+${_BLNK_WRAP_POST_CACHE_TRANSFORM}: ${.CURDIR}/../../mk/buildlink2/post-cache
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${SED} \
+ -e "s|@LOCALBASE@|${LOCALBASE}|g" \
+ -e "s|@X11BASE@|${X11BASE}|g" \
+ -e 's|@ECHO@|${ECHO}|g' \
+ -e 's|@_BLNK_TRANSFORM_SED.1@|${_BLNK_TRANSFORM_SED.1:Q}|g' \
+ -e 's|@_BLNK_TRANSFORM_SED.2@|${_BLNK_TRANSFORM_SED.2:Q}|g' \
+ -e 's|@_BLNK_TRANSFORM_SED.3@|${_BLNK_TRANSFORM_SED.3:Q}|g' \
+ ${.ALLSRC} > ${.TARGET}.tmp
+ ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET}
+
+${_BLNK_WRAP_CACHE}:
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_ARGS} ${.TARGET}
+
+${_BLNK_WRAP_CACHE_TRANSFORM}:
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_ARGS} ${.TARGET}
+
+${_BLNK_WRAP_LOGIC}: \
+ ${_BLNK_WRAP_PRE_CACHE} \
+ ${_BLNK_WRAP_POST_CACHE}
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${CAT} ${.ALLSRC} > ${.TARGET}
+
+${_BLNK_WRAP_LOGIC_TRANSFORM}: \
+ ${_BLNK_WRAP_PRE_CACHE} \
+ ${_BLNK_WRAP_POST_CACHE_TRANSFORM}
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${CAT} ${.ALLSRC} > ${.TARGET}
+
+${_BLNK_LIBTOOL_FIX_LA}: ${.CURDIR}/../../mk/buildlink2/libtool-fix-la
+ ${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
+ ${_PKG_SILENT}${_PKG_DEBUG}${SED} \
+ -e "s|@BASENAME@|${BASENAME:Q}|g" \
+ -e "s|@CAT@|${CAT:Q}|g" \
+ -e "s|@CP@|${CP:Q}|g" \
+ -e "s|@DIRNAME@|${DIRNAME:Q}|g" \
+ -e "s|@ECHO@|${ECHO:Q}|g" \
+ -e "s|@MV@|${MV:Q}|g" \
+ -e "s|@RM@|${RM:Q}|g" \
+ -e "s|@SED@|${SED:Q}|g" \
+ -e "s|@TOUCH@|${TOUCH:Q}|g" \
+ -e 's|@_BLNK_WRAP_LT_UNTRANSFORM_SED@|${_BLNK_WRAP_LT_UNTRANSFORM_SED:Q}|g' \
+ ${.ALLSRC} > ${.TARGET}.tmp
+ ${_PKG_SILENT}${_PKG_DEBUG}${MV} -f ${.TARGET}.tmp ${.TARGET}
+
+clear-buildlink-cache: remove-buildlink-cache buildlink-wrappers
+
+remove-buildlink-cache:
+ ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_BLNK_WRAP_CACHE_TRANSFORM}
+ ${_PKG_SILENT}${_PKG_DEBUG}${RM} -f ${_BLNK_WRAP_LOGIC_TRANSFORM}
+
+_BLNK_CHECK_PATTERNS+= -e "-I${LOCALBASE}/[a-rt-z]"
+_BLNK_CHECK_PATTERNS+= -e "-L${LOCALBASE}/[a-rt-z]"
+_BLNK_CHECK_PATTERNS+= -e "-I${X11BASE}/"
+_BLNK_CHECK_PATTERNS+= -e "-L${X11BASE}/"
+
+buildlink-check:
+ @if [ -f ${_BLNK_WRAP_LOG} ]; then \
+ ${GREP} ${_BLNK_CHECK_PATTERNS} ${_BLNK_WRAP_LOG} || ${TRUE}; \
+ fi
diff --git a/mk/buildlink2/buildlink2.txt b/mk/buildlink2/buildlink2.txt
new file mode 100644
index 00000000000..2d3f130b3d2
--- /dev/null
+++ b/mk/buildlink2/buildlink2.txt
@@ -0,0 +1,91 @@
+$NetBSD: buildlink2.txt,v 1.2 2002/08/22 08:21:29 jlam Exp $
+
+The buildlink2 framework is a departure from the original buildlink
+framework, which tries to do its work up-front before the configure
+process and fix things up after the build process. Over time, the
+buildlink framework grew overly complex to deal with software that stored
+build-time information in the installed files, e.g. GNOME packages. The
+new framework actually does its work as the software is being configured
+and built through a series of wrapper scripts that are used in place of the
+normal compiler tools. We still symlink libraries and headers into
+${BUILDLINK_DIR} to normalize the environment in which the software is
+built, but now we tell the configure process the actual installed locations
+of the libraries and headers we are using, and the compiler wrappers will
+munge them into references into ${BUILDLINK_DIR}.
+
+To-do list:
+
+ (*) regression test targets to make sure _BLNK_TRANSFORM_SED is doing
+ what it's supposed to do
+
+Here are some FAQs and answers regarding buildlink2:
+
+Q: Why is the buildlink2 framework better than the existing one?
+A: There are several reasons:
+
+ (1) The new framework makes it simpler to buildinkify a package because
+ we just convert dependencies into including the equivalent
+ buildlink2.mk files and define USE_BUILDLINK2_ONLY. We don't need
+ to lie about where libraries or headers we use are installed.
+
+ (2) All packages using the new framework are strongly buildlinked; it
+ is not possible to create weakly buildlinked packages. This
+ deprecates the need for x11.buildlink.mk.
+
+ (3) We no longer care if the configure or build processes add
+ -I${PREFIX}/include or -L${PREFIX}/lib to the compiler or linker
+ lines. We _want_ them to do so (and we actually add them
+ ourselves) since they are munged into references to
+ ${BUILDLINK_DIR) by the wrapper scripts.
+
+ (4) We no longer need to create and use config script wrappers.
+
+ (5) buildlink2.mk files now simply create the <pkg>-buildlink target
+ and can discard the REPLACE_BUILDLINK and *CONFIG_WRAPPER* lines.
+
+ (6) We no longer mess around with configure scripts or Makefiles before
+ the build process, so we don't accidentally trigger rebuilds of
+ those files if the software uses GNU autoconf/automake.
+
+ (7) We no longer mess around with libtool archives after the build
+ process, so we don't accidentally trigger rebuilds of those files
+ during the install process.
+
+Q: How does this affect packages that use the existing buildlink framework?
+A: The buildlink and buildlink2 frameworks can coexist within pkgsrc, but
+ packages that use the new framework must be use it exclusively, i.e. a
+ package Makefile can't include both buildlink.mk and buildlink2.mk
+ files. Packages that use the old framework can continue to do so, but
+ it is encouraged that they convert to the new buildlink2 framework for
+ the benefits listed earlier.
+
+Q: Can I make strongly buildlinked packages that use imake?
+A: Yes. Packages that use imake to drive the configuration and build
+ processes can now be strongly buildlinked as well.
+
+Q: How do I use compilers other than the system-supplied cc? I currently
+ set CC=/my/special/c-compiler in /etc/mk.conf.
+A: It should Just Work. The wrapper scripts automatically handle this
+ situation. The software is told to use CC=cc, which points to the
+ special compiler wrapper script in ${BUILDLINK_DIR}/bin/cc, but the
+ wrapper itself will call the CC that you explicitly set.
+
+Q: So what's bad about the new buildlink2 framework?
+A: The full build now takes longer than it used to. Since we are using
+ wrapper scripts in place of the compilers, we bear the cost of the extra
+ shell processes invoked as a result. The increased build times on the
+ platforms on which I was able to test are roughly:
+
+ NetBSD-1.5ZC/i386 ~1% (non-USE_LIBTOOL)
+ ~3% (USE_LIBTOOL)
+
+ NetBSD-1.5.1/mac68k +?% (USE_LIBTOOL)
+
+ The i386 box is an Intel P3 850MHz + UDMA IDE HD + 512MB SDRAM.
+ The mac68k box is a Quadra 650 (68040) + SCSI2 HD + 48MB RAM.
+
+Q: What happened to x11.buildlink.mk?
+A: x11.buildlink.mk is now deprecated, as it's all handled directly by
+ the buildlink2.mk framework. However, in converting packages to use
+ buildlink2, if it uses x11.buildlink.mk, then you will need to define
+ USE_X11 if USE_X11BASE is not already defined.
diff --git a/mk/buildlink2/libtool-fix-la b/mk/buildlink2/libtool-fix-la
new file mode 100644
index 00000000000..e662f4b2827
--- /dev/null
+++ b/mk/buildlink2/libtool-fix-la
@@ -0,0 +1,100 @@
+# $NetBSD: libtool-fix-la,v 1.2 2002/08/22 08:21:29 jlam Exp $
+#
+# For *.la files, in the "relink_command" line, we make the following
+# replacements:
+#
+# "libfoo.la" -> "-L./.libs libfoo.la"
+# "dirpath/libfoo.la" -> "-Ldirpath/.libs libfoo.la"
+#
+# This allows the libraries to be found within ${WRKSRC} during relinking.
+# We rely on the proper rpath settings to be set by libtool.
+#
+# For the *.lai files, in the "dependency_libs" line, we remove redundant
+# -Ldir and -llib options.
+
+labase=`@BASENAME@ $lafile .la`
+ladir=`@DIRNAME@ $lafile`
+latimestamp=${ladir}/.${labase}.la.timestamp
+laifile=${ladir}/.libs/${labase}.lai
+if [ ! -f $latimestamp ]; then
+ . ${ladir}/${labase}.la
+
+ relink=
+ for i in ${relink_command}; do
+ case "$i" in
+ -I*|-D*)
+ ;;
+ -L*)
+ case "$relink" in
+ *"$i "*) ;;
+ *"$i") ;;
+ *) relink="${relink} $i" ;;
+ esac
+ ;;
+ $lafile)
+ relink="${relink} $i"
+ ;;
+ *.la)
+ ltlibsdir=`@DIRNAME@ $i`/.libs
+ case "$relink" in
+ *"-L$ltlibsdir "*) ;;
+ *"-L$ltlibsdir") ;;
+ *) relink="$relink -L$ltlibsdir" ;;
+ esac
+ relink="${relink} $i"
+ ;;
+ *)
+ relink="${relink} $i"
+ ;;
+ esac
+ done
+ if [ -n "$relink" ]; then
+ @MV@ -f $lafile ${lafile}.blsav
+ (
+ @CAT@ ${lafile}.blsav | @SED@ -e '/^relink_command=/,$d'
+ @ECHO@ "relink_command='$relink'"
+ @CAT@ ${lafile}.blsav | @SED@ -e '1,/^relink_command=/d'
+ ) > $lafile
+ @ECHO@ "==> Fixed $lafile" >> $wrapperlog
+ fi
+ if [ -n "$laifile" ] && [ -f "$laifile" ]; then
+ @SED@ @_BLNK_WRAP_LT_UNTRANSFORM_SED@ \
+ $laifile > ${laifile}.tmp
+ . ${laifile}.tmp
+ L=; l=; lexist=; prev=
+ for i in ${dependency_libs}; do
+ case "$i" in
+ $prev)
+ ;;
+ -L*)
+ case "$L" in
+ *"$i "*) ;;
+ *"$i") ;;
+ *) L="$L $i" ;;
+ esac
+ ;;
+ -l*)
+ lexist=1
+ l="$l $i"
+ ;;
+ *)
+ l="$l $i"
+ ;;
+ esac
+ prev="$i"
+ done
+ if [ -z "$lexist" ]; then
+ L=
+ fi
+ deps="$L$l"
+ @MV@ -f $laifile ${laifile}.blsav
+ (
+ @CAT@ ${laifile}.tmp | @SED@ -e '/^dependency_libs=/,$d'
+ @ECHO@ "dependency_libs='$deps'"
+ @CAT@ ${laifile}.tmp | @SED@ -e '1,/^dependency_libs=/d'
+ ) > ${laifile}
+ @RM@ -f ${laifile}.tmp
+ @ECHO@ "==> Fixed $laifile" >> $wrapperlog
+ fi
+ @TOUCH@ $latimestamp
+fi
diff --git a/mk/buildlink2/libtool.sh b/mk/buildlink2/libtool.sh
new file mode 100644
index 00000000000..5d3b8ad9980
--- /dev/null
+++ b/mk/buildlink2/libtool.sh
@@ -0,0 +1,80 @@
+#!@BUILDLINK_SHELL@
+#
+# $NetBSD: libtool.sh,v 1.2 2002/08/22 08:21:29 jlam Exp $
+
+Xsed='@SED@ -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+
+pre_cache="@_BLNK_WRAP_PRE_CACHE@"
+cache="@_BLNK_WRAP_CACHE@"
+post_cache="@_BLNK_WRAP_POST_CACHE@"
+logic="@_BLNK_WRAP_LOGIC@"
+libtool_fix_la="@_BLNK_LIBTOOL_FIX_LA@"
+wrapperlog="@_BLNK_WRAP_LOG@"
+updatecache=${BUILDLINK_UPDATE_CACHE-yes}
+
+cmd="@WRAPPEE@"
+lafile=
+while [ $# -gt 0 ]; do
+ arg="$1"; shift
+ case $arg in
+ --fix-la)
+ case "$1" in
+ *.la)
+ lafile="$1"
+ . $libtool_fix_la
+ exit
+ ;;
+ esac
+ ;;
+ --mode|--mode=install)
+ if [ "$arg" = "--mode=install" ] || \
+ [ "$arg" = "--mode" -a "$1" = "install" ]; then
+ args="$args $arg"
+ while [ $# -gt 0 ]; do
+ arg="$1"; shift
+ case $arg in
+ *[\`\"\$\\])
+ arg=`@ECHO@ X$arg | \
+ $Xsed -e "$sed_quote_subst" \
+ `
+ ;;
+ esac
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ args="$args $arg"
+ done
+ break
+ fi
+ ;;
+ -o)
+ case "$1" in
+ *.la) lafile="$1" ;;
+ esac
+ ;;
+ *)
+ cacheupdated=
+ . $logic
+ case "$cacheupdated" in
+ yes) @CAT@ $pre_cache $cache $post_cache > $logic ;;
+ esac
+ ;;
+ esac
+ args="$args $arg"
+done
+cmd="$cmd $args"
+
+@_BLNK_WRAP_SANITIZE_PATH@
+
+@ECHO@ $cmd >> $wrapperlog
+eval $cmd
+wrapper_result=$?
+
+if [ -n "$lafile" ] && [ -f "$lafile" ]; then
+ . $libtool_fix_la
+fi
+
+exit ${wrapper_result}
diff --git a/mk/buildlink2/post-cache b/mk/buildlink2/post-cache
new file mode 100644
index 00000000000..e69d198a9d3
--- /dev/null
+++ b/mk/buildlink2/post-cache
@@ -0,0 +1,61 @@
+# $NetBSD: post-cache,v 1.2 2002/08/22 08:21:29 jlam Exp $
+
+*)
+ case $arg in
+ *[\`\"\$\\])
+ arg=`@ECHO@ X$arg | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ case $updatecache in
+ yes)
+ newarg=`@ECHO@ X$arg | $Xsed -e "$sed_quote_subst"`
+ @ECHO@ "$arg) arg=\"$newarg\" ;; #1" >> $cache
+ cacheupdated=yes
+ ;;
+ esac
+ ;;
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ case $updatecache in
+ yes)
+ newarg=`@ECHO@ X$arg | $Xsed -e "$sed_quote_subst"`
+ @ECHO@ "$arg) arg=\"$newarg\" ;; #2" >> $cache
+ cacheupdated=yes
+ ;;
+ esac
+ ;;
+ -D*)
+ arg=`@ECHO@ X$arg | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ case $updatecache in
+ yes)
+ newarg=`@ECHO@ X$arg | $Xsed -e "$sed_quote_subst"`
+ @ECHO@ "$arg) arg=\"$newarg\" ;; #3" >> $cache
+ cacheupdated=yes
+ ;;
+ esac
+ ;;
+ -[ILl]*|-Wl,*|@LOCALBASE@/*/lib*|@X11BASE@/*/lib*)
+ newarg=`@ECHO@ "X$arg" | $Xsed \
+ @_BLNK_TRANSFORM_SED.1@ \
+ @_BLNK_TRANSFORM_SED.2@ \
+ @_BLNK_TRANSFORM_SED.3@ \
+ `
+ case $updatecache in
+ yes)
+ @ECHO@ "$arg) arg=\"$newarg\" ;; #4" >> $cache
+ cacheupdated=yes
+ ;;
+ esac
+ arg="$newarg"
+ ;;
+ esac
+ ;;
+esac
diff --git a/mk/buildlink2/pre-cache b/mk/buildlink2/pre-cache
new file mode 100644
index 00000000000..b82a19d812c
--- /dev/null
+++ b/mk/buildlink2/pre-cache
@@ -0,0 +1,7 @@
+# $NetBSD: pre-cache,v 1.2 2002/08/22 08:21:29 jlam Exp $
+
+case $arg in
+-[IL]@WRKDIR@*|-[IL]@BUILDLINK_DIR@*|-[IL]@BUILDLINK_X11_DIR@*|-[IL]@_BLNK_X11PKG_DIR@*)
+ ;;
+-[IL].|-[IL]./..*|-[IL]..*)
+ ;;
diff --git a/mk/buildlink2/wrapper.sh b/mk/buildlink2/wrapper.sh
new file mode 100644
index 00000000000..b023a904a9f
--- /dev/null
+++ b/mk/buildlink2/wrapper.sh
@@ -0,0 +1,29 @@
+#!@BUILDLINK_SHELL@
+#
+# $NetBSD: wrapper.sh,v 1.2 2002/08/22 08:21:30 jlam Exp $
+
+Xsed='@SED@ -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+
+pre_cache="@_BLNK_WRAP_PRE_CACHE@"
+cache="@_BLNK_WRAP_CACHE@"
+post_cache="@_BLNK_WRAP_POST_CACHE@"
+logic="@_BLNK_WRAP_LOGIC@"
+wrapperlog="@_BLNK_WRAP_LOG@"
+updatecache=${BUILDLINK_UPDATE_CACHE-yes}
+
+cmd="@WRAPPEE@"
+for arg; do
+ cacheupdated=no
+ . $logic
+ case "$cacheupdated" in
+ yes) @CAT@ $pre_cache $cache $post_cache > $logic ;;
+ esac
+ args="$args $arg"
+done
+cmd="$cmd $args"
+
+@_BLNK_WRAP_SANITIZE_PATH@
+
+@ECHO@ $cmd >> $wrapperlog
+eval exec $cmd