summaryrefslogtreecommitdiff
path: root/mk/subst.mk
diff options
context:
space:
mode:
Diffstat (limited to 'mk/subst.mk')
-rw-r--r--mk/subst.mk80
1 files changed, 80 insertions, 0 deletions
diff --git a/mk/subst.mk b/mk/subst.mk
new file mode 100644
index 00000000000..e360d39677a
--- /dev/null
+++ b/mk/subst.mk
@@ -0,0 +1,80 @@
+# $NetBSD: subst.mk,v 1.1 2003/08/27 11:24:37 jlam Exp $
+#
+# This Makefile fragment implements a general text replacement facility
+# for different classes of files in ${WRKSRC}. For each class of files,
+# a target <class>-subst is created to perform the text replacement.
+#
+# The following variables are used:
+#
+# SUBST_STAGE.<class>
+# "stage" at which we do the text replacement, e.g. pre-configure,
+# post-build, etc.
+#
+# SUBST_MESSAGE.<class>
+# message to display, noting what is being substituted
+#
+# SUBST_FILES.<class>
+# files on which to run the substitution; these are relative to
+# ${WRKSRC}
+#
+# SUBST_SED.<class>
+# sed(1) substitution expression to run on the specified files
+
+ECHO_SUBST_MSG?= ${ECHO}
+
+# _SUBST_IS_TEXT_FILE returns 0 if $${file} is a text file.
+_SUBST_IS_TEXT_FILE?= \
+ ${FILE_CMD} $${file} | ${EGREP} "(shell script|text)" >/dev/null 2>&1
+
+.for _class_ in ${SUBST_CLASSES}
+_SUBST_COOKIE.${_class_}= ${WRKDIR}/.subst_${_class_}_done
+
+SUBST_TARGETS+= subst-${_class_}
+_SUBST_TARGETS.${_class_}= subst-${_class_}-message
+_SUBST_TARGETS.${_class_}+= ${_SUBST_COOKIE.${_class_}}
+_SUBST_TARGETS.${_class_}+= subst-${_class_}-cookie
+
+.ORDER: ${_SUBST_TARGETS.${_class_}}
+
+.if defined(SUBST_STAGE.${_class_})
+${SUBST_STAGE.${_class_}}: subst-${_class_}
+.endif
+
+.PHONY: subst-${_class_}
+subst-${_class_}: ${_SUBST_TARGETS.${_class_}}
+
+.PHONY: subst-${_class_}-message
+ subst-${_class_}-message:
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ ${ECHO_SUBST_MSG} "=> ${SUBST_MESSAGE.${_class_}}"
+
+.PHONY: subst-${_class_}-cookie
+ subst-${_class_}-cookie:
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ ${TOUCH} ${TOUCH_FLAGS} ${_SUBST_COOKIE.${_class_}}
+
+${_SUBST_COOKIE.${_class_}}:
+. if !empty(SUBST_SED.${_class_})
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ cd ${WRKSRC}; \
+ files="${SUBST_FILES.${_class_}}"; \
+ case "$$files" in \
+ "") ;; \
+ *) for file in $${files}; do \
+ if ${_SUBST_IS_TEXT_FILE}; then \
+ ${MV} -f $$file $$file.subst.sav; \
+ ${SED} ${SUBST_SED.${_class_}} \
+ $$file.subst.sav > $$file; \
+ if [ -x $$file.subst.sav ]; then \
+ ${CHMOD} +x $$file; \
+ fi; \
+ if ${CMP} -s $$file.subst.sav $$file; then \
+ ${MV} -f $$file.subst.sav $$file; \
+ else \
+ ${ECHO} $$file >> ${.TARGET}; \
+ fi; \
+ fi; \
+ done ;; \
+ esac
+. endif
+.endfor