blob: 856c17a28b908e222f80f54bf045dc245cedf97e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#!/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 <defs.h>
#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
# <built-in> markers, keeps source #define directives, and still emits the
# ordinary preprocessed result.
grep '^# 0 "'"$base/main.c"'"$' "$base/out" >/dev/null
grep '^# 0 "<built-in>"$' "$base/out" >/dev/null
grep '^#define __MCPU_CPP_VERSION__ "1.0.5"$' "$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 \"<built-in>\"") 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
|