Mike Gerwitz

Activist for User Freedom

aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'build-aux/gen-make')
-rwxr-xr-xbuild-aux/gen-make111
1 files changed, 111 insertions, 0 deletions
diff --git a/build-aux/gen-make b/build-aux/gen-make
new file mode 100755
index 0000000..e004e6b
--- /dev/null
+++ b/build-aux/gen-make
@@ -0,0 +1,111 @@
+#!/bin/bash
+#
+# Generates Makefile containing dependencies for each package
+#
+# Copyright (C) 2016 R-T Specialty, LLC.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+##
+
+# windows machines may not have the tools to resolve a path, so let's do so
+# ourselves (TODO: there's better (and more performant) ways of doing this than
+# repeated string replacements); TODO: ./
+resolv-path()
+{
+ # no need to do anything if the string does not contain a parent dir reference
+ # (we use this convoluted string replacement check for woe32/64 to prevent
+ # additional spawns (e.g. sed) that would slow us down and because =~ is not
+ # properly supported in msys
+ [[ "$1" != "${1/..\//}"a ]] || {
+ echo "$1"
+ return
+ }
+
+ local path=
+ while read name; do
+ if [ "$name" == .. ]; then
+ [ -n "$path" ] || {
+ echo "warning: will not resolve $1" >&2
+ return 5
+ }
+
+ path="${path%/*}"
+ continue
+ fi
+
+ path="$path/$name"
+ done <<< "${1//\//$'\n'}"
+
+ # echo path without leading /
+ echo -n "${path:1}"
+}
+
+
+# rule for building
+[ -z "$GEN_MAKE" ] && {
+ echo "%.xmlo:: %.tmp"
+ echo -e "\t@rm -f \$@ \$<"
+ [ -n "$xmlo_cmd" ] \
+ && echo -e "\t$xmlo_cmd" \
+ || echo -e "\ttouch \$@"
+
+ echo "%.xmlo:: %.xml | prexmlo"
+ [ -n "$xmlo_cmd" ] \
+ && echo -e "\t$xmlo_cmd" \
+ || echo -e "\ttouch \$@"
+
+ export GEN_MAKE="$( pwd )/$0"
+ exec "$GEN_MAKE" "$@"
+}
+
+until [ $# -eq 0 ]; do (
+ path="${1%%/}"
+ echo "[gen-make] scanning $path" >&2
+
+ cd "$( basename $path )/" || exit $?
+
+ deps=$( find -maxdepth 1 -iname '*.dep' )
+ for dpath in $deps; do
+ # equivalent to basename command; use this since spawning processes on
+ # windoze is slow as shit (originally we did find -exec bashename)
+ d="${dpath##*/}"
+
+ echo "[gen-make] found $path/$d" >&2
+ echo -n "$path/${d%.*}.xmlo:"
+
+ # output deps
+ while read dep; do
+ # if the first character is a slash, then it's relative to the project
+ # root---the resolution has already been done for us!
+ if [ "${dep:0:1}" == '/' ]; then
+ echo -n " ${dep:1}.xmlo"
+ continue
+ fi
+
+ echo -n ' '
+ resolv-path "$path/$dep.xmlo"
+ done < "$d"
+
+ echo
+ done
+
+ # recurse on every subdirectory
+ for p in */; do
+ [ "$p" == ./ -o "$p" == ../ ] && continue
+ [ ! -d "$p" ] || "$GEN_MAKE" "$path/$p" || {
+ echo "fatal: failed to recurse on $( pwd )/$path/$p" >&2
+ exit 1
+ }
+ done
+); shift; done