URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [fixproto] - Rev 816
Compare with Previous | Blame | View Log
#!/bin/sh## SYNOPSIS# fixproto TARGET-DIR SOURCE-DIR-ALL SOURCE-DIR-STD## COPYRIGHT# Copyright (C) 1993, 1994, 1997, 1998, 2002, 2003, 2007# Free Software Foundation, Inc.# This file is part of GCC.## GCC 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, or (at your option)# any later version.## GCC 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 GCC; see the file COPYING3. If not see# <http://www.gnu.org/licenses/>.## DESCRIPTION# Adjunct script for GCC to populate a directory with ANSI,# Posix.1, and C++ compatible header files.## Each file found under SOURCE-DIR-ALL is analyzed and "fixed."# Only standard ANSI/POSIX files found under SOURCE-DIR-STD# are analyzed and "fixed."# The SOURCE-DIRs are searched in order; a file found# under multiple SOURCE-DIRs is only handled for the first one.## STRATEGY# Each include file is fed through cpp, and the scan-decls program# parses it, and emits any found function declarations.# The fix-header program analyzes the scan-decls output,# together with the original include file, and writes a "fixed"# include file, if needed.## The comment at the beginning of fix-header.c lists specifically# what kind of changes are made.## NOTE# Some file space will be wasted, because the original header# files are copied. An earlier version just included the original# by "reference", using GNU cpp's #include_next mechanism.# This is currently not done, partly because #include_next is# fragile (susceptible to version incompatibilities, and depends# and GCC-specific features), and partly for performance reasons.## AUTHORS# Ron Guilmette (rfg@netcom.com) (original idea and code)# Per Bothner (bothner@cygnus.com) (major re-write)dirname=`echo "$0" | sed 's,^[^/]*$,.,;s,//*[^/]*$,,'`progname=`echo "$0" | sed 's,.*/,,'`original_dir=`${PWDCMD-pwd}`FIX_HEADER=${FIX_HEADER-$original_dir/fix-header}DEFINES="-D__STDC__=0 -D__cplusplus ${FIXPROTO_DEFINES}"if mkdir -p . 2> /dev/null; then# Great, mkdir accepts -pmkinstalldirs="mkdir -p"else# We expect mkinstalldirs to be passed in the environment.# If it is not, assume it is in the directory that contains this script.mkinstalldirs=${mkinstalldirs-"/bin/sh $dirname/mkinstalldirs"}if $mkinstalldirs . 2> /dev/null; then:else# But, in case of failure, fallback to plain mkdir, and hope it worksmkinstalldirs=mkdirfifiif [ `echo $1 | wc -w` = 0 ] ; thenecho $progname\: usage\: $progname target-dir \[ source-dir \.\.\. \]exit 1fistd_files="ctype.h dirent.h errno.h curses.h fcntl.h grp.h locale.h math.h pwd.h setjmp.h signal.h stdio.h stdlib.h string.h sys/socket.h sys/stat.h sys/times.h sys/resource.h sys/utsname.h sys/wait.h tar.h termios.h time.h unistd.h utime.h"rel_target_dir=$1# All files in $src_dir_all (normally same as $rel_target_dir) are# processed.src_dir_all=$2# In $src_dir_std (normally same as /usr/include), only the# "standard" ANSI/POSIX files listed in $std_files are processed.src_dir_std=$3case $rel_target_dir in/* | [A-Za-z]:[\\/]*)abs_target_dir=$rel_target_dir;;*)abs_target_dir=$original_dir/$rel_target_dir;;esac# Determine whether this system has symbolic links.if ln -s X $rel_target_dir/ShouldNotExist 2>/dev/null; thenrm -f $rel_target_dir/ShouldNotExistLINKS=trueelif ln -s X /tmp/ShouldNotExist 2>/dev/null; thenrm -f /tmp/ShouldNotExistLINKS=trueelseLINKS=falsefiif [ \! -d $abs_target_dir ] ; thenecho $progname\: creating directory $rel_target_dir$mkinstalldirs $abs_target_dirfiecho $progname\: populating \`$rel_target_dir\'include_path=""if [ `echo $* | wc -w` != 0 ] ; thenfor rel_source_dir in $src_dir_all $src_dir_std; docase $rel_source_dir in/* | [A-Za-z]:[\\/]*)abs_source_dir=$rel_source_dir;;*)abs_source_dir=$original_dir/$rel_source_dir;;esacinclude_path="$include_path -I$abs_source_dir"donefidone_dirs=""subdirs_made=""echo "" >fixproto.listfor code in ALL STD ; dosubdirs="."case $code inALL)rel_source_dir=$src_dir_alldirs="."levels=2while $LINKS && test -n "$dirs" -a $levels -gt 0dolevels=`expr $levels - 1`newdirs=for d in $dirs ; do# Find all directories under $d, relative to $d, excluding $d itself.# Assume directory names ending in CC or containing ++ are# for C++, so skip those.subdirs="$subdirs "`cd $rel_source_dir/$d; find . -type d -print | \sed -e '/^\.$/d' -e "s|^\./|${d}/|" -e 's|^\./||' \-e '/CC$/d' -e '/[+][+]/d'`links=links=`cd $rel_source_dir; find $d/. -type l -print | \sed -e "s|$d/./|$d/|" -e 's|^\./||'`for link in $links --dummy-- ; dotest -d $rel_source_dir/$link/. && newdirs="$newdirs $link"donedonedirs="$newdirs"subdirs="$subdirs $newdirs"done;;STD)rel_source_dir=$src_dir_std;;esaccase $rel_source_dir in/* | [A-Za-z]:[\\/]*)abs_source_dir=$rel_source_dir;;*)abs_source_dir=$original_dir/$rel_source_dir;;esacif [ \! -d $abs_source_dir ] ; thenecho $progname\: warning\: no such directory\: \`$rel_source_dir\'continuefifor rel_source_subdir in $subdirs; doabs_target_subdir=${abs_target_dir}/${rel_source_subdir}if [ \! -d $abs_target_subdir ] ; thenif $mkinstalldirs $abs_target_subdir ; thensubdirs_made="$abs_target_subdir $subdirs_made"fifi# Append "/"; remove initial "./". Hence "." -> "" and "sys" -> "sys/".rel_source_prefix=`echo $rel_source_subdir | sed -e 's|$|/|' -e 's|^./||'`case $code inALL)# The 'sed' is in case the *.h matches nothing, which yields "*.h"# which would then get re-globbed in the current directory. Sigh.rel_source_files=`cd ${abs_source_dir}/${rel_source_subdir}; echo *.h | sed -e 's|[*].h|NONE|'`;;STD)files_to_check="$std_files"rel_source_files=""# Also process files #included by the $std_files.while [ -n "${files_to_check}" ]donew_files_to_check=""for file in $files_to_check ; doxxfile=`echo $file | sed -e 's|/\([^/\.][^/\.]*\)/\.\./|/|'`# Create the dir where this file will go when fixed.xxdir=`echo ./$file | sed -e 's|/[^/]*$||'`if [ \! -d $abs_target_subdir/$xxdir ] ; thenif $mkinstalldirs $abs_target_subdir/$xxdir ; thensubdirs_made="$abs_target_subdir/$xxdir $subdirs_made"fifi# Just in case we have edited out a symbolic linkif [ -f $src_dir_std/$file -a -f $src_dir_std/$xxfile ] ; thenfile=$xxfileficase " $rel_source_files " in*" ${file} "*)# Already seen $file; nothing to do;;*)if test -f $src_dir_std/$file ; thenrel_dir=`echo $file | sed -n -e 's|^\(.*/\)[^/]*$|\1|p'`# For #include "foo.h", that might be either "foo.h"# or "${rel_dir}foo.h (or something bogus).new_files_to_check="$new_files_to_check "`sed -n \-e 's@ @ @g' \-e 's@^ *# *include *<\([^>]*\)>.*$@\1@p' -e \'s@^ *# *include *\"\([^\"]*\)\".*$@\1 '$rel_dir'\1@p'\<$src_dir_std/$file`rel_source_files="$rel_source_files $file"fi;;esacdonefiles_to_check="$new_files_to_check"donerel_source_files="$rel_source_files";;esacfor filename in $rel_source_files ; dorel_source_file=${rel_source_prefix}${filename}abs_source_file=$abs_source_dir/$rel_source_fileabs_target_file=$abs_target_dir/$rel_source_fileif test "$filename" = 'NONE' ; thenecho "(No *.h files in $abs_source_dir/$rel_source_subdir)"# If target file exists, check if was written while processing one# of the earlier source directories; if so ignore it.elif test -f $abs_target_file -a -n "$done_dirs" \&& grep "$rel_source_file" fixproto.list >/dev/nullthen trueelse$FIX_HEADER $rel_source_file $abs_source_file $abs_target_file ${DEFINES} $include_pathif test $? != 0 ; then exit 1 ; fiecho "${rel_source_file}" >>fixproto.listfidonedonedone_dirs="$done_dir $rel_source_dir"done# This might be more cleanly moved into the main loop, by adding# a <dummy> source directory at the end. FIXME!# All the headers we create define size_t and NULL.for rel_source_file in unistd.h stdlib.h string.h time.h ; doif grep "$rel_source_file" fixproto.list >/dev/null ; then: # It exists, we don't need to make itelseecho Adding missing $rel_source_filerel_source_ident=`echo $rel_source_file | tr ./ __`cat >tmp.h <<EOF/* Fake ${rel_source_file}, created by GCC.The functions declared in this file do not necessarily exist inyour C library. */#ifndef __${rel_source_ident}#define __${rel_source_ident}#define __need_NULL#define __need_size_t#include <stddef.h>EOF# Insert special stuff for particular files here.case ${rel_source_file} intime.h)# If time.h doesn't exist, find out if sys/time.h does.if test -f $src_dir_std/sys/time.h \|| grep "sys/time.h" fixproto.list >/dev/null ; then# It does; include it and hope it has the needed declarations.# Some versions require sys/types.h.cat >>tmp.h <<EOF#include <sys/types.h>#include <sys/time.h>EOFelse# It doesn't. Make up plausible definitions for time_t, clock_t.# Forward-declare struct tm. Hope nobody tries to use it. (Odds# are they won't.)cat >>tmp.h <<EOFtypedef long time_t;typedef long clock_t;struct tm;EOFfi ;;esaccat >>tmp.h <<EOF#endif /* __${rel_source_ident} */EOF${FIX_HEADER} $rel_source_file tmp.h $abs_target_dir/$rel_source_file ${DEFINES} $include_pathif test $? != 0 ; then exit 1 ; fiif test -f $abs_target_dir/$rel_source_file ; thenrm tmp.helsemv tmp.h $abs_target_dir/$rel_source_filefifidone# Remove any directories that we made that are still empty.rmdir $subdirs_made 2>/dev/nullexit 0
