#!/bin/sh set -eu base="${TMPDIR-/tmp}/mcpu-cpp-dump-origin-$$" mkdir -p "$base" trap 'rm -rf "$base"' EXIT HUP INT TERM cat > "$base/main.c" <<'EOT' #define Z_USER 62 #define A_USER 37 #define ФУНКЦИЯ(x) x + 1 #undef __MCPU_CPP_VERSION__ EOT # -dM contains only ordinary final-state macros. Source and command-line # definitions are ordinary; built-ins are not. "$MCPU_CPP" --no-config -dM -DCMD_USER=91 "$base/main.c" > "$base/dM" grep -Fx '#define A_USER 37' "$base/dM" >/dev/null grep -Fx '#define CMD_USER 91' "$base/dM" >/dev/null grep -Fx '#define Z_USER 62' "$base/dM" >/dev/null grep -Fx '#define ФУНКЦИЯ(x) x + 1' "$base/dM" >/dev/null if grep '^#define _ARCH_MCPU ' "$base/dM" >/dev/null; then exit 1; fi if grep '^#define __MCPU_' "$base/dM" >/dev/null; then exit 1; fi LC_ALL=C sort -c "$base/dM" # Empty input has no ordinary definitions. "$MCPU_CPP" --no-config -dM < /dev/null > "$base/empty-dM" test ! -s "$base/empty-dM" # -dMP contains predefined macros first and ordinary macros second. Both # groups are deterministic and the #undef above removes the version builtin. "$MCPU_CPP" --no-config -dMP -DCMD_USER=91 "$base/main.c" > "$base/dMP" grep -Fx '#define _ARCH_MCPU 1' "$base/dMP" >/dev/null grep -Fx '#define A_USER 37' "$base/dMP" >/dev/null grep -Fx '#define CMD_USER 91' "$base/dMP" >/dev/null grep -Fx '#define Z_USER 62' "$base/dMP" >/dev/null grep -Fx '#define ФУНКЦИЯ(x) x + 1' "$base/dMP" >/dev/null if grep '^#define __MCPU_CPP_VERSION__ ' "$base/dMP" >/dev/null; then exit 1; fi predefined_line=`grep -n '^#define _ARCH_MCPU 1$' "$base/dMP" | sed 's/:.*//'` ordinary_line=`grep -n '^#define A_USER 37$' "$base/dMP" | sed 's/:.*//'` test "$predefined_line" -lt "$ordinary_line" # Verify ordering inside the ordinary tail explicitly. tail -n +"$ordinary_line" "$base/dMP" > "$base/ordinary-tail" LC_ALL=C sort -c "$base/ordinary-tail" # A former builtin name, if explicitly redefined after #undef, is an ordinary # macro because origin follows the current definition rather than the spelling. cat > "$base/redefine.c" <<'EOT' #undef _ARCH_MCPU #define _ARCH_MCPU 777 #define LOCAL 1 EOT "$MCPU_CPP" --no-config -dM "$base/redefine.c" > "$base/redefine-dM" grep -Fx '#define _ARCH_MCPU 777' "$base/redefine-dM" >/dev/null "$MCPU_CPP" --no-config -dMP "$base/redefine.c" > "$base/redefine-dMP" grep -Fx '#define _ARCH_MCPU 777' "$base/redefine-dMP" >/dev/null test "`grep -c '^#define _ARCH_MCPU ' "$base/redefine-dMP"`" -eq 1 # Context-dependent special builtins remain outside the static dump. for name in __FILE__ __LINE__ __DATE__ __TIME__ __BASE_FILE__ __INCLUDE_LEVEL__; do if grep "^#define ${name}\\>" "$base/dMP" >/dev/null; then exit 1; fi done