mcst-linux-kernel/glibc-2.35/scripts/gen-posix-conf-vars.awk

105 lines
3.0 KiB
Awk

# Generate posix-conf-vars-def.h with definitions for CONF_DEF{CONF} for each
# configuration variable that getconf or sysconf may use. Currently it is
# equipped only to generate such macros for specification macros and for
# SYSCONF macros in the _POSIX namespace.
BEGIN {
prefix = ""
}
$1 ~ /^#/ || $0 ~ /^\s*$/ {
next
}
# Begin a new prefix.
$NF == "{" {
type = $1
prefix = $2
if (NF == 4)
sc_prefix = $3
else
sc_prefix = "_SC"
next
}
$1 == "}" {
prefix = ""
type = ""
sc_prefix = ""
next
}
{
if (prefix == "" && type == "" && sc_prefix == "") {
printf ("Syntax error at %s:%d\n", FILENAME, FNR) > "/dev/stderr"
exit 1
}
# The prefix and variable names are indices and the value indicates what type
# of variable it is. The possible options are:
# CONFSTR: A configuration string
# SYSCONF: A numeric value
# SPEC: A specification
c = prefix "_" $1
sc_prefixes[c] = sc_prefix
prefix_conf[c] = type
conf[c] = $1
}
END {
print "/* AUTOGENERATED by gen-posix-conf-vars.awk. DO NOT EDIT. */\n"
# Generate macros that specify if a sysconf macro is defined and/or set.
for (c in prefix_conf) {
printf "#ifndef _%s\n", c
printf "# define CONF_DEF_%s CONF_DEF_UNDEFINED\n", c
# CONFSTR have string values and they are not set or unset.
if (prefix_conf[c] != "CONFSTR") {
printf "#else\n"
printf "# if _%s > 0\n", c
printf "# define CONF_DEF_%s CONF_DEF_DEFINED_SET\n", c
printf "# else\n"
printf "# define CONF_DEF_%s CONF_DEF_DEFINED_UNSET\n", c
printf "# endif\n"
}
printf "#endif\n\n"
# Build a name -> sysconf number associative array to print a C array at
# the end.
if (prefix_conf[c] == "SPEC")
spec[c] = sc_prefixes[c] "_" conf[c]
}
print "/* If all of the environments are defined in environments.h, then we don't need"
print " to bother with doing a runtime check for a specific environment. */"
print "#if (defined _SC_V6_ILP32_OFF32 \\"
print " && defined _SC_V7_LPBIG_OFFBIG \\"
print " && defined _SC_XBS5_LP64_OFF64 \\"
print " && defined _SC_V6_LP64_OFF64 \\"
print " && defined _SC_V7_ILP32_OFFBIG \\"
print " && defined _SC_V6_LPBIG_OFFBIG \\"
print " && defined _SC_V7_LP64_OFF64 \\"
print " && defined _SC_V7_ILP32_OFF32 \\"
print " && defined _SC_XBS5_LPBIG_OFFBIG \\"
print " && defined _SC_XBS5_ILP32_OFFBIG \\"
print " && defined _SC_V6_ILP32_OFFBIG \\"
print " && defined _SC_XBS5_ILP32_OFF32)"
print "# define ALL_ENVIRONMENTS_DEFINED 1"
print "#endif"
# Print the specification array. Define the macro NEED_SPEC_ARRAY before
# including posix-conf-vars.h to make it available in the compilation unit.
print "#if NEED_SPEC_ARRAY && ! ALL_ENVIRONMENTS_DEFINED"
print "static const struct { const char *name; int num; } specs[] ="
print " {"
for (s in spec) {
printf " { \"%s\", %s },\n", s, spec[s]
}
print " };"
print "static const size_t nspecs = sizeof (specs) / sizeof (specs[0]);"
print "#endif"
}