| #!/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") INFILE OUTFILE" |
| exit 1 |
| fi |
| |
| BUILD="${CC} -dD ${SRC:-.}/gen_constants.c -E" |
| GEN_DEPS=1 |
| |
| if [ $# -eq 2 ]; then |
| BUILD="cat $1" |
| GEN_DEPS=0 |
| shift |
| fi |
| OUTFILE="$1" |
| |
| if [ ${GEN_DEPS} -eq 1 ]; then |
| # Generate a dependency file which helps the build tool to see when it |
| # should regenerate ${OUTFILE}. |
| ${BUILD} -M -MF "${OUTFILE}.d" |
| fi |
| |
| # 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 */ |
| #include "gen_constants-inl.h" |
| #include "libconstants.h" |
| const struct constant_entry constant_table[] = { |
| $(${BUILD} | \ |
| grep -E '^#define [[:upper:]][[:upper:]0-9_]*[[:space:]]+[[:alnum:]_]' | \ |
| grep -Ev '(SIGRTMAX|SIGRTMIN|SIG_|NULL)' | \ |
| sort -u | \ |
| sed -Ee "${SED_MULTILINE}") |
| { NULL, 0 }, |
| }; |
| EOF |