#!/bin/bash # # Generates Makefile containing dependencies for each package # # Copyright (C) 2014-2023 Ryan 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 . ## # 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" ] && { export GEN_MAKE="$( pwd )/$0" exec "$GEN_MAKE" "$@" } until [ $# -eq 0 ]; do ( path="${1%%/}" cd "$path" || exit $? deps=$( find -maxdepth 1 -iname '*.dep' -o -iname '*.typelist' ) 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##*/}" sansext="${d%.*}" # this might be derived from another file # TODO: handle all cases, not just typelists! if [ -f "$sansext.typelist" ]; then echo "$path/$sansext.xml: $path/$sansext.typelist" fi # begin this file's dependencies echo -n "$path/$sansext.xmlo: $path/$sansext.xml " # only further process dependency files if [[ ! $dpath =~ .dep$ ]]; then echo continue; fi # output deps while read dep; do ext=.xmlo # a trailing `$' means "leave the path alone"; don't automatically # add the extension in this case if [[ "$dep" =~ \$$ ]]; then dep="${dep:0:-1}" ext= fi # 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}$ext" continue fi echo -n ' ' resolv-path "$path/$dep$ext" done < "$d" echo done # recurse on every subdirectory for p in */; do [ "$p" == ./ -o "$p" == ../ ] && continue [ "$p" == node_modules/ -o "$p" == tame/ ] && continue [ ! -d "$p" ] || ( cd "$OLDPWD" && "$GEN_MAKE" "$path/$p" ) || { echo "fatal: failed to recurse on $( pwd )/$path/$p" >&2 exit 1 } done ); shift; done