# $NetBSD: bsd.tools.mk,v 1.28 2005/05/21 04:53:17 jlam Exp $ # # Copyright (c) 2005 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Johnny C. Lam. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the NetBSD # Foundation, Inc. and its contributors. # 4. Neither the name of The NetBSD Foundation nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # # This Makefile fragment creates tools under ${TOOLS_DIR} that are # found before similarly-named tools in the system path. # # TOOLS_CREATE is a whitespace-separated list of tools for which a # corresponding tool is created. Either a wrapper script or a # symlink is created depending on the tool that is being # overridden. # # The following variables specify the details of each : # # TOOLS_CMD. is the path to the tool under ${TOOLS_DIR}. This # variable is optional, and if left unspecified it defaults to # ${TOOLS_DIRS}/bin/. # # TOOLS_ALIASES. is a whitespace-separated list of names for # which should also be created under ${TOOLS_DIR}. # # TOOLS_REAL_CMD. is the path to the actual command that is # invoked when ${TOOLS_CMD.} is called. If should # be a symlink, then this variable is required and should be a # full path. If should be a wrapper, then this variable # is required unless TOOLS_REAL_CMDLINE. is defined (see # below). # # The following variables specify further details of each and # if set, cause a wrapper script to be created. # # TOOLS_REAL_ARGS. additional arguments that are passed to the # real command ahead of any command-line arguments. This variable # is optional. # # TOOLS_REAL_CMDLINE. specifies the full command-line to invoke # in the wrapper script when is called. This variable is # optional, and if left unspecified, then this is built up from # TOOLS_REAL_CMD. and TOOLS_REAL_ARGS. by default. # # 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_SHELL?= ${SH} _TOOLS_WRAP_LOG= ${WRKLOG} .PHONY: do-tools override-tools do-tools: override-tools override-tools: .OPTIONAL USE_TOOLS?= # empty # Include the other mk/tools/*.mk files here that help specify the # wrappers and symlinks that will be created by this file. Order # matters! # .include "../../mk/tools/automake.mk" .include "../../mk/tools/autoconf.mk" .include "../../mk/tools/texinfo.mk" .include "../../mk/tools/ldconfig.mk" .include "../../mk/tools/rpcgen.mk" .include "../../mk/tools/strip.mk" .include "../../mk/tools/imake.mk" .include "../../mk/tools/replace.mk" .include "../../mk/tools/perl.mk" .include "../../mk/tools/make.mk" ###################################################################### .for _t_ in ${TOOLS_NOOP} TOOLS_CREATE+= ${_t_} TOOLS_REAL_CMDLINE.${_t_}?= exit 0 .endfor .undef _t_ .for _t_ in ${TOOLS_BROKEN} TOOLS_CREATE+= ${_t_} TOOLS_REAL_CMDLINE.${_t_}?= exit 1 .endfor .undef _t_ .for _t_ in ${TOOLS_GNU_MISSING} TOOLS_CREATE+= ${_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_ ###################################################################### # These tools are used in the targets that actually create the wrappers # and symlinks. We define them here so that as a fallback, we'll just # use the ones in the PATH. This makes the tools framework more # standalone. CHMOD?= chmod ECHO?= echo FALSE?= false LN?= ln MKDIR?= mkdir -p ###################################################################### # If the command line was defined, then we create a wrapper. # If the real command isn't a full path, then we create a wrapper. # If some command arguments were given, then we create a wrapper. # Otherwise, we create a symlink. # # By default, the tool in ${TOOLS_DIR} will be in the "bin" directory # and will be called . # # The default wrapper script will invoke the real command, followed # by any arguments specified in TOOLS_REAL_ARGS.*, followed by any # command-line arguments passed to the wrapper script. # .for _t_ in ${TOOLS_CREATE} TOOLS_CMD.${_t_}?= ${TOOLS_DIR}/bin/${_t_} TOOLS_REAL_CMD.${_t_}?= ${FALSE} TOOLS_REAL_CMDLINE_DFLT.${_t_}= \ ${TOOLS_REAL_CMD.${_t_}} ${TOOLS_REAL_ARGS.${_t_}} "$$@" override-tools: ${TOOLS_CMD.${_t_}} ${TOOLS_CMD.${_t_}}: ${_PKG_SILENT}${_PKG_DEBUG}${TEST} -d ${.TARGET:H:Q} || \ ${MKDIR} ${.TARGET:H:Q} ${_PKG_SILENT}${_PKG_DEBUG} \ if ${TEST} -n ${TOOLS_REAL_CMDLINE.${_t_}:Q}""; then \ create=wrapper; \ cmdline=${TOOLS_REAL_CMDLINE.${_t_}:Q}; \ elif ${TEST} -n ${TOOLS_REAL_CMD.${_t_}:Q}""; then \ if ${TEST} -n ${TOOLS_REAL_ARGS.${_t_}:Q}""; then \ create=wrapper; \ cmdline=${TOOLS_REAL_CMDLINE_DFLT.${_t_}:Q}; \ else \ case ${TOOLS_REAL_CMD.${_t_}:Q}"" in \ /*) create=symlink ;; \ *) create=wrapper; \ cmdline=${TOOLS_REAL_CMDLINE_DFLT.${_t_}:Q}; \ esac; \ fi; \ else \ create=symlink; \ fi; \ case "$$create" in \ wrapper) \ { ${ECHO} '#!'${TOOLS_SHELL:Q}; \ ${ECHO} 'wrapperlog="$${TOOLS_WRAPPER_LOG-'${_TOOLS_WRAP_LOG:Q}'}"'; \ ${ECHO} '${ECHO} "[*] "'${.TARGET:Q}'" $$@" >> $$wrapperlog'; \ ${ECHO} "${ECHO} \"<.> $$cmdline\" >> \$$wrapperlog"; \ ${ECHO} "$$cmdline"; \ } > ${.TARGET:Q}; \ ${CHMOD} +x ${.TARGET:Q}; \ ;; \ *) \ ${LN} -fs ${TOOLS_REAL_CMD.${_t_}:Q} ${.TARGET:Q}; \ ;; \ esac . for _a_ in ${TOOLS_ALIASES.${_t_}} ${_PKG_SILENT}${_PKG_DEBUG} \ ${TEST} ${.TARGET:Q} = ${.TARGET:H:Q}/${_a_} || \ ${LN} -fs ${.TARGET:T:Q} ${.TARGET:H:Q}/${_a_} . endfor . undef _a_ .endfor .undef _t_ .endif # BSD_TOOLS_MK