| #! /bin/sh |
| # Fix struct exception in /usr/include/math.h. |
| # |
| # We expect several systems which did not need fixincludes in the past |
| # to need to fix just math.h. So we created a separate fixinc.mathh |
| # script to fix just that problem. |
| # See README-fixinc for more information. |
| |
| # Directory containing the original header files. |
| # (This was named INCLUDES, but that conflicts with a name in Makefile.in.) |
| INPUT=${2-${INPUT-/usr/include}} |
| |
| # Directory in which to store the results. |
| LIB=${1?"fixincludes: output directory not specified"} |
| |
| # Define PWDCMD as a command to use to get the working dir |
| # in the form that we want. |
| PWDCMD=pwd |
| case "`pwd`" in |
| //*) |
| # On an Apollo, discard everything before `/usr'. |
| PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'" |
| ;; |
| esac |
| |
| # Original directory. |
| ORIGDIR=`${PWDCMD}` |
| |
| # Make sure it exists. |
| if [ ! -d $LIB ]; then |
| mkdir $LIB || exit 1 |
| fi |
| |
| # Make LIB absolute only if needed to avoid problems with the amd. |
| case $LIB in |
| /*) |
| ;; |
| *) |
| cd $LIB; LIB=`${PWDCMD}` |
| ;; |
| esac |
| |
| # Fail if no arg to specify a directory for the output. |
| if [ x$1 = x ] |
| then echo fixincludes: no output directory specified |
| exit 1 |
| fi |
| |
| echo Building fixed headers in ${LIB} |
| |
| # Determine whether this system has symbolic links. |
| if ln -s X $LIB/ShouldNotExist 2>/dev/null; then |
| rm -f $LIB/ShouldNotExist |
| LINKS=true |
| elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then |
| rm -f /tmp/ShouldNotExist |
| LINKS=true |
| else |
| LINKS=false |
| fi |
| |
| cd ${INPUT} |
| |
| # Some math.h files define struct exception, which conflicts with |
| # the class exception defined in the C++ file std/stdexcept.h. We |
| # redefine it to __math_exception. This is not a great fix, but I |
| # haven't been able to think of anything better. |
| file=math.h |
| if [ -r $file ] && [ ! -r ${LIB}/$file ]; then |
| cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" |
| chmod +w ${LIB}/$file 2>/dev/null |
| chmod a+r ${LIB}/$file 2>/dev/null |
| fi |
| |
| if [ -r ${LIB}/$file ]; then |
| echo Fixing $file, exception |
| sed -e '/struct exception/i\ |
| #ifdef __cplusplus\ |
| #define exception __math_exception\ |
| #endif\ |
| '\ |
| -e '/struct exception/a\ |
| #ifdef __cplusplus\ |
| #undef exception\ |
| #endif\ |
| ' ${LIB}/$file > ${LIB}/${file}.sed |
| rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file |
| if egrep 'matherr()' ${LIB}/$file >/dev/null 2>&1; then |
| sed -e '/matherr/i\ |
| #ifdef __cplusplus\ |
| #define exception __math_exception\ |
| #endif\ |
| '\ |
| -e '/matherr/a\ |
| #ifdef __cplusplus\ |
| #undef exception\ |
| #endif\ |
| ' ${LIB}/$file > ${LIB}/${file}.sed |
| rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file |
| fi |
| if cmp $file ${LIB}/$file >/dev/null 2>&1; then |
| rm -f ${LIB}/$file |
| else |
| # Find any include directives that use "file". |
| for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${LIB}/$file | sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`; do |
| dir=`echo $file | sed -e s'|/[^/]*$||'` |
| required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include" |
| done |
| fi |
| fi |
| exit 0 |