1#!@BSHELL@ - 2# 3# $NetBSD: host-mkdep.in,v 1.21 2012/08/26 22:37:19 jmmv 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 88 -[fPs]) # Options with arguments 89 [ -z "$optarg" ] && { 90 [ $# = 1 ] && usage 91 shift 92 optarg="$1" 93 } 94 case "-$option" in 95 -f) OUTFILE="$optarg";; 96 -P) PREFIX="$optarg";; 97 -s) NEWEXT="$optarg";; 98 esac 99 optarg= 100 ;; 101 102 --) [ -z "$optarg" ] && shift 103 break 2 104 ;; 105 106 *) $MERGE && usage 107 break 2; 108 ;; 109 esac 110 [ -n "$optarg" ] 111 do 112 option="$optarg" 113 done 114 shift 115done 116 117[ $# = 0 ] && usage 118 119if $MERGE; then 120 SRCS="$*" 121else 122 # 123 # Process argument list. 124 # This is tricky, because arguments may contain spaces and other 125 # escapes characters. The argument list is used like a tail queue. 126 # $cppargs has one x for each unprocessed argument, so when an 127 # argument is processed, it is shifted and the corresponding number 128 # of x's is removed. The advantage to counting is that suffix removal 129 # works without fork. 130 # 131 cppargs= 132 for arg; do 133 cppargs="x$cppargs" 134 done 135 while [ -n "$cppargs" ]; do 136 case "$1" in 137 -L) # takes an arg, but ignored 138 shift 2 139 cppargs=${cppargs%xx} 140 ;; 141 142 -c|-[lLMOW]*) # takes no extra args 143 shift 144 cppargs=${cppargs%x} 145 ;; 146 147 -[IDU]*) 148 set -- "$@" "$1" 149 shift 150 cppargs=${cppargs%x} 151 ;; 152 153 -[IDU]|-include|-isystem|-isysroot) 154 set -- "$@" "$1" "$2" 155 shift 2 156 cppargs=${cppargs%xx} 157 ;; 158 159 -isystem-cxx|-cxx-isystem) 160 set -- "$@" "-isystem" "$2" 161 shift 2 162 cppargs=${cppargs%xx} 163 ;; 164 165 -no-cpp-precomp) # This is a Darwin-specific option. 166 set -- "$@" "$1" 167 shift 168 cppargs=${cppargs%x} 169 ;; 170 171 -nostdinc*) # This is a gcc/g++ ism; ignore if not gcc/g++ 172 case "@CFLAGS@" in 173 *-O2*) # Autoconf puts -O2 when gcc only 174 set -- "$@" "$1" 175 ;; 176 esac 177 shift 178 cppargs=${cppargs%x} 179 ;; 180 181 -*) 182 echo "$0: Unknown option: $1" 1>&2 # all other -options 183 exit 1 184 ;; 185 186 *) 187 SRCS="$SRCS $1" # source file 188 shift 189 cppargs=${cppargs%x} 190 ;; 191 esac 192 done 193fi 194 195[ -z "$SRCS" ] && usage 196 197TMP=/tmp/mkdep$$ 198rm -f $TMP 199 200trap 'rm -f $TMP; exit 1' 1 2 3 13 15 201 202if $MERGE; then 203 for f in $SRCS; do 204 if [ ! -f "$f" ]; then 205 if ! $QUIET; then echo "$0: Ignoring $f" >&2; fi 206 continue 207 fi 208 while IFS=':'; read target dependents; do 209 IFS= 210 t1="${target#* }" 211 file="${target%.o}" 212 if [ "$t1" = "$target" -a "$file" != "$target" ]; then 213 set_objlist $file 214 target="$objlist" 215 fi 216 echo "$target:$dependents" 217 if "$OPTIONAL"; then 218 echo ".OPTIONAL:$dependents" 219 fi 220 done <$f 221 done >$TMP 222else 223 for f in $SRCS; do 224 file=${f##*/} 225 file=${file%.*} 226 set_objlist $file 227 228 @CPP@ "$@" $f | @AWK@ ' 229 /^#/ { 230 # Be as tolerant as possible. 231 sub(/^#(line)? [ 0-9]*\"?/, "") 232 sub(/^#(pragma).*/, "") 233 sub(/^<.*/, "") 234 sub(/\".*$/, "") 235 sub(/ [ 0-9]*$/, "") 236 237 if ($0 in seenfiles) next 238 if ($0 ~ /y.tab.c/) next 239 240 seenfiles[$0] = 1 241 print "'"$objlist"'" ": " $0 242 '"$AWK_OPTIONAL"' 243 } 244 ' >> $TMP 245 done 246fi 247 248if $APPEND; then 249 cat $TMP >> $OUTFILE 250else 251 cat $TMP > $OUTFILE 252fi 253 254rm -f $TMP 255exit 0 256