xref: /freebsd/share/mk/meta2deps.sh (revision f974ced3)
17750ad47SMarcel Moolenaar#!/bin/sh
27750ad47SMarcel Moolenaar
37750ad47SMarcel Moolenaar# NAME:
47750ad47SMarcel Moolenaar#	meta2deps.sh - extract useful info from .meta files
57750ad47SMarcel Moolenaar#
67750ad47SMarcel Moolenaar# SYNOPSIS:
77750ad47SMarcel Moolenaar#	meta2deps.sh SB="SB" "meta" ...
87750ad47SMarcel Moolenaar#
97750ad47SMarcel Moolenaar# DESCRIPTION:
107750ad47SMarcel Moolenaar#	This script looks each "meta" file and extracts the
117750ad47SMarcel Moolenaar#	information needed to deduce build and src dependencies.
127750ad47SMarcel Moolenaar#
137750ad47SMarcel Moolenaar#	To do this, we extract the 'CWD' record as well as all the
147750ad47SMarcel Moolenaar#	syscall traces which describe 'R'ead, 'C'hdir and 'E'xec
157750ad47SMarcel Moolenaar#	syscalls.
167750ad47SMarcel Moolenaar#
177750ad47SMarcel Moolenaar#	The typical meta file looks like::
187750ad47SMarcel Moolenaar#.nf
197750ad47SMarcel Moolenaar#
207750ad47SMarcel Moolenaar#	# Meta data file "path"
217750ad47SMarcel Moolenaar#	CMD "command-line"
227750ad47SMarcel Moolenaar#	CWD "cwd"
237750ad47SMarcel Moolenaar#	TARGET "target"
247750ad47SMarcel Moolenaar#	-- command output --
257750ad47SMarcel Moolenaar#	-- filemon acquired metadata --
267750ad47SMarcel Moolenaar#	# buildmon version 2
277750ad47SMarcel Moolenaar#	V 2
287750ad47SMarcel Moolenaar#	E "pid" "path"
297750ad47SMarcel Moolenaar#	R "pid" "path"
307750ad47SMarcel Moolenaar#	C "pid" "cwd"
317750ad47SMarcel Moolenaar#	R "pid" "path"
327750ad47SMarcel Moolenaar#	X "pid" "status"
337750ad47SMarcel Moolenaar#.fi
347750ad47SMarcel Moolenaar#
357750ad47SMarcel Moolenaar#	The fact that all the syscall entry lines start with a single
367750ad47SMarcel Moolenaar#	character make these files quite easy to process using sed(1).
377750ad47SMarcel Moolenaar#
387750ad47SMarcel Moolenaar#	To simplify the logic the 'CWD' line is made to look like a
397750ad47SMarcel Moolenaar#	normal 'C'hdir entry, and "cwd" is remembered so that it can
407750ad47SMarcel Moolenaar#	be prefixed to any "path" which is not absolute.
417750ad47SMarcel Moolenaar#
427750ad47SMarcel Moolenaar#	If the "path" being read ends in '.srcrel' it is the content
437750ad47SMarcel Moolenaar#	of (actually the first line of) that file that we are
447750ad47SMarcel Moolenaar#	interested in.
457750ad47SMarcel Moolenaar#
467750ad47SMarcel Moolenaar#	Any "path" which lies outside of the sandbox "SB" is generally
477750ad47SMarcel Moolenaar#	not of interest and is ignored.
487750ad47SMarcel Moolenaar#
497750ad47SMarcel Moolenaar#	The output, is a set of absolute paths with "SB" like:
507750ad47SMarcel Moolenaar#.nf
517750ad47SMarcel Moolenaar#
527750ad47SMarcel Moolenaar#	$SB/obj-i386/bsd/include
53f974ced3SSimon J. Gerraty#	$SB/obj-i386/bsd/lib/csu/i386
547750ad47SMarcel Moolenaar#	$SB/obj-i386/bsd/lib/libc
557750ad47SMarcel Moolenaar#	$SB/src/bsd/include
567750ad47SMarcel Moolenaar#	$SB/src/bsd/sys/i386/include
577750ad47SMarcel Moolenaar#	$SB/src/bsd/sys/sys
587750ad47SMarcel Moolenaar#	$SB/src/pan-release/rtsock
597750ad47SMarcel Moolenaar#	$SB/src/pfe-shared/include/jnx
607750ad47SMarcel Moolenaar#.fi
617750ad47SMarcel Moolenaar#
627750ad47SMarcel Moolenaar#	Which can then be further processed by 'gendirdeps.mk'
637750ad47SMarcel Moolenaar#
647750ad47SMarcel Moolenaar#	If we are passed 'DPDEPS='"dpdeps", then for each src file
657750ad47SMarcel Moolenaar#	outside of "CURDIR" we read, we output a line like:
667750ad47SMarcel Moolenaar#.nf
677750ad47SMarcel Moolenaar#
687750ad47SMarcel Moolenaar#	DPDEPS_$path += $RELDIR
697750ad47SMarcel Moolenaar#.fi
707750ad47SMarcel Moolenaar#
717750ad47SMarcel Moolenaar#	with "$path" geting turned into reldir's, so that we can end
727750ad47SMarcel Moolenaar#	up with a list of all the directories which depend on each src
737750ad47SMarcel Moolenaar#	file in another directory.  This can allow for efficient yet
747750ad47SMarcel Moolenaar#	complete testing of changes.
757750ad47SMarcel Moolenaar
767750ad47SMarcel Moolenaar
777750ad47SMarcel Moolenaar# RCSid:
78f974ced3SSimon J. Gerraty#	$Id: meta2deps.sh,v 1.21 2024/02/17 17:26:57 sjg Exp $
797750ad47SMarcel Moolenaar
80f974ced3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
81f974ced3SSimon J. Gerraty#
82ccfb9654SSimon J. Gerraty# Copyright (c) 2010-2013, Juniper Networks, Inc.
83ccfb9654SSimon J. Gerraty# All rights reserved.
847750ad47SMarcel Moolenaar#
857750ad47SMarcel Moolenaar# Redistribution and use in source and binary forms, with or without
867750ad47SMarcel Moolenaar# modification, are permitted provided that the following conditions
877750ad47SMarcel Moolenaar# are met:
887750ad47SMarcel Moolenaar# 1. Redistributions of source code must retain the above copyright
897750ad47SMarcel Moolenaar#    notice, this list of conditions and the following disclaimer.
907750ad47SMarcel Moolenaar# 2. Redistributions in binary form must reproduce the above copyright
917750ad47SMarcel Moolenaar#    notice, this list of conditions and the following disclaimer in the
927750ad47SMarcel Moolenaar#    documentation and/or other materials provided with the distribution.
937750ad47SMarcel Moolenaar#
947750ad47SMarcel Moolenaar# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
957750ad47SMarcel Moolenaar# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
967750ad47SMarcel Moolenaar# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
977750ad47SMarcel Moolenaar# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
987750ad47SMarcel Moolenaar# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
997750ad47SMarcel Moolenaar# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1007750ad47SMarcel Moolenaar# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1017750ad47SMarcel Moolenaar# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1027750ad47SMarcel Moolenaar# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1037750ad47SMarcel Moolenaar# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1047750ad47SMarcel Moolenaar# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1057750ad47SMarcel Moolenaar
1067750ad47SMarcel Moolenaarmeta2src() {
1077750ad47SMarcel Moolenaar    cat /dev/null "$@" |
1087750ad47SMarcel Moolenaar    sed -n '/^R .*\.[chyl]$/s,^..[0-9]* ,,p' |
1097750ad47SMarcel Moolenaar    sort -u
1107750ad47SMarcel Moolenaar}
1117750ad47SMarcel Moolenaar
1127750ad47SMarcel Moolenaarmeta2dirs() {
1137750ad47SMarcel Moolenaar    cat /dev/null "$@" |
1147750ad47SMarcel Moolenaar    sed -n '/^R .*\/.*\.[a-z0-9][^\/]*$/s,^..[0-9]* \(.*\)/[^/]*$,\1,p' |
1157750ad47SMarcel Moolenaar    sort -u
1167750ad47SMarcel Moolenaar}
1177750ad47SMarcel Moolenaar
11806137b0fSSimon J. Gerratyadd_list() {
11906137b0fSSimon J. Gerraty    sep=' '
12006137b0fSSimon J. Gerraty    suffix=
12106137b0fSSimon J. Gerraty    while :
12206137b0fSSimon J. Gerraty    do
12306137b0fSSimon J. Gerraty	case "$1" in
12406137b0fSSimon J. Gerraty	"|") sep="$1"; shift;;
12506137b0fSSimon J. Gerraty	-s) suffix="$2"; shift 2;;
12606137b0fSSimon J. Gerraty	*) break;;
12706137b0fSSimon J. Gerraty	esac
12806137b0fSSimon J. Gerraty    done
12906137b0fSSimon J. Gerraty    name=$1
13006137b0fSSimon J. Gerraty    shift
13106137b0fSSimon J. Gerraty    eval list="\$$name"
13206137b0fSSimon J. Gerraty    for top in "$@"
13306137b0fSSimon J. Gerraty    do
13406137b0fSSimon J. Gerraty	case "$sep$list$sep" in
13506137b0fSSimon J. Gerraty	*"$sep$top$suffix$sep"*) continue;;
13606137b0fSSimon J. Gerraty	esac
13706137b0fSSimon J. Gerraty	list="${list:+$list$sep}$top$suffix"
13806137b0fSSimon J. Gerraty    done
13906137b0fSSimon J. Gerraty    eval "$name=\"$list\""
14006137b0fSSimon J. Gerraty}
14106137b0fSSimon J. Gerraty
142bf7aa99aSSimon J. Gerraty# some Linux systems have deprecated egrep in favor of grep -E
143bf7aa99aSSimon J. Gerraty# but not everyone supports that
144bf7aa99aSSimon J. Gerratycase "`echo bmake | egrep 'a|b' 2>&1`" in
145bf7aa99aSSimon J. Gerratybmake) ;;
146bf7aa99aSSimon J. Gerraty*) egrep() { grep -E "$@"; }
147bf7aa99aSSimon J. Gerratyesac
148bf7aa99aSSimon J. Gerraty
149ccfb9654SSimon J. Gerraty_excludes_f() {
150ccfb9654SSimon J. Gerraty    egrep -v "$EXCLUDES"
151ccfb9654SSimon J. Gerraty}
152ccfb9654SSimon J. Gerraty
153960b77beSSimon J. Gerratyerror() {
154960b77beSSimon J. Gerraty    echo "ERROR: $@" >&2
155960b77beSSimon J. Gerraty    exit 1
156960b77beSSimon J. Gerraty}
157960b77beSSimon J. Gerraty
1587750ad47SMarcel Moolenaarmeta2deps() {
1597750ad47SMarcel Moolenaar    DPDEPS=
16006137b0fSSimon J. Gerraty    SRCTOPS=$SRCTOP
16106137b0fSSimon J. Gerraty    OBJROOTS=
162ccfb9654SSimon J. Gerraty    EXCLUDES=
1637750ad47SMarcel Moolenaar    while :
1647750ad47SMarcel Moolenaar    do
1657750ad47SMarcel Moolenaar	case "$1" in
1667750ad47SMarcel Moolenaar	*=*) eval export "$1"; shift;;
16706137b0fSSimon J. Gerraty	-a) MACHINE_ARCH=$2; shift 2;;
16806137b0fSSimon J. Gerraty	-m) MACHINE=$2; shift 2;;
16906137b0fSSimon J. Gerraty	-C) CURDIR=$2; shift 2;;
17006137b0fSSimon J. Gerraty	-H) HOST_TARGET=$2; shift 2;;
17106137b0fSSimon J. Gerraty	-S) add_list SRCTOPS $2; shift 2;;
17206137b0fSSimon J. Gerraty	-O) add_list OBJROOTS $2; shift 2;;
173ccfb9654SSimon J. Gerraty	-X) add_list EXCLUDES '|' $2; shift 2;;
17406137b0fSSimon J. Gerraty	-R) RELDIR=$2; shift 2;;
17506137b0fSSimon J. Gerraty	-T) TARGET_SPEC=$2; shift 2;;
1767750ad47SMarcel Moolenaar	*) break;;
1777750ad47SMarcel Moolenaar	esac
1787750ad47SMarcel Moolenaar    done
1797750ad47SMarcel Moolenaar
18006137b0fSSimon J. Gerraty    _th= _o=
18106137b0fSSimon J. Gerraty    case "$MACHINE" in
18206137b0fSSimon J. Gerraty    host) _ht=$HOST_TARGET;;
18306137b0fSSimon J. Gerraty    esac
18406137b0fSSimon J. Gerraty
18506137b0fSSimon J. Gerraty    for o in $OBJROOTS
18606137b0fSSimon J. Gerraty    do
18706137b0fSSimon J. Gerraty	case "$MACHINE,/$o/" in
18806137b0fSSimon J. Gerraty	host,*$HOST_TARGET*) ;;
18906137b0fSSimon J. Gerraty	*$MACHINE*|*${TARGET_SPEC:-$MACHINE}*) ;;
19006137b0fSSimon J. Gerraty	*) add_list _o $o; continue;;
19106137b0fSSimon J. Gerraty	esac
19206137b0fSSimon J. Gerraty	for x in $_ht $TARGET_SPEC $MACHINE
19306137b0fSSimon J. Gerraty	do
19406137b0fSSimon J. Gerraty	    case "$o" in
19506137b0fSSimon J. Gerraty	    "") continue;;
19606137b0fSSimon J. Gerraty	    */$x/) add_list _o ${o%$x/}; o=;;
19706137b0fSSimon J. Gerraty	    */$x) add_list _o ${o%$x}; o=;;
19806137b0fSSimon J. Gerraty	    *$x/) add_list _o ${o%$x/}; o=;;
19906137b0fSSimon J. Gerraty	    *$x) add_list _o ${o%$x}; o=;;
20006137b0fSSimon J. Gerraty	    esac
20106137b0fSSimon J. Gerraty	done
20206137b0fSSimon J. Gerraty    done
20306137b0fSSimon J. Gerraty    OBJROOTS="$_o"
20406137b0fSSimon J. Gerraty
20506137b0fSSimon J. Gerraty    case "$OBJTOP" in
20606137b0fSSimon J. Gerraty    "")
20706137b0fSSimon J. Gerraty	for o in $OBJROOTS
20806137b0fSSimon J. Gerraty	do
20906137b0fSSimon J. Gerraty	    OBJTOP=$o${TARGET_SPEC:-$MACHINE}
21006137b0fSSimon J. Gerraty	    break
21106137b0fSSimon J. Gerraty	done
21206137b0fSSimon J. Gerraty	;;
21306137b0fSSimon J. Gerraty    esac
21406137b0fSSimon J. Gerraty    src_re=
21506137b0fSSimon J. Gerraty    obj_re=
21606137b0fSSimon J. Gerraty    add_list '|' -s '/*' src_re $SRCTOPS
21706137b0fSSimon J. Gerraty    add_list '|' -s '*' obj_re $OBJROOTS
21806137b0fSSimon J. Gerraty
2197750ad47SMarcel Moolenaar    [ -z "$RELDIR" ] && unset DPDEPS
2207750ad47SMarcel Moolenaar    tf=/tmp/m2d$$-$USER
2217750ad47SMarcel Moolenaar    rm -f $tf.*
2227750ad47SMarcel Moolenaar    trap 'rm -f $tf.*; trap 0' 0
2237750ad47SMarcel Moolenaar
2247750ad47SMarcel Moolenaar    > $tf.dirdep
2257750ad47SMarcel Moolenaar    > $tf.qual
2267750ad47SMarcel Moolenaar    > $tf.srcdep
2277750ad47SMarcel Moolenaar    > $tf.srcrel
2287750ad47SMarcel Moolenaar    > $tf.dpdeps
2297750ad47SMarcel Moolenaar
2307750ad47SMarcel Moolenaar    seenit=
2317750ad47SMarcel Moolenaar    seensrc=
2327750ad47SMarcel Moolenaar    lpid=
233ccfb9654SSimon J. Gerraty    case "$EXCLUDES" in
234ccfb9654SSimon J. Gerraty    "") _excludes=cat;;
235ccfb9654SSimon J. Gerraty    *) _excludes=_excludes_f;;
236ccfb9654SSimon J. Gerraty    esac
237ccfb9654SSimon J. Gerraty    # handle @list files
238ccfb9654SSimon J. Gerraty    case "$@" in
239ccfb9654SSimon J. Gerraty    *@[!.]*)
240ccfb9654SSimon J. Gerraty	for f in "$@"
241ccfb9654SSimon J. Gerraty	do
242ccfb9654SSimon J. Gerraty	    case "$f" in
243ccfb9654SSimon J. Gerraty	    *.meta) cat $f;;
244ccfb9654SSimon J. Gerraty	    @*) xargs cat < ${f#@};;
245ccfb9654SSimon J. Gerraty	    *) cat $f;;
246ccfb9654SSimon J. Gerraty	    esac
247ccfb9654SSimon J. Gerraty	done
248ccfb9654SSimon J. Gerraty	;;
249ccfb9654SSimon J. Gerraty    *) cat /dev/null "$@";;
250ccfb9654SSimon J. Gerraty    esac 2> /dev/null |
251bf7aa99aSSimon J. Gerraty    sed -e 's,^CWD,C C,;/^[#CREFLMVX] /!d' -e "s,',,g" |
252bf7aa99aSSimon J. Gerraty    $_excludes | ( version=no epids= xpids= eof_token=no
2537750ad47SMarcel Moolenaar    while read op pid path junk
2547750ad47SMarcel Moolenaar    do
2557750ad47SMarcel Moolenaar	: op=$op pid=$pid path=$path
2567750ad47SMarcel Moolenaar	# we track cwd and ldir (of interest) per pid
2577750ad47SMarcel Moolenaar	# CWD is bmake's cwd
2587750ad47SMarcel Moolenaar	case "$lpid,$pid" in
2597750ad47SMarcel Moolenaar	,C) CWD=$path cwd=$path ldir=$path
2607750ad47SMarcel Moolenaar	    if [ -z "$SB" ]; then
2617750ad47SMarcel Moolenaar		SB=`echo $CWD | sed 's,/obj.*,,'`
2627750ad47SMarcel Moolenaar	    fi
2637750ad47SMarcel Moolenaar	    SRCTOP=${SRCTOP:-$SB/src}
264960b77beSSimon J. Gerraty	    case "$verion" in
265960b77beSSimon J. Gerraty	    no) ;;		# ignore
266960b77beSSimon J. Gerraty	    0) error "no filemon data";;
267960b77beSSimon J. Gerraty	    *) ;;
268960b77beSSimon J. Gerraty	    esac
269960b77beSSimon J. Gerraty	    version=0
270bf7aa99aSSimon J. Gerraty	    case "$eof_token" in
271bf7aa99aSSimon J. Gerraty	    no) ;;		# ignore
272bf7aa99aSSimon J. Gerraty	    0) error "truncated filemon data";;
273bf7aa99aSSimon J. Gerraty	    esac
274bf7aa99aSSimon J. Gerraty	    eof_token=0
2757750ad47SMarcel Moolenaar	    continue
2767750ad47SMarcel Moolenaar	    ;;
2777750ad47SMarcel Moolenaar	$pid,$pid) ;;
278bf7aa99aSSimon J. Gerraty	[1-9]*)
2797750ad47SMarcel Moolenaar	    case "$lpid" in
2807750ad47SMarcel Moolenaar	    "") ;;
281b47b9f6bSSimon J. Gerraty	    *) eval ldir_$lpid=$ldir;;
2827750ad47SMarcel Moolenaar	    esac
2837750ad47SMarcel Moolenaar	    eval ldir=\${ldir_$pid:-$CWD} cwd=\${cwd_$pid:-$CWD}
2847750ad47SMarcel Moolenaar	    lpid=$pid
2857750ad47SMarcel Moolenaar	    ;;
2867750ad47SMarcel Moolenaar	esac
2877750ad47SMarcel Moolenaar
288bf7aa99aSSimon J. Gerraty	: op=$op path=$path
2897750ad47SMarcel Moolenaar	case "$op,$path" in
290bf7aa99aSSimon J. Gerraty	V,*) version=$pid; continue;;
29106137b0fSSimon J. Gerraty	W,*srcrel|*.dirdep) continue;;
2927750ad47SMarcel Moolenaar	C,*)
2937750ad47SMarcel Moolenaar	    case "$path" in
2947750ad47SMarcel Moolenaar	    /*) cwd=$path;;
2957750ad47SMarcel Moolenaar	    *) cwd=`cd $cwd/$path 2> /dev/null && /bin/pwd`;;
2967750ad47SMarcel Moolenaar	    esac
2977750ad47SMarcel Moolenaar	    # watch out for temp dirs that no longer exist
2987750ad47SMarcel Moolenaar	    test -d ${cwd:-/dev/null/no/such} || cwd=$CWD
299b47b9f6bSSimon J. Gerraty	    eval cwd_$pid=$cwd
3007750ad47SMarcel Moolenaar	    continue
3017750ad47SMarcel Moolenaar	    ;;
302b47b9f6bSSimon J. Gerraty	F,*) # $path is new pid
303b47b9f6bSSimon J. Gerraty	    eval cwd_$path=$cwd ldir_$path=$ldir
3047750ad47SMarcel Moolenaar	    continue
3057750ad47SMarcel Moolenaar	    ;;
306bf7aa99aSSimon J. Gerraty	\#,bye) eof_token=1; continue;;
307bf7aa99aSSimon J. Gerraty	\#*) continue;;
3087750ad47SMarcel Moolenaar	*)  dir=${path%/*}
309bf7aa99aSSimon J. Gerraty	    case "$op" in
310bf7aa99aSSimon J. Gerraty	    E)	# setid apps get no tracing so we won't see eXit
311bf7aa99aSSimon J. Gerraty		case `'ls' -l $path 2> /dev/null | sed 's, .*,,'` in
312bf7aa99aSSimon J. Gerraty		*s*) ;;
313bf7aa99aSSimon J. Gerraty		*) epids="$epids $pid";;
314bf7aa99aSSimon J. Gerraty		esac
315bf7aa99aSSimon J. Gerraty		;;
316bf7aa99aSSimon J. Gerraty	    X) xpids="$xpids $pid"; continue;;
317bf7aa99aSSimon J. Gerraty	    esac
3187750ad47SMarcel Moolenaar	    case "$path" in
31906137b0fSSimon J. Gerraty	    $src_re|$obj_re) ;;
3207750ad47SMarcel Moolenaar	    /*/stage/*) ;;
3217750ad47SMarcel Moolenaar	    /*) continue;;
3227750ad47SMarcel Moolenaar	    *)	for path in $ldir/$path $cwd/$path
3237750ad47SMarcel Moolenaar		do
3247750ad47SMarcel Moolenaar			test -e $path && break
3257750ad47SMarcel Moolenaar		done
3267750ad47SMarcel Moolenaar		dir=${path%/*}
3277750ad47SMarcel Moolenaar		;;
3287750ad47SMarcel Moolenaar	    esac
3297750ad47SMarcel Moolenaar	    ;;
3307750ad47SMarcel Moolenaar	esac
3317750ad47SMarcel Moolenaar	# avoid repeating ourselves...
3327750ad47SMarcel Moolenaar	case "$DPDEPS,$seensrc," in
3337750ad47SMarcel Moolenaar	,*)
3347750ad47SMarcel Moolenaar	    case ",$seenit," in
3357750ad47SMarcel Moolenaar	    *,$dir,*) continue;;
3367750ad47SMarcel Moolenaar	    esac
3377750ad47SMarcel Moolenaar	    ;;
3387750ad47SMarcel Moolenaar	*,$path,*) continue;;
3397750ad47SMarcel Moolenaar	esac
3407750ad47SMarcel Moolenaar	# canonicalize if needed
3417750ad47SMarcel Moolenaar	case "/$dir/" in
3427750ad47SMarcel Moolenaar	*/../*|*/./*)
3437750ad47SMarcel Moolenaar	    rdir=$dir
3447750ad47SMarcel Moolenaar	    dir=`cd $dir 2> /dev/null && /bin/pwd`
3457750ad47SMarcel Moolenaar	    seen="$rdir,$dir"
3467750ad47SMarcel Moolenaar	    ;;
3477750ad47SMarcel Moolenaar	*)  seen=$dir;;
3487750ad47SMarcel Moolenaar	esac
3497750ad47SMarcel Moolenaar	case "$dir" in
350210ee5ceSBryan Drewery	${CURDIR:-.}|"") continue;;
35106137b0fSSimon J. Gerraty	$src_re)
3527750ad47SMarcel Moolenaar	    # avoid repeating ourselves...
3537750ad47SMarcel Moolenaar	    case "$DPDEPS,$seensrc," in
3547750ad47SMarcel Moolenaar	    ,*)
3557750ad47SMarcel Moolenaar		case ",$seenit," in
3567750ad47SMarcel Moolenaar		*,$dir,*) continue;;
3577750ad47SMarcel Moolenaar		esac
3587750ad47SMarcel Moolenaar		;;
3597750ad47SMarcel Moolenaar	    esac
3607750ad47SMarcel Moolenaar	    ;;
3617750ad47SMarcel Moolenaar	*)
3627750ad47SMarcel Moolenaar	    case ",$seenit," in
3637750ad47SMarcel Moolenaar	    *,$dir,*) continue;;
3647750ad47SMarcel Moolenaar	    esac
3657750ad47SMarcel Moolenaar	    ;;
3667750ad47SMarcel Moolenaar	esac
3677750ad47SMarcel Moolenaar	if [ -d $path ]; then
3687750ad47SMarcel Moolenaar	    case "$path" in
3697750ad47SMarcel Moolenaar	    */..) ldir=${dir%/*};;
3707750ad47SMarcel Moolenaar	    *) ldir=$path;;
3717750ad47SMarcel Moolenaar	    esac
3727750ad47SMarcel Moolenaar	    continue
3737750ad47SMarcel Moolenaar	fi
3747750ad47SMarcel Moolenaar	[ -f $path ] || continue
3757750ad47SMarcel Moolenaar	case "$dir" in
3767750ad47SMarcel Moolenaar	$CWD) continue;;		# ignore
37706137b0fSSimon J. Gerraty	$src_re)
3787750ad47SMarcel Moolenaar	    seenit="$seenit,$seen"
3797750ad47SMarcel Moolenaar	    echo $dir >> $tf.srcdep
3807750ad47SMarcel Moolenaar	    case "$DPDEPS,$reldir,$seensrc," in
3817750ad47SMarcel Moolenaar	    ,*) ;;
3827750ad47SMarcel Moolenaar	    *)	seensrc="$seensrc,$path"
3837750ad47SMarcel Moolenaar		echo "DPDEPS_$dir/${path##*/} += $RELDIR" >> $tf.dpdeps
3847750ad47SMarcel Moolenaar		;;
3857750ad47SMarcel Moolenaar	    esac
3867750ad47SMarcel Moolenaar	    continue
3877750ad47SMarcel Moolenaar	    ;;
3887750ad47SMarcel Moolenaar	esac
3897750ad47SMarcel Moolenaar	# if there is a .dirdep we cannot skip
3907750ad47SMarcel Moolenaar	# just because we've seen the dir before.
3917750ad47SMarcel Moolenaar	if [ -s $path.dirdep ]; then
3927750ad47SMarcel Moolenaar	    # this file contains:
3937750ad47SMarcel Moolenaar	    # '# ${RELDIR}.<machine>'
3947750ad47SMarcel Moolenaar	    echo $path.dirdep >> $tf.qual
3957750ad47SMarcel Moolenaar	    continue
3967750ad47SMarcel Moolenaar	elif [ -s $dir.dirdep ]; then
3977750ad47SMarcel Moolenaar	    echo $dir.dirdep >> $tf.qual
3987750ad47SMarcel Moolenaar	    seenit="$seenit,$seen"
3997750ad47SMarcel Moolenaar	    continue
4007750ad47SMarcel Moolenaar	fi
4017750ad47SMarcel Moolenaar	seenit="$seenit,$seen"
4027750ad47SMarcel Moolenaar	case "$dir" in
40306137b0fSSimon J. Gerraty	$obj_re)
4047750ad47SMarcel Moolenaar	    echo $dir;;
4057750ad47SMarcel Moolenaar	esac
4067750ad47SMarcel Moolenaar    done > $tf.dirdep
407bf7aa99aSSimon J. Gerraty    : version=$version
408960b77beSSimon J. Gerraty    case "$version" in
409960b77beSSimon J. Gerraty    0) error "no filemon data";;
410bf7aa99aSSimon J. Gerraty    esac
411bf7aa99aSSimon J. Gerraty    : eof_token=$eof_token
412bf7aa99aSSimon J. Gerraty    case "$eof_token" in
413bf7aa99aSSimon J. Gerraty    0) error "truncated filemon data";;
414bf7aa99aSSimon J. Gerraty    esac
415bf7aa99aSSimon J. Gerraty    for p in $epids
416bf7aa99aSSimon J. Gerraty    do
417bf7aa99aSSimon J. Gerraty	: p=$p
418bf7aa99aSSimon J. Gerraty	case " $xpids " in
419bf7aa99aSSimon J. Gerraty	*" $p "*) ;;
420bf7aa99aSSimon J. Gerraty	*) error "missing eXit for pid $p";;
421bf7aa99aSSimon J. Gerraty	esac
422bf7aa99aSSimon J. Gerraty    done ) || exit 1
4237750ad47SMarcel Moolenaar    _nl=echo
4247750ad47SMarcel Moolenaar    for f in $tf.dirdep $tf.qual $tf.srcdep
4257750ad47SMarcel Moolenaar    do
4267750ad47SMarcel Moolenaar	[ -s $f ] || continue
4277750ad47SMarcel Moolenaar	case $f in
4287750ad47SMarcel Moolenaar	*qual) # a list of .dirdep files
429ccfb9654SSimon J. Gerraty	    # we can prefix everything with $OBJTOP to
4307750ad47SMarcel Moolenaar	    # tell gendirdeps.mk that these are
4317750ad47SMarcel Moolenaar	    # DIRDEP entries, since they are already
4327750ad47SMarcel Moolenaar	    # qualified with .<machine> as needed.
4337750ad47SMarcel Moolenaar	    # We strip .$MACHINE though
4347750ad47SMarcel Moolenaar	    xargs cat < $f | sort -u |
43506137b0fSSimon J. Gerraty	    sed "s,^# ,,;s,^,$OBJTOP/,;s,\.${TARGET_SPEC:-$MACHINE}\$,,;s,\.$MACHINE\$,,"
4367750ad47SMarcel Moolenaar	    ;;
4377750ad47SMarcel Moolenaar	*)  sort -u $f;;
4387750ad47SMarcel Moolenaar	esac
4397750ad47SMarcel Moolenaar	_nl=:
4407750ad47SMarcel Moolenaar    done
4417750ad47SMarcel Moolenaar    if [ -s $tf.dpdeps ]; then
4427750ad47SMarcel Moolenaar	case "$DPDEPS" in
4437750ad47SMarcel Moolenaar	*/*) ;;
4447750ad47SMarcel Moolenaar	*) echo > $DPDEPS;;		# the echo is needed!
4457750ad47SMarcel Moolenaar	esac
4467750ad47SMarcel Moolenaar	sort -u $tf.dpdeps |
4477750ad47SMarcel Moolenaar	sed "s,${SRCTOP}/,,;s,${SB_BACKING_SB:-$SB}/src/,," >> $DPDEPS
4487750ad47SMarcel Moolenaar    fi
4497750ad47SMarcel Moolenaar    # ensure we produce _something_ else egrep -v gets upset
4507750ad47SMarcel Moolenaar    $_nl
4517750ad47SMarcel Moolenaar}
4527750ad47SMarcel Moolenaar
4537750ad47SMarcel Moolenaarcase /$0 in
4547750ad47SMarcel Moolenaar*/meta2dep*) meta2deps "$@";;
4557750ad47SMarcel Moolenaar*/meta2dirs*) meta2dirs "$@";;
4567750ad47SMarcel Moolenaar*/meta2src*) meta2src "$@";;
4577750ad47SMarcel Moolenaaresac
458