134 lines
4.2 KiB
Makefile
134 lines
4.2 KiB
Makefile
# $NetBSD: replace-interpreter.mk,v 1.16 2018/04/17 09:31:41 adam Exp $
|
|
|
|
# This file provides common templates for replacing #! interpreters
|
|
# in script files.
|
|
#
|
|
# The following variables may be set by a package:
|
|
#
|
|
# REPLACE_AWK
|
|
# REPLACE_BASH
|
|
# REPLACE_CSH
|
|
# REPLACE_KSH
|
|
# REPLACE_PERL
|
|
# REPLACE_SH
|
|
# Lists of files relative to WRKSRC in which the #! interpreter
|
|
# should be replaced by the pkgsrc one. If any directories
|
|
# appear in the lists, they are silenty skipped, assuming that
|
|
# they result from shell globbing expressions.
|
|
#
|
|
# Use REPLACE_SH for shell programs that don't need any
|
|
# special features from bash, and REPLACE_BASH for the
|
|
# others.
|
|
#
|
|
# Note that in all the above cases, you have to add the needed
|
|
# tools manually to USE_TOOLS, since there is no way to detect
|
|
# automatically whether a tool should be a build-time or a
|
|
# run-time dependency.
|
|
#
|
|
# Packages may also add their own interpreter replacements, which should
|
|
# just look like the examples below. For the REPLACE_INTERPRETER
|
|
# variable, all identifiers starting with "sys-" are reserved for the
|
|
# pkgsrc infrastructure. All others may be used freely.
|
|
#
|
|
# Keywords: replace_interpreter interpreter interp hashbang #!
|
|
# Keywords: awk bash csh ksh perl sh
|
|
|
|
######################################################################
|
|
### replace-interpreter (PRIVATE)
|
|
######################################################################
|
|
### replace-interpreter replaces paths to interpreters in scripts with
|
|
### the paths to the pkgsrc-managed interpreters.
|
|
###
|
|
do-configure-pre-hook: replace-interpreter
|
|
|
|
REPLACE_INTERPRETER?= # none
|
|
REPLACE_AWK?= # none
|
|
REPLACE_BASH?= # none
|
|
REPLACE_CSH?= # none
|
|
REPLACE_KSH?= # none
|
|
REPLACE_PERL?= # none
|
|
REPLACE_SH?= # none
|
|
|
|
.if !empty(REPLACE_AWK:M*)
|
|
REPLACE_INTERPRETER+= sys-AWK
|
|
REPLACE.sys-AWK.old= .*awk
|
|
REPLACE.sys-AWK.new= ${AWK}
|
|
REPLACE_FILES.sys-AWK= ${REPLACE_AWK}
|
|
.endif
|
|
|
|
.if !empty(REPLACE_BASH:M*)
|
|
REPLACE_INTERPRETER+= sys-bash
|
|
REPLACE.sys-bash.old= .*sh
|
|
REPLACE.sys-bash.new= ${BASH}
|
|
REPLACE_FILES.sys-bash= ${REPLACE_BASH}
|
|
.endif
|
|
|
|
.if !empty(REPLACE_CSH:M*)
|
|
REPLACE_INTERPRETER+= sys-csh
|
|
REPLACE.sys-csh.old= .*csh
|
|
REPLACE.sys-csh.new= ${CSH}
|
|
REPLACE_FILES.sys-csh= ${REPLACE_CSH}
|
|
.endif
|
|
|
|
.if !empty(REPLACE_KSH:M*)
|
|
REPLACE_INTERPRETER+= sys-ksh
|
|
REPLACE.sys-ksh.old= [^[:space:]]*sh
|
|
REPLACE.sys-ksh.new= ${TOOLS_PATH.ksh}
|
|
REPLACE_FILES.sys-ksh= ${REPLACE_KSH}
|
|
.endif
|
|
|
|
.if !empty(REPLACE_PERL:M*)
|
|
REPLACE_INTERPRETER+= sys-Perl
|
|
REPLACE.sys-Perl.old= .*perl[^[:space:]]*
|
|
REPLACE.sys-Perl.new= ${PERL5}
|
|
REPLACE_FILES.sys-Perl= ${REPLACE_PERL}
|
|
.endif
|
|
|
|
.if !empty(REPLACE_SH:M*)
|
|
REPLACE_INTERPRETER+= sys-sh
|
|
REPLACE.sys-sh.old= [^[:space:]]*sh
|
|
REPLACE.sys-sh.new= ${SH}
|
|
REPLACE_FILES.sys-sh= ${REPLACE_SH}
|
|
.endif
|
|
# sed regexp to match optional "/usr/bin/env" followed by one or more spaces
|
|
REPLACE.optional-env-space= \(/usr/bin/env[[:space:]][[:space:]]*\)\{0,1\}
|
|
|
|
.PHONY: replace-interpreter
|
|
replace-interpreter:
|
|
.for _lang_ in ${REPLACE_INTERPRETER}
|
|
. if defined(REPLACE_FILES.${_lang_}) && !empty(REPLACE_FILES.${_lang_}:M*)
|
|
@${STEP_MSG} "Replacing ${_lang_:S/^sys-//} interpreter in "${REPLACE_FILES.${_lang_}:M*:Q}"."
|
|
${RUN} set -u; \
|
|
cd ${WRKSRC}; \
|
|
for f in ${REPLACE_FILES.${_lang_}}; do \
|
|
if [ -f "$${f}" ]; then \
|
|
${SED} -e '1s|^#![[:space:]]*${REPLACE.optional-env-space}${REPLACE.${_lang_}.old}|#!${REPLACE.${_lang_}.new}|' \
|
|
< "$${f}" > "$${f}.new"; \
|
|
if [ -x "$${f}" ]; then \
|
|
${CHMOD} a+x "$${f}.new"; \
|
|
fi; \
|
|
if ${CMP} -s "$${f}.new" "$${f}"; then \
|
|
${INFO_MSG} "[replace-interpreter] Nothing changed in $${f}."; \
|
|
${RM} -f "$${f}.new"; \
|
|
else \
|
|
${MV} -f "$${f}.new" "$${f}"; \
|
|
fi; \
|
|
elif [ -d "$$f" ]; then \
|
|
${SHCOMMENT} "Ignore it, most probably comes from shell globs"; \
|
|
else \
|
|
${WARNING_MSG} "[replace-interpreter] Skipping non-existent file \"$$f\"."; \
|
|
fi; \
|
|
done
|
|
. else
|
|
@${WARNING_MSG} "[replace-interpreter] Empty list of files for ${_lang_}."
|
|
. endif
|
|
.endfor
|
|
|
|
_VARGROUPS+= interp
|
|
.for varname in REPLACE_AWK REPLACE_BASH REPLACE_CSH REPLACE_KSH REPLACE_PERL REPLACE_SH
|
|
_PKG_VARS.interp+= ${varname}
|
|
.endfor
|
|
_PKG_VARS.interp+= REPLACE_INTERPRETER
|
|
.for interp in ${REPLACE_INTERPRETER}
|
|
_DEF_VARS.interp+= REPLACE.${interp}.old REPLACE.${interp}.new REPLACE_FILES.${interp}
|
|
.endfor
|