#!/bin/sh set -eu base="${TMPDIR-/tmp}/mcpu-cpp-dD-$$" mkdir -p "$base/inc" trap 'rm -rf "$base"' EXIT HUP INT TERM cat > "$base/inc/defs.h" <<'EOT' #ifndef MCPP_TEST_DEFS_H #define MCPP_TEST_DEFS_H 1 #define FROM_HEADER 17 /* header definition */ #endif /* MCPP_TEST_DEFS_H */ EOT cat > "$base/main.c" <<'EOT' #include #define LOCAL_VALUE 25 // local definition LOCAL_VALUE + FROM_HEADER EOT "$MCPU_CPP" --no-config -I"$base/inc" -dD "$base/main.c" -o "$base/out" # -dD starts with an input marker, emits predefined definitions with # markers, keeps source #define directives, and still emits the # ordinary preprocessed result. grep '^# 0 "'"$base/main.c"'"$' "$base/out" >/dev/null grep '^# 0 ""$' "$base/out" >/dev/null grep '^#define __MCPU_CPP_VERSION__ "1.0.3"$' "$base/out" >/dev/null grep '^#define FROM_HEADER 17$' "$base/out" >/dev/null grep '^#define LOCAL_VALUE 25$' "$base/out" >/dev/null if grep '^[[:blank:]]*#[[:blank:]]*\(if\|ifdef\|ifndef\|elif\|else\|endif\)\>' "$base/out" >/dev/null; then exit 1 fi grep '^25 + 17$' "$base/out" >/dev/null if grep '[[:blank:]]$' "$base/out" >/dev/null; then exit 1 fi # Every predefined definition in the initial block has its own built-in marker. awk ' /^# 1 / { exit } /^#define / { if( previous != "# 0 \"\"") exit 1 } { previous = $0 } ' "$base/out" # Without -dD the same source definitions are removed from normal output. "$MCPU_CPP" --no-config -I"$base/inc" "$base/main.c" -o "$base/normal" if grep '^#define LOCAL_VALUE 25$' "$base/normal" >/dev/null; then exit 1 fi