This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
metaconfig unit change for #14807.
[metaconfig.git] / U / modified / Signal.U
CommitLineData
959f3c4c
JH
1?RCS: $Id: Signal.U,v 3.0.1.1 1997/02/28 15:20:01 ram Exp $
2?RCS:
3?RCS: Copyright (c) 1991-1993, Raphael Manfredi
4?RCS:
5?RCS: You may redistribute only under the terms of the Artistic Licence,
6?RCS: as specified in the README file that comes with the distribution.
7?RCS: You may reuse parts of this distribution only within the terms of
8?RCS: that same Artistic Licence; a copy of which may be found at the root
9?RCS: of the source tree for dist 3.0.
10?RCS:
11?RCS: $Log: Signal.U,v $
12?RCS: Revision 3.0.1.1 1997/02/28 15:20:01 ram
13?RCS: patch61: created
14?RCS:
15?X:
16?X: This unit produces three files:
17?X: 1- A signal.c file, which, when compiled and run, produces an output like:
18?X:
d01edee3
JH
19?X: HUP 1
20?X: INT 2
21?X: QUIT 3
959f3c4c
JH
22?X: etc...
23?X:
24?X: 2- A signal.awk script to parse the output of signal.c, fill
25?X: in gaps (up to NSIG) and move duplicates to the end.
26?X: 3- A signal_cmd script to compile signal.c and run it
d01edee3 27?X: through sort -n -k 2 | uniq | awk -f signal.awk.
959f3c4c
JH
28?X: (This is called signal_cmd to avoid OS/2 confusion with
29?X: signal.cmd vs. signal.
30?X: The signal_cmd script also falls back on checking signals one at a
31?X: time in case the signal.c program fails. On at least one version of
32?X: Linux 2.1.x, the header file #define'd SIGRTMAX to a symbol that
33?X: is not defined by the compiler/linker. :-(. Further, on that same
34?X: version of Linux, the user had a defective C-shell that gave an
35?X: incorrect list for kill -l, so the fall-back didn't work.
36?X:
37?X: This unit is then used by sig_name.U.
38?X:
39?MAKE:Signal: test tr rm awk cat grep startsh eunicefix sed sort uniq \
0f00356b 40 Findhdr cppstdin +cppflags cppminus Compile _o _exe trnl run
959f3c4c
JH
41?MAKE: -pick add $@ %<
42?X:all files declared as "public" since they're used from other units
43?F:signal.c signal_cmd signal.lst signal signal.awk
44?T: xx xxx xxxfiles
45: Trace out the files included by signal.h, then look for SIGxxx names.
46: Remove SIGARRAYSIZE used by HPUX.
47: Remove SIGSTKSIZE used by Linux.
48: Remove SIGSTKSZ used by Posix.
49: Remove SIGTYP void lines used by OS2.
edd6115f
JH
50: Some cpps, like os390, dont give the file name anywhere
51if [ "X$fieldn" = X ]; then
52 : Just make some guesses. We check them later.
53 xxx='/usr/include/signal.h /usr/include/sys/signal.h'
54else
55 xxx=`echo '#include <signal.h>' |
959f3c4c
JH
56 $cppstdin $cppminus $cppflags 2>/dev/null |
57 $grep '^[ ]*#.*include' |
2b49ece9 58 $awk "{print \\$$fieldn}" | $sed 's!"!!g' | $sed 's!\\\\\\\\!/!g' | $sort | $uniq`
edd6115f 59fi
959f3c4c
JH
60: Check this list of files to be sure we have parsed the cpp output ok.
61: This will also avoid potentially non-existent files, such
62: as ../foo/bar.h
63xxxfiles=''
64?X: Add /dev/null in case the $xxx list is empty.
65for xx in $xxx /dev/null ; do
66 $test -f "$xx" && xxxfiles="$xxxfiles $xx"
67done
68: If we have found no files, at least try signal.h
69case "$xxxfiles" in
70'') xxxfiles=`./findhdr signal.h` ;;
71esac
72xxx=`awk '
73$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $2 !~ /SIGSTKSIZE/ && $2 !~ /SIGSTKSZ/ && $3 !~ /void/ {
74 print substr($2, 4, 20)
75}
76$1 == "#" && $2 ~ /^define$/ && $3 ~ /^SIG[A-Z0-9]*$/ && $3 !~ /SIGARRAYSIZE/ && $4 !~ /void/ {
77 print substr($3, 4, 20)
78}' $xxxfiles`
79: Append some common names just in case the awk scan failed.
edd6115f
JH
80xxx="$xxx ABRT ALRM BUS CANCEL CHLD CLD CONT DIL EMT FPE"
81xxx="$xxx FREEZE HUP ILL INT IO IOT KILL LOST LWP PHONE"
82xxx="$xxx PIPE POLL PROF PWR QUIT RTMAX RTMIN SEGV STKFLT STOP"
83xxx="$xxx SYS TERM THAW TRAP TSTP TTIN TTOU URG USR1 USR2"
84xxx="$xxx USR3 USR4 VTALRM WAITING WINCH WIND WINDOW XCPU XFSZ"
85
959f3c4c
JH
86: generate a few handy files for later
87$cat > signal.c <<'EOCP'
88#include <sys/types.h>
89#include <signal.h>
90#include <stdio.h>
91int main() {
92
93/* Strange style to avoid deeply-nested #if/#else/#endif */
94#ifndef NSIG
95# ifdef _NSIG
96# define NSIG (_NSIG)
97# endif
98#endif
99
100#ifndef NSIG
101# ifdef SIGMAX
102# define NSIG (SIGMAX+1)
103# endif
104#endif
105
106#ifndef NSIG
107# ifdef SIG_MAX
108# define NSIG (SIG_MAX+1)
109# endif
110#endif
111
112#ifndef NSIG
113# ifdef MAXSIG
114# define NSIG (MAXSIG+1)
115# endif
116#endif
117
118#ifndef NSIG
119# ifdef MAX_SIG
120# define NSIG (MAX_SIG+1)
121# endif
122#endif
123
124#ifndef NSIG
125# ifdef SIGARRAYSIZE
126# define NSIG (SIGARRAYSIZE+1) /* Not sure of the +1 */
127# endif
128#endif
129
130#ifndef NSIG
131# ifdef _sys_nsig
132# define NSIG (_sys_nsig) /* Solaris 2.5 */
133# endif
134#endif
135
136/* Default to some arbitrary number that's big enough to get most
137 of the common signals.
138*/
139#ifndef NSIG
140# define NSIG 50
141#endif
142
143printf("NSIG %d\n", NSIG);
144
145#ifndef JUST_NSIG
146
147EOCP
148
149echo $xxx | $tr ' ' $trnl | $sort | $uniq | $awk '
150{
151 printf "#ifdef SIG"; printf $1; printf "\n"
d01edee3 152 printf "printf(\""; printf $1; printf " %%d\\n\",SIG";
959f3c4c
JH
153 printf $1; printf ");\n"
154 printf "#endif\n"
155}
156END {
157 printf "#endif /* JUST_NSIG */\n";
b8fb7a32 158 printf "exit(0);\n}\n";
959f3c4c
JH
159}
160' >>signal.c
161$cat >signal.awk <<'EOP'
162BEGIN { ndups = 0 }
d01edee3
JH
163$1 ~ /^NSIG$/ { nsig = $2 }
164($1 !~ /^NSIG$/) && (NF == 2) {
165 if ($2 > maxsig) { maxsig = $2 }
166 if (sig_name[$2]) {
167 dup_name[ndups] = $1
168 dup_num[ndups] = $2
959f3c4c
JH
169 ndups++
170 }
171 else {
d01edee3
JH
172 sig_name[$2] = $1
173 sig_num[$2] = $2
959f3c4c
JH
174 }
175}
176END {
177 if (nsig == 0) {
178 nsig = maxsig + 1
179 }
180 printf("NSIG %d\n", nsig);
181 for (n = 1; n < nsig; n++) {
182 if (sig_name[n]) {
183 printf("%s %d\n", sig_name[n], sig_num[n])
184 }
185 else {
186 printf("NUM%d %d\n", n, n)
187 }
188 }
189 for (n = 0; n < ndups; n++) {
190 printf("%s %d\n", dup_name[n], dup_num[n])
191 }
192}
193EOP
194$cat >signal_cmd <<EOS
195$startsh
196if $test -s signal.lst; then
197 echo "Using your existing signal.lst file"
198 exit 0
199fi
200xxx="$xxx"
201EOS
202?X: Avoid variable interpolation problems, especially with
203?X: xxx, which contains newlines.
204$cat >>signal_cmd <<'EOS'
205
206set signal
207if eval $compile_ok; then
d01edee3 208 $run ./signal$_exe | $sort -n -k 2 | $uniq | $awk -f signal.awk >signal.lst
959f3c4c
JH
209else
210 echo "(I can't seem be able to compile the whole test program)" >&4
211 echo "(I'll try it in little pieces.)" >&4
212 set signal -DJUST_NSIG
213 if eval $compile_ok; then
0f00356b 214 $run ./signal$_exe > signal.nsg
959f3c4c
JH
215 $cat signal.nsg
216 else
217 echo "I can't seem to figure out how many signals you have." >&4
218 echo "Guessing 50." >&4
219 echo 'NSIG 50' > signal.nsg
220 fi
221 : Now look at all the signal names, one at a time.
222 for xx in `echo $xxx | $tr ' ' $trnl | $sort | $uniq`; do
223 $cat > signal.c <<EOCP
224#include <sys/types.h>
225#include <signal.h>
226#include <stdio.h>
227int main() {
228printf("$xx %d\n", SIG${xx});
229return 0;
230}
231EOCP
232 set signal
233 if eval $compile; then
234 echo "SIG${xx} found."
0f00356b 235 $run ./signal$_exe >> signal.ls1
959f3c4c
JH
236 else
237 echo "SIG${xx} NOT found."
238 fi
239 done
240 if $test -s signal.ls1; then
241 $cat signal.nsg signal.ls1 |
d01edee3 242 $sort -n | $uniq | $awk -f signal.awk >signal.lst
959f3c4c
JH
243 fi
244
245fi
246if $test -s signal.lst; then
247 :
248else
249 echo "(AAK! I can't compile the test programs -- Guessing)" >&4
250 echo 'kill -l' >signal
251 set X `csh -f <signal`
252 $rm -f signal
253 shift
254 case $# in
255 0) set HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM;;
256 esac
257 echo $@ | $tr ' ' $trnl | \
258 $awk '{ printf "%s %d\n", $1, ++s; }
259 END { printf "NSIG %d\n", ++s }' >signal.lst
260fi
261$rm -f signal.c signal$_exe signal$_o signal.nsg signal.ls1
262EOS
263chmod a+x signal_cmd
264$eunicefix signal_cmd
265