mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
618 lines
9.5 KiB
Plaintext
618 lines
9.5 KiB
Plaintext
|
#!/bin/sh
|
|||
|
# Generate config.h from unix.cfg.
|
|||
|
|
|||
|
trap 'rm -f doit doit.c doit.o doit.log config.out; exit 1' 1 2 3 15
|
|||
|
|
|||
|
on=
|
|||
|
off=
|
|||
|
CC=${CC-cc}
|
|||
|
|
|||
|
# Normally we use VARARGS if __STDC__ is not defined.
|
|||
|
# Test whether this assumption is wrong.
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#ifdef __STDC__
|
|||
|
#include <stdarg.h>
|
|||
|
int foo(char *s,...)
|
|||
|
{
|
|||
|
va_list ap;
|
|||
|
|
|||
|
va_start(ap, s);
|
|||
|
va_end(ap);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
#else
|
|||
|
int foo = 0;
|
|||
|
#endif
|
|||
|
EOF
|
|||
|
|
|||
|
$CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
if test $? -ne 0
|
|||
|
then
|
|||
|
on="$on VARARGS"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <stddef.h>
|
|||
|
int foo = 0;
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
off="$off STDDEF_H_MISSING"
|
|||
|
else
|
|||
|
on="$on STDDEF_H_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <stdlib.h>
|
|||
|
int foo = 0;
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
off="$off STDLIB_H_MISSING"
|
|||
|
else
|
|||
|
on="$on STDLIB_H_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <limits.h>
|
|||
|
int foo = 0;
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
off="$off LIMITS_H_MISSING"
|
|||
|
else
|
|||
|
on="$on LIMITS_H_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <vfork.h>
|
|||
|
int foo = 0;
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
on="$on HAVE_VFORK_H"
|
|||
|
else
|
|||
|
off="$off HAVE_VFORK_H"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <unistd.h>
|
|||
|
int foo = 0;
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
on="$on HAVE_UNISTD_H"
|
|||
|
else
|
|||
|
off="$off HAVE_UNISTD_H"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/stat.h>
|
|||
|
int foo = 0;
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
on="$on HAVE_SYS_STAT_H"
|
|||
|
else
|
|||
|
off="$off HAVE_SYS_STAT_H"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
/* Exit normally unless we need to use isascii. */
|
|||
|
|
|||
|
#include <ctype.h>
|
|||
|
#include <signal.h>
|
|||
|
|
|||
|
static int whoops()
|
|||
|
{
|
|||
|
_exit(1);
|
|||
|
}
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
int c;
|
|||
|
#ifdef isascii
|
|||
|
#ifdef SIGSEGV
|
|||
|
signal(SIGSEGV, whoops);
|
|||
|
#endif
|
|||
|
#ifdef SIGBUS
|
|||
|
signal(SIGBUS, whoops);
|
|||
|
#endif
|
|||
|
#ifdef SIGIOT
|
|||
|
signal(SIGIOT, whoops);
|
|||
|
#endif
|
|||
|
|
|||
|
for (c = 128; c < 256; c++) {
|
|||
|
if (c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5'
|
|||
|
|| c == '6' || c == '7' || c == '8' || c == '9') {
|
|||
|
if (!isdigit(c) || isalpha(c) || iscntrl(c) || isspace(c) || ispunct(c))
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
else if (isdigit(c))
|
|||
|
exit(1);
|
|||
|
else if (isalpha(c)) {
|
|||
|
if (iscntrl(c) || isspace(c) || ispunct(c)
|
|||
|
|| (islower(c) && toupper(c) != c && !isupper(toupper(c)))
|
|||
|
|| (isupper(c) && tolower(c) != c && !islower(tolower(c))))
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
else if (islower(c) || isupper(c))
|
|||
|
exit(1);
|
|||
|
else if (iscntrl(c)) {
|
|||
|
if (ispunct(c))
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
}
|
|||
|
#endif /* isascii */
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
# This tries to find the symbol that looks like the array
|
|||
|
# used by <ctype.h>, and sees if its length appears to be 128
|
|||
|
# rather than 256.
|
|||
|
if test 1 = `(nm -n doit 2>/dev/null) | awk '
|
|||
|
BEGIN {
|
|||
|
weight["0"] = 0;
|
|||
|
weight["1"] = 1;
|
|||
|
weight["2"] = 2;
|
|||
|
weight["3"] = 3;
|
|||
|
weight["4"] = 4;
|
|||
|
weight["5"] = 5;
|
|||
|
weight["6"] = 6;
|
|||
|
weight["7"] = 7;
|
|||
|
weight["8"] = 8;
|
|||
|
weight["9"] = 9;
|
|||
|
weight["a"] = weight["A"] = 10;
|
|||
|
weight["b"] = weight["B"] = 11;
|
|||
|
weight["c"] = weight["C"] = 12;
|
|||
|
weight["d"] = weight["D"] = 13;
|
|||
|
weight["e"] = weight["E"] = 14;
|
|||
|
weight["f"] = weight["F"] = 15;
|
|||
|
}
|
|||
|
|
|||
|
/^[0-9a-zA-Z]* D .*ctype/ && ctype_nr == 0 {
|
|||
|
ctype_nr = NR;
|
|||
|
addr = 0;
|
|||
|
len = length($1);
|
|||
|
for (i = 1; i <= len; i++)
|
|||
|
addr = addr*16 + weight[substr($1, i, 1)];
|
|||
|
}
|
|||
|
|
|||
|
/^[0-9a-zA-Z]* D / && NR == ctype_nr + 1 {
|
|||
|
next_addr = 0;
|
|||
|
len = length($1);
|
|||
|
for (i = 1; i <= len; i++)
|
|||
|
next_addr = next_addr*16 + weight[substr($1, i, 1)];
|
|||
|
}
|
|||
|
|
|||
|
END {
|
|||
|
size = next_addr - addr;
|
|||
|
if (size >= 128 && size < 256)
|
|||
|
print "1";
|
|||
|
else
|
|||
|
print "0";
|
|||
|
}'`
|
|||
|
then
|
|||
|
on="$on USE_ISASCII"
|
|||
|
else
|
|||
|
if ((yes | man 3 ctype) 2>/dev/null) \
|
|||
|
| sed -e 's/.//g' -e 's/ *$//' -e '/de-$/N' \
|
|||
|
-e 's/-\n//g' -e '/defined$/N' -e '/only$/N' \
|
|||
|
-e '/where$/N' -e '/isascii$/N' -e '/is$/N' \
|
|||
|
-e 's/\n/ /g' -e 's/ */ /g' \
|
|||
|
| grep "defined only where isascii is true" >/dev/null
|
|||
|
then
|
|||
|
on="$on USE_ISASCII"
|
|||
|
else
|
|||
|
off="$off USE_ISASCII"
|
|||
|
fi
|
|||
|
fi
|
|||
|
else
|
|||
|
on="$on USE_ISASCII"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
remove("foo");
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
off="$off REMOVE_MISSING"
|
|||
|
else
|
|||
|
on="$on REMOVE_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
getopt(argc, argv, "v");
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on HAVE_GETOPT"
|
|||
|
else
|
|||
|
off="$off HAVE_GETOPT"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
access("foo", 4);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on HAVE_ACCESS"
|
|||
|
else
|
|||
|
off="$off HAVE_ACCESS"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
vfork();
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on HAVE_VFORK"
|
|||
|
else
|
|||
|
off="$off HAVE_VFORK"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
|
|||
|
if (argc == 0) {
|
|||
|
int status;
|
|||
|
waitpid(-1, &status, 0);
|
|||
|
}
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on HAVE_WAITPID"
|
|||
|
else
|
|||
|
off="$off HAVE_WAITPID"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <string.h>
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
strerror(0);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
off="$off STRERROR_MISSING"
|
|||
|
else
|
|||
|
on="$on STRERROR_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <strings.h>
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
bcopy((char *)0, (char *)0, 0);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
# Only use BSD_STRINGS if ANSI string functions don't work.
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <string.h>
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
memcpy((char *)0, (char *)0, 0);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
off="$off BSD_STRINGS"
|
|||
|
else
|
|||
|
on="$on BSD_STRINGS"
|
|||
|
fi
|
|||
|
else
|
|||
|
off="$off BSD_STRINGS"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <signal.h>
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0)
|
|||
|
raise(SIGINT);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
off="$off RAISE_MISSING"
|
|||
|
else
|
|||
|
on="$on RAISE_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <stdio.h>
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0) {
|
|||
|
fpos_t pos;
|
|||
|
fsetpos(stdin, &pos);
|
|||
|
fgetpos(stdin, &pos);
|
|||
|
}
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
off="$off FPOS_MISSING"
|
|||
|
else
|
|||
|
on="$on FPOS_MISSING"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <unistd.h>
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/wait.h>
|
|||
|
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0) {
|
|||
|
pid_t pid;
|
|||
|
int status;
|
|||
|
long n = sysconf(_SC_OPEN_MAX);
|
|||
|
pid = waitpid(-1, &status, 0);
|
|||
|
WIFSTOPPED(status);
|
|||
|
WIFSIGNALED(status);
|
|||
|
WIFEXITED(status);
|
|||
|
WEXITSTATUS(status);
|
|||
|
WTERMSIG(status);
|
|||
|
WSTOPSIG(status);
|
|||
|
}
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on POSIX"
|
|||
|
else
|
|||
|
off="$off POSIX"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <stdio.h>
|
|||
|
#include <signal.h>
|
|||
|
|
|||
|
static int whoops()
|
|||
|
{
|
|||
|
_exit(1);
|
|||
|
}
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
char buf[30];
|
|||
|
#ifdef SIGSEGV
|
|||
|
signal(SIGSEGV, whoops);
|
|||
|
#endif
|
|||
|
#ifdef SIGBUS
|
|||
|
signal(SIGBUS, whoops);
|
|||
|
#endif
|
|||
|
#ifdef SIGIOT
|
|||
|
signal(SIGIOT, whoops);
|
|||
|
#endif
|
|||
|
sprintf(buf, "%2$s%2$s%1$s%1$s", "bar", "foo");
|
|||
|
exit(!!strcmp(buf, "foofoobarbar"));
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on HAVE_EXTENDED_PRINTF"
|
|||
|
else
|
|||
|
off="$off HAVE_EXTENDED_PRINTF"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <nl_types.h>
|
|||
|
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
if (argc == 0) {
|
|||
|
nl_catd d = catopen("foo", 0);
|
|||
|
catgets(d, 1, 1, "default");
|
|||
|
catclose(d);
|
|||
|
}
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
on="$on HAVE_CAT"
|
|||
|
else
|
|||
|
off="$off HAVE_CAT"
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
#include <limits.h>
|
|||
|
|
|||
|
char c = UCHAR_MAX;
|
|||
|
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
#if CHAR_MIN < 0
|
|||
|
exit(!(c < 0));
|
|||
|
#else
|
|||
|
exit(!(c > 0));
|
|||
|
#endif
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
char_signed=
|
|||
|
else
|
|||
|
cat >doit.c <<\EOF
|
|||
|
main()
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
for (i = 0; i < 512; i++) {
|
|||
|
char c = (char)i;
|
|||
|
if (c < 0)
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -o doit doit.c $LIBS >/dev/null 2>&1 && ./doit 2>/dev/null
|
|||
|
then
|
|||
|
char_signed=0
|
|||
|
else
|
|||
|
char_signed=1
|
|||
|
fi
|
|||
|
fi
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
|
|||
|
typedef void VOID;
|
|||
|
|
|||
|
extern VOID bar();
|
|||
|
|
|||
|
VOID foo()
|
|||
|
{
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >/dev/null 2>&1
|
|||
|
then
|
|||
|
void_ret=void
|
|||
|
else
|
|||
|
void_ret=int
|
|||
|
fi
|
|||
|
|
|||
|
|
|||
|
cat >doit.c <<\EOF
|
|||
|
|
|||
|
void *foo()
|
|||
|
{
|
|||
|
static char *buf;
|
|||
|
return buf;
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
if $CC $CFLAGS -c doit.c >doit.log 2>&1
|
|||
|
then
|
|||
|
if test -s doit.log
|
|||
|
then
|
|||
|
void_star="char \*"
|
|||
|
else
|
|||
|
void_star="void \*"
|
|||
|
fi
|
|||
|
|
|||
|
else
|
|||
|
void_star="char \*"
|
|||
|
fi
|
|||
|
|
|||
|
edit=
|
|||
|
|
|||
|
rm -f doit.c doit doit.log doit.o
|
|||
|
|
|||
|
for var in $on
|
|||
|
do
|
|||
|
edit="$edit -e 's;^/\\* *\\(#define $var [^/]*\\) *\\*/;\\1;'"
|
|||
|
done
|
|||
|
for var in $off
|
|||
|
do
|
|||
|
edit="$edit -e 's;^#define $var [^/]*;/* & */;'"
|
|||
|
done
|
|||
|
|
|||
|
if test -n "$char_signed"
|
|||
|
then
|
|||
|
edit="$edit -e 's;^/\\* *\\(#define CHAR_SIGNED $char_signed\\) *\\*/;\\1;'"
|
|||
|
fi
|
|||
|
|
|||
|
edit="$edit -e 's/^typedef .*VOID;/typedef $void_ret VOID;/'"
|
|||
|
edit="$edit -e 's/^typedef .*UNIV;/typedef ${void_star}UNIV;/'"
|
|||
|
|
|||
|
if test "X$(PREFIX)" != "X/usr/local"
|
|||
|
then
|
|||
|
edit="$edit -e '/DEFAULT_PATH/s;/usr/local;$PREFIX;g'"
|
|||
|
fi
|
|||
|
|
|||
|
eval sed $edit unix.cfg ">config.out"
|
|||
|
|
|||
|
mv config.out config.h
|
|||
|
|
|||
|
exit 0
|