home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / gcc-2.3.3-src.lha / GNU / src / amiga / gcc-2.3.3 / populate < prev    next >
Text File  |  1994-02-06  |  6KB  |  167 lines

  1. #!/bin/sh
  2. #
  3. # NAME
  4. #    populate
  5. #
  6. # SYNOPSIS
  7. #    populate target-dir [ source-dir ... ]
  8. #
  9. # DESCRIPTION
  10. #    Adjunct script for GNU C++ to populate a directory with    C++
  11. #    compatible header files.
  12. #
  13. #    For each header file (whose name ends in .h) which resides in one
  14. #    of the indicated source-dirs, create a corresponding file in the
  15. #    target-dir (with the same name) which looks like:
  16. #
  17. #        #ifndef __IN_C_REGION__
  18. #        #define __IN_C_REGION__
  19. #        extern "C" {
  20. #        #include_next <header.h>
  21. #        }
  22. #        #undef __IN_C_REGION__
  23. #        #else
  24. #        #include_next <header.h>
  25. #        #endif
  26. #
  27. #    Where "header.h" is the name of the original header file in the
  28. #    source-dir.
  29. #
  30. #    If a file with the appropriate name already exists in the target
  31. #    directory, it will not be overwritten.
  32. #
  33. # NOTES
  34. #    This script assumes that your native header files are already
  35. #    at least compliant with ANSI C, and that all functions declared
  36. #    therein are properly prototyped (as they must be for C++).
  37. #
  38. #    Currently, this condition is not fully satisfied by many (if any)
  39. #    systems.  On System V Release 4, most of the system header files
  40. #    do seem to be properly prototyped though, and OSF/1 also has
  41. #    prototyped header files, but some of the argument type specifica-
  42. #    tions for some function prototypes in some OSF/1 header files may
  43. #    lack `const' qualifiers in certain places where they ought to appear.
  44. #    (This is due to the fact that OSF/1 conformat to POSIX-1988 rather
  45. #    than to the newer POSIX-1990 standard.)
  46. #
  47. #    If your system's native include files are not properly prototyped,
  48. #    that's OK.  This script will still do it's normal job (in the normal
  49. #    way) but the resulting (indirect) header files will not be very useful
  50. #    for g++ programming unless (and until) somebody puts in all of the
  51. #    prototypes for all of the functions which are declared in these files.
  52. #
  53. #    Note that in some cases, a header file with a given name may exist
  54. #    in two or more of the given source directories.  That's perfectly
  55. #    alright.  Only one (corresponding) header file will be placed into
  56. #    the target directory for each such group of kindred source files.
  57. #
  58. #    This script should probably be invoked from the GCC Makefile, via:
  59. #
  60. #      populate $(libdir)/g++-include $(libsubdir)/include /usr/include
  61. #
  62. #    That would insure the creation of a C++ compatible set of headers
  63. #    (in the sepcial g++-include directory) corresponding to all of the
  64. #    normal GCC header files and all of the native system's header files.
  65. #
  66. # AUTHOR
  67. #    Ron Guilmette (rfg@ncd.com)
  68. #
  69. # COPYRIGHT
  70. #    This file is part of GNU CC.
  71. #
  72. #    GNU CC is free software; you can redistribute it and/or modify
  73. #    it under the terms of the GNU General Public License as published by
  74. #    the Free Software Foundation; either version 2, or (at your option)
  75. #    any later version.
  76. #
  77. #    GNU CC is distributed in the hope that it will be useful,
  78. #    but WITHOUT ANY WARRANTY; without even the implied warranty of
  79. #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  80. #    GNU General Public License for more details.
  81. #
  82. #    You should have received a copy of the GNU General Public License
  83. #    along with GNU CC; see the file COPYING.  If not, write to
  84. #    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  85.  
  86. progname=$0
  87. progname=`basename $progname`
  88. original_dir=`pwd`
  89. if [ `echo $1 | wc -w` = 0 ] ; then
  90.   echo $progname\: usage\: $progname target-dir \[ source-dir \.\.\. \]
  91.   exit 1
  92. fi
  93. rel_target_dir=$1
  94. shift
  95.  
  96. if [ `expr $rel_target_dir : '\(.\)'` != '/' ] ; then
  97.   abs_target_dir=$original_dir/$rel_target_dir
  98. else
  99.   abs_target_dir=$rel_target_dir
  100. fi
  101.  
  102. if [ \! -d $abs_target_dir ] ; then
  103.   echo $progname\: creating directory $rel_target_dir
  104.   mkdir $abs_target_dir
  105. fi
  106.  
  107. echo $progname\: populating \`$rel_target_dir\'
  108.  
  109. if [ `echo $* | wc -w` != 0 ] ; then
  110.   for rel_source_dir in $*; do
  111.     if [ `expr $rel_source_dir : '\(.\)'` != '/' ] ; then
  112.       abs_source_dir=$original_dir/$rel_source_dir
  113.     else
  114.       abs_source_dir=$rel_source_dir
  115.     fi
  116.     echo $progname\: input dir\: \`$rel_source_dir\'
  117.   done
  118. fi
  119.  
  120. tmp_file=/tmp/$progname.$$
  121. rm -f $tmp_file
  122. echo '#ifndef __IN_C_REGION__' > $tmp_file
  123. echo '#define __IN_C_REGION__' >> $tmp_file
  124. echo 'extern "C" {' >> $tmp_file
  125. echo '#include_next <=>' >> $tmp_file
  126. echo '}' >> $tmp_file
  127. echo '#undef __IN_C_REGION__' >> $tmp_file
  128. echo '#else' >> $tmp_file
  129. echo '#include_next <=>' >> $tmp_file
  130. echo '#endif' >> $tmp_file
  131.  
  132. if [ `echo $* | wc -w` != 0 ] ; then
  133.   for rel_source_dir in $*; do
  134.     if [ `expr $rel_source_dir : '\(.\)'` != '/' ] ; then
  135.       abs_source_dir=$original_dir/$rel_source_dir
  136.     else
  137.       abs_source_dir=$rel_source_dir
  138.     fi
  139.     if [ \! -d $abs_source_dir ] ; then
  140.       echo $progname\: warning\: no such directory\: \`$rel_source_dir\'
  141.       continue
  142.     fi
  143.     cd $abs_source_dir
  144.     rel_source_subdirs=`find . -type d -print | sed 's%^\./%%' | sed 's/\.//'`
  145.     if [ `echo $rel_source_subdirs | wc -w` != 0 ] ; then
  146.       for rel_source_subdir in $rel_source_subdirs; do
  147.         abs_target_subdir=$abs_target_dir/$rel_source_subdir
  148.         if [ \! -d $abs_target_subdir ] ; then
  149.           mkdir $abs_target_subdir
  150.         fi
  151.       done
  152.     fi
  153.     rel_source_files=`find . -type f -name \*.h -print | sed 's%^\./%%'`
  154.     if [ `echo $rel_source_files | wc -w` != 0 ] ; then
  155.       for rel_source_file in $rel_source_files; do
  156.     abs_source_file=$abs_source_dir/$rel_source_file
  157.     abs_target_file=$abs_target_dir/$rel_source_file
  158.         if [ \! -f $abs_target_file ] ; then
  159.           sed 's%=%'"$rel_source_file"'%' $tmp_file > $abs_target_file
  160.         fi
  161.       done
  162.     fi
  163.   done
  164. fi
  165. rm -f $tmp_file
  166. exit 0
  167.