aboutsummaryrefslogtreecommitdiff
path: root/gcc/fixinc/fixinc.wrap
blob: 46318967c70a319a1437fdd3fe657b16147bd300 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#! /bin/sh
# Create wrappers for include files instead of replacing them.
#
# This script is designed for systems whose include files can be fixed
# by creating small wrappers around them.
# An advantage of this method is that if the system include files are changed
# (e.g. by OS upgrade), you need not re-run fixincludes.
#
# See README-fixinc for more information.

# Directory in which to store the results.
LIB=${1?"fixincludes: output directory not specified"}

# Make sure it exists.
if [ ! -d $LIB ]; then
  mkdir $LIB || exit 1
fi

ORIG_DIR=`${PWDCMD-pwd}`

# Make LIB absolute if it is relative.
# Don't do this if not necessary, since may screw up automounters.
case $LIB in
/*)
	;;
*)
	cd $LIB; LIB=`${PWDCMD-pwd}`
	;;
esac

echo Building fixed headers in ${LIB}
# Directory containing the original header files.
shift
if [ $# -eq 0 ] ; then
  set /usr/include
fi

INLIST="$@"

for INPUT in ${INLIST} ; do
cd ${ORIG_DIR}
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 $INPUT/$file ]; then
  echo Checking $INPUT/$file
  if grep 'struct exception' $INPUT/$file >/dev/null
  then
    echo Fixed $file
    rm -f $LIB/$file
    cat <<'__EOF__' >$LIB/$file
#ifndef _MATH_H_WRAPPER
#ifdef __cplusplus
# define exception __math_exception
#endif
 #include_next <math.h>
#ifdef __cplusplus
# undef exception
#endif
#define _MATH_H_WRAPPER
#endif /* _MATH_H_WRAPPER */
__EOF__
    # Define _MATH_H_WRAPPER at the end of the wrapper, not the start,
    # so that if #include_next gets another instance of the wrapper,
    # this will follow the #include_next chain until we arrive at
    # the real <math.h>.
    chmod a+r $LIB/$file
  fi
fi

# Similarly for struct queue in sys/stream.h.
file=sys/stream.h
if [ -r $INPUT/$file ]; then
  echo Checking $INPUT/$file
  if grep 'struct[ 	]*queue' $INPUT/$file >/dev/null
  then
    echo Fixed $file
    mkdir -p $LIB/`dirname $file`
    rm -f $LIB/$file
    cat <<'__EOF__' >$LIB/$file
#ifndef _SYS_STREAM_H_WRAPPER
#ifdef __cplusplus
# define queue __stream_queue
#endif
 #include_next <sys/stream.h>
#ifdef __cplusplus
# undef queue
#endif
#define _SYS_STREAM_H_WRAPPER
#endif /* _SYS_STREAM_H_WRAPPER */
__EOF__
    # Define _SYS_STREAM_H_WRAPPER at the end of the wrapper, not the start,
    # so that if #include_next gets another instance of the wrapper,
    # this will follow the #include_next chain until we arrive at
    # the real <sys/stream.h>.
    chmod a+r $LIB/$file
  fi
fi

# Avoid the definition of the bool type in the Solaris 2.x curses.h when using
# g++, since it's now an official type in the C++ language.
file=curses.h
if [ -r $INPUT/$file ]; then
  echo Checking $INPUT/$file
  w='[	 ]'
  if grep "typedef$w$w*char$w$w*bool$w*;" $INPUT/$file >/dev/null
  then
    echo Fixed $file
    rm -f $LIB/$file
    cat <<'__EOF__' >$LIB/$file
#ifndef _CURSES_H_WRAPPER
#ifdef __cplusplus
# define bool __curses_bool_t
#endif
 #include_next <curses.h>
#ifdef __cplusplus
# undef bool
#endif
#define _CURSES_H_WRAPPER
#endif /* _CURSES_H_WRAPPER */
__EOF__
    # Define _CURSES_H_WRAPPER at the end of the wrapper, not the start,
    # so that if #include_next gets another instance of the wrapper,
    # this will follow the #include_next chain until we arrive at
    # the real <curses.h>.
    chmod a+r $LIB/$file
  fi
fi

done

if [ x${INSTALL_ASSERT_H} != x ]
then
  cd ${ORIG_DIR}
  rm -f include/assert.h
  cp ${srcdir}/assert.h include/assert.h || exit 1
  chmod a+r include/assert.h
fi

exit 0