112 lines
2.9 KiB
Bash
112 lines
2.9 KiB
Bash
#! /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
|