| #!/bin/sh | 
 |  | 
 | # Copyright 2015 The Chromium OS Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | # Generates a header file with a named constant table made up of "name", value | 
 | # entries by including several build target header files and emitting the list | 
 | # of defines.  Use of the preprocessor is needed to recursively include all | 
 | # relevant headers. | 
 |  | 
 | set -e | 
 |  | 
 | if [ $# -ne 1 ] && [ $# -ne 2 ]; then | 
 |   echo "Usage: $(basename "$0") OUTFILE" | 
 |   echo "Usage: $(basename "$0") CC OUTFILE" | 
 |   exit 1 | 
 | fi | 
 |  | 
 | if [ $# -eq 2 ]; then | 
 |   CC="$1" | 
 |   shift | 
 | fi | 
 | OUTFILE="$1" | 
 |  | 
 | INCLUDES=' | 
 | #include <errno.h> | 
 | #include <fcntl.h> | 
 | #include <linux/prctl.h> | 
 | #include <linux/sched.h> | 
 | #include <stddef.h> | 
 | #include <signal.h> | 
 | #include <sys/stat.h> | 
 | #include <sys/types.h>' | 
 |  | 
 | # Generate a dependency file which helps the build tool to see when it | 
 | # should regenerate ${OUTFILE}. | 
 | echo "${INCLUDES}" | ${CC} - -E -M -MF "${OUTFILE}.d.tmp" | 
 | # Correct the output filename. | 
 | (echo "${OUTFILE}: \\" ; sed -e 's/^-\.o://' -e 's/^-://' "${OUTFILE}.d.tmp") \ | 
 |   > "${OUTFILE}.d" | 
 | rm "${OUTFILE}.d.tmp" | 
 |  | 
 | # sed expression which extracts constants and converts them from: | 
 | #   #define AT_FDWCD foo | 
 | # to: | 
 | # #ifdef AT_FDCWD | 
 | #   { "AT_FDWCD", AT_FDCWD }, | 
 | # endif | 
 | SED_MULTILINE='s@#define ([[:upper:]][[:upper:]0-9_]*).*@#ifdef \1\ | 
 |   { "\1", (unsigned long) \1 },\ | 
 | #endif  // \1@' | 
 |  | 
 | # Passes the previous list of #includes to the C preprocessor and prints out | 
 | # all #defines whose name is all-caps.  Excludes a few symbols that are known | 
 | # macro functions that don't evaluate to a constant. | 
 | cat <<-EOF > "${OUTFILE}" | 
 | /* GENERATED BY MAKEFILE */ | 
 | $INCLUDES | 
 |  | 
 | #include "libconstants.h" | 
 | const struct constant_entry constant_table[] = { | 
 | $(echo "$INCLUDES" | \ | 
 |   ${CC} -dD - -E | \ | 
 |   grep -E '^#define [[:upper:]][[:upper:]0-9_]*(\s)+[[:alnum:]]' | \ | 
 |   grep -Ev '(SIGRTMAX|SIGRTMIN|SIG_|NULL)' | \ | 
 |   sort -u | \ | 
 |   sed -Ee "${SED_MULTILINE}") | 
 |   { NULL, 0 }, | 
 | }; | 
 | EOF |