#!/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 #include #include #include #include #include #include #include ' # 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