@@ -4,8 +4,97 @@ output=$(./simplecpp simplecpp.cpp -e -f 2>&1)
44ec=$?
55errors=$( echo " $output " | grep -v ' Header not found: <' )
66if [ $ec -ne 0 ]; then
7- # only fail if got errors which do not refer to missing system includes
7+ # only fail if we got errors which do not refer to missing system includes
88 if [ ! -z " $errors " ]; then
99 exit $ec
1010 fi
11- fi
11+ fi
12+
13+ if [ -z " $CXX " ]; then
14+ exit 0
15+ fi
16+
17+ cxx_type=$( $CXX --version | head -1 | cut -d' ' -f1)
18+ if [ " $cxx_type " = " Ubuntu" ]; then
19+ cxx_type=$( $CXX --version | head -1 | cut -d' ' -f2)
20+ fi
21+ # TODO: how to get built-in include paths from compiler?
22+ if [ " $cxx_type " = " g++" ]; then
23+ gcc_ver=$( $CXX -dumpversion)
24+ defs=
25+ defs=" $defs -D__GNUC__"
26+ defs=" $defs -D__STDC__"
27+ defs=" $defs -D__STDC_HOSTED__"
28+ defs=" $defs -D__CHAR_BIT__=8"
29+ defs=" $defs -D__x86_64__"
30+ defs=" $defs -D__has_builtin(x)=(1)"
31+ defs=" $defs -D__has_cpp_attribute(x)=(1)"
32+ defs=" $defs -D__has_attribute(x)=(1)"
33+ # some required include paths might differ per distro
34+ inc=
35+ inc=" $inc -I/usr/include"
36+ inc=" $inc -I/usr/include/linux"
37+ inc=" $inc -I/usr/include/c++/$gcc_ver "
38+ if [ -d " /usr/include/c++/$gcc_ver /x86_64-pc-linux-gnu" ]; then
39+ inc=" $inc -I/usr/include/c++/$gcc_ver /x86_64-pc-linux-gnu"
40+ fi
41+ if [ -d " /usr/lib/gcc/x86_64-pc-linux-gnu/$gcc_ver /include" ]; then
42+ inc=" $inc -I/usr/lib/gcc/x86_64-pc-linux-gnu/$gcc_ver /include"
43+ fi
44+ if [ -d " /usr/lib/gcc/x86_64-linux-gnu/$gcc_ver /include" ]; then
45+ inc=" $inc -I/usr/lib/gcc/x86_64-linux-gnu/$gcc_ver /include"
46+ fi
47+ if [ -d " /usr/include/x86_64-linux-gnu" ]; then
48+ inc=" $inc -I/usr/include/x86_64-linux-gnu"
49+ inc=" $inc -I/usr/include/x86_64-linux-gnu/c++/$gcc_ver "
50+ fi
51+ ./simplecpp simplecpp.cpp -e -f -std=gnu++11 $defs $inc
52+ ec=$?
53+ if [ $ec -ne 0 ]; then
54+ exit $ec
55+ fi
56+ elif [ " $cxx_type " = " clang" ]; then
57+ clang_ver=$( $CXX -dumpversion)
58+ clang_ver=${clang_ver%% .* }
59+ defs=
60+ defs=" $defs -D__BYTE_ORDER__"
61+ defs=" $defs -D__linux__"
62+ defs=" $defs -D__x86_64__"
63+ defs=" $defs -D__SIZEOF_SIZE_T__=8"
64+ defs=" $defs -D__has_feature(x)=(1)"
65+ defs=" $defs -D__has_extension(x)=(1)"
66+ defs=" $defs -D__has_attribute(x)=(0)"
67+ defs=" $defs -D__has_cpp_attribute(x)=(0)"
68+ defs=" $defs -D__has_include_next(x)=(0)"
69+ defs=" $defs -D__has_builtin(x)=(1)"
70+ cxx_inc=" -I/usr/include/c++/v1"
71+ if [ ! -d " $cxx_inc " ]; then
72+ cxx_inc=" -I/usr/lib/llvm-$clang_ver /include/c++/v1"
73+ fi
74+ # some required include paths might differ per distro
75+ inc=$cxx_inc
76+ inc=" $inc -I/usr/include"
77+ inc=" $inc -I/usr/lib/clang/$clang_ver /include"
78+ if [ -d " /usr/include/x86_64-linux-gnu" ]; then
79+ inc=" $inc -I/usr/include/x86_64-linux-gnu"
80+ fi
81+ ./simplecpp simplecpp.cpp -e -f -std=gnu++11 $defs $inc
82+ ec=$?
83+ if [ $ec -ne 0 ]; then
84+ exit $ec
85+ fi
86+ elif [ " $cxx_type " = " Apple" ]; then
87+ find /Applications -name endian.h
88+ xcode_path=" /Applications/Xcode_16.4.app"
89+ if [ ! -d " $xcode_path " ]; then
90+ xcode_path=" /Applications/Xcode_15.2.app"
91+ fi
92+ ./simplecpp simplecpp.cpp -e -f -std=gnu++11 -D__BYTE_ORDER__ -D__APPLE__ -I" $xcode_path /Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include" -I" $xcode_path /Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1"
93+ ec=$?
94+ if [ $ec -ne 0 ]; then
95+ exit $ec
96+ fi
97+ else
98+ echo " unknown compiler '$cxx_type '"
99+ exit 1
100+ fi
0 commit comments