1#!@BSHELL@ - 2# 3# $NetBSD: host-mkdep.in,v 1.33 2023/07/10 08:55:44 rin Exp $ 4# 5# Copyright (c) 1991, 1993 6# The Regents of the University of California. All rights reserved. 7# 8# Redistribution and use in source and binary forms, with or without 9# modification, are permitted provided that the following conditions 10# are met: 11# 1. Redistributions of source code must retain the above copyright 12# notice, this list of conditions and the following disclaimer. 13# 2. Redistributions in binary form must reproduce the above copyright 14# notice, this list of conditions and the following disclaimer in the 15# documentation and/or other materials provided with the distribution. 16# 3. All advertising materials mentioning features or use of this software 17# must display the following acknowledgement: 18# This product includes software developed by the University of 19# California, Berkeley and its contributors. 20# 4. Neither the name of the University nor the names of its contributors 21# may be used to endorse or promote products derived from this software 22# without specific prior written permission. 23# 24# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34# SUCH DAMAGE. 35# 36# @(#)mkdep.old.compiler 8.1 (Berkeley) 6/6/93 37# 38 39APPEND=false 40MERGE=false 41OPTIONAL=false 42AWK_OPTIONAL= 43QUIET=false 44CPPFLAGS= 45NEWEXT=.o 46PREFIX= 47OUTFILE=.depend 48SRCS= 49 50usage() 51{ 52 echo "Usage: $0 [-adopq] [-s .suffixes] [-f .depend] -- [flags] file ..." >&2 53 exit 1 54} 55 56set_objlist() 57{ 58 if [ -n "$NEWEXT" ]; then 59 oifs="$IFS" 60 IFS=" ," 61 set -- $NEWEXT 62 IFS="$oifs" 63 objlist= 64 for suf in "$@"; do 65 objlist="$objlist${objlist:+ }$PREFIX$file$suf" 66 done 67 else 68 objlist="$PREFIX$file" 69 fi 70} 71 72# A getopt compatible command line parser in shell comands. 73# (don't trust the shell builtin getopts to be in a known state on error) 74while [ $# -gt 0 ]; do 75 option="${1#-}" 76 [ "$option" = "$1" -o -z "$option" ] && break 77 while 78 optarg="${option#?}" 79 option="${option%$optarg}" 80 81 case "-$option" in 82 -a) APPEND=true;; 83 -d) MERGE=true;; 84 -o) OPTIONAL=true; AWK_OPTIONAL='print ".OPTIONAL:" $0';; 85 -p) NEWEXT=;; 86 -q) QUIET=true;; 87 -[iv]) ;; 88 89 -[fPs]) # Options with arguments 90 [ -z "$optarg" ] && { 91 [ $# = 1 ] && usage 92 shift 93 optarg="$1" 94 } 95 case "-$option" in 96 -f) OUTFILE="$optarg";; 97 -P) PREFIX="$optarg";; 98 -s) NEWEXT="$optarg";; 99 esac 100 optarg= 101 ;; 102 103 --) [ -z "$optarg" ] && shift 104 break 2 105 ;; 106 107 *) $MERGE && usage 108 break 2; 109 ;; 110 esac 111 [ -n "$optarg" ] 112 do 113 option="$optarg" 114 done 115 shift 116done 117 118[ $# = 0 ] && usage 119 120if $MERGE; then 121 SRCS="$*" 122else 123 # 124 # Process argument list. 125 # This is tricky, because arguments may contain spaces and other 126 # escapes characters. The argument list is used like a tail queue. 127 # $cppargs has one x for each unprocessed argument, so when an 128 # argument is processed, it is shifted and the corresponding number 129 # of x's is removed. The advantage to counting is that suffix removal 130 # works without fork. 131 # 132 cppargs= 133 for arg; do 134 cppargs="x$cppargs" 135 done 136 while [ -n "$cppargs" ]; do 137 case "$1" in 138 -L) # takes an arg, but ignored 139 shift 2 140 cppargs=${cppargs%xx} 141 ;; 142 143 -c|-[lLMOW]*) # takes no extra args 144 shift 145 cppargs=${cppargs%x} 146 ;; 147 148 -[IDU]*) 149 set -- "$@" "$1" 150 shift 151 cppargs=${cppargs%x} 152 ;; 153 154 -[IDU]|-include|-iquote|-isystem|-isysroot) 155 set -- "$@" "$1" "$2" 156 shift 2 157 cppargs=${cppargs%xx} 158 ;; 159 160 -isystem-cxx|-cxx-isystem) 161 set -- "$@" "-isystem" "$2" 162 shift 2 163 cppargs=${cppargs%xx} 164 ;; 165 -std=*) 166 set -- "$@" "$1" 167 shift 168 cppargs=${cppargs%x} 169 ;; 170 171 -no-cpp-precomp) # This is a Darwin-specific option. 172 set -- "$@" "$1" 173 shift 174 cppargs=${cppargs%x} 175 ;; 176 177 -nostdinc*) # This is a gcc/g++ ism; ignore if not gcc/g++ 178 case "@CFLAGS@" in 179 *-O2*) # Autoconf puts -O2 when gcc only 180 set -- "$@" "$1" 181 ;; 182 esac 183 shift 184 cppargs=${cppargs%x} 185 ;; 186 --sysroot*) 187 shift 188 ;; 189 -[iv]) 190 shift 191 ;; 192 -*) 193 echo "$0: Unknown option: $1" 1>&2 # all other -options 194 exit 1 195 ;; 196 197 *) 198 SRCS="$SRCS $1" # source file 199 shift 200 cppargs=${cppargs%x} 201 ;; 202 esac 203 done 204fi 205 206[ -z "$SRCS" ] && usage 207 208TMP=/tmp/mkdep$$ 209rm -f $TMP 210 211trap 'rm -f $TMP; exit 1' 1 2 3 13 15 212 213if $MERGE; then 214 for f in $SRCS; do 215 if [ ! -f "$f" ]; then 216 if ! $QUIET; then echo "$0: Ignoring $f" >&2; fi 217 continue 218 fi 219 while IFS=':'; read target dependents; do 220 IFS= 221 t1="${target#* }" 222 file="${target%.o}" 223 if [ "$t1" = "$target" -a "$file" != "$target" ]; then 224 set_objlist $file 225 target="$objlist" 226 fi 227 echo "$target:$dependents" 228 if "$OPTIONAL"; then 229 echo ".OPTIONAL:$dependents" 230 fi 231 done <$f 232 done >$TMP 233else 234 for f in $SRCS; do 235 file=${f##*/} 236 file=${file%.*} 237 set_objlist $file 238 239 ( (@CPP@ "$@" $f; echo $? >&3) | @AWK@ ' 240 /^#/ { 241 # Be as tolerant as possible. 242 sub(/^#(line)? [ 0-9]*"?/, "") 243 sub(/^#(pragma).*/, "") 244 sub(/^<.*/, "") 245 sub(/".*$/, "") 246 sub(/^\.\//, "") 247 sub(/ [ 0-9]*$/, "") 248 249 if ($0 in seenfiles) next 250 if ($0 ~ /y.tab.c/) next 251 252 seenfiles[$0] = 1 253 print "'"$objlist"'" ": " $0 254 '"$AWK_OPTIONAL"' 255 } 256 ' >> $TMP) 3>&1 | (read a; exit $a) 257 done 258fi 259 260if $APPEND; then 261 cat $TMP >> $OUTFILE 262else 263 cat $TMP > $OUTFILE 264fi 265 266rm -f $TMP 267exit 0 268