Home | History | Annotate | Line # | Download | only in host-mkdep
host-mkdep.in revision 1.20.2.2
      1 #!@BSHELL@ -
      2 #
      3 #	$NetBSD: host-mkdep.in,v 1.20.2.2 2013/01/16 05:34:04 yamt 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 
     39 APPEND=false
     40 MERGE=false
     41 OPTIONAL=false
     42 AWK_OPTIONAL=
     43 QUIET=false
     44 CPPFLAGS=
     45 NEWEXT=.o
     46 PREFIX=
     47 OUTFILE=.depend
     48 SRCS=
     49 
     50 usage()
     51 {
     52 	echo "Usage: $0 [-adopq] [-s .suffixes] [-f .depend] -- [flags] file ..." >&2
     53 	exit 1
     54 }
     55 
     56 set_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)
     74 while [ $# -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
    115 done
    116 
    117 [ $# = 0 ] && usage
    118 
    119 if $MERGE; then
    120 	SRCS="$*"
    121 else
    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 		--sysroot*)
    181 				shift
    182 				;;
    183 
    184 		-*)		
    185 				echo "$0: Unknown option: $1" 1>&2 # all other -options
    186 				exit 1
    187 				;;
    188 
    189 		*)	
    190 				SRCS="$SRCS $1"	# source file
    191 				shift
    192 				cppargs=${cppargs%x}
    193 				;;
    194 		esac
    195 	done
    196 fi
    197 
    198 [ -z "$SRCS" ] && usage
    199 
    200 TMP=/tmp/mkdep$$
    201 rm -f $TMP
    202 
    203 trap 'rm -f $TMP; exit 1' 1 2 3 13 15
    204 
    205 if $MERGE; then
    206 	for f in $SRCS; do
    207 		if [ ! -f "$f" ]; then
    208 			if ! $QUIET; then echo "$0: Ignoring $f" >&2; fi
    209 			continue
    210 		fi
    211 		while IFS=':'; read target dependents; do
    212 			IFS=
    213 			t1="${target#* }"
    214 			file="${target%.o}"
    215 			if [ "$t1" = "$target" -a "$file" != "$target" ]; then
    216 				set_objlist $file
    217 				target="$objlist"
    218 			fi
    219 			echo "$target:$dependents"
    220 			if "$OPTIONAL"; then
    221 				echo ".OPTIONAL:$dependents"
    222 			fi
    223 		done <$f
    224 	done >$TMP
    225 else
    226 	for f in $SRCS; do
    227 		file=${f##*/}
    228 		file=${file%.*}
    229 		set_objlist $file
    230 
    231 		@CPP@ "$@" $f | @AWK@ '
    232 			/^#/ {
    233 				# Be as tolerant as possible.
    234 				sub(/^#(line)? [ 0-9]*\"?/, "")
    235 				sub(/^#(pragma).*/, "")
    236 				sub(/^<.*/, "")
    237 				sub(/\".*$/, "")
    238 				sub(/ [ 0-9]*$/, "")
    239 
    240 				if ($0 in seenfiles) next
    241 				if ($0 ~ /y.tab.c/) next
    242 
    243 				seenfiles[$0] = 1
    244 				print "'"$objlist"'" ": " $0
    245 				'"$AWK_OPTIONAL"'
    246 			}
    247 		' >> $TMP
    248 	done
    249 fi
    250 
    251 if $APPEND; then
    252 	cat $TMP >> $OUTFILE
    253 else
    254 	cat $TMP > $OUTFILE
    255 fi
    256 
    257 rm -f $TMP
    258 exit 0
    259