Report compiler in -d -bV. Clang compat.
authorPhil Pennock <pdp@exim.org>
Tue, 22 Mar 2011 10:33:20 +0000 (06:33 -0400)
committerPhil Pennock <pdp@exim.org>
Tue, 22 Mar 2011 10:33:20 +0000 (06:33 -0400)
Exim successfully builds with clang, albeit with a number of warnings.

 * Our %n usage in printf() calls appears to be correct and safe, AFAICT.
 * dummy functions are, unsurprisingly, unused
 * Valgrind macros cause vociferous complaints
 * Dynamic modules *not* tested

Further clang testing on my part will require an OS update and clang
2.9 to get -rdynamic support.

src/src/buildconfig.c
src/src/exim.c
src/src/lookups/whoson.c
src/src/mytypes.h

index c012fb7..5693977 100644 (file)
@@ -103,8 +103,10 @@ main(int argc, char **argv)
 {
 off_t test_off_t = 0;
 time_t test_time_t = 0;
+#if ! (__STDC_VERSION__ >= 199901L)
 size_t test_size_t = 0;
 unsigned long test_ulong_t = 0L;
+#endif
 long test_long_t = 0;
 FILE *base;
 FILE *new;
index f086a00..3592f30 100644 (file)
@@ -926,6 +926,21 @@ DEBUG(D_any) do {
 
   int i;
 
+/* clang defines __GNUC__ (at least, for me) so test for it first */
+#if defined(__clang__)
+  fprintf(f, "Compiler: CLang [%s]\n", __clang_version__);
+#elif defined(__GNUC__)
+  fprintf(f, "Compiler: GCC [%s]\n",
+# ifdef __VERSION__
+      __VERSION__
+# else
+      "? unknown version ?"
+# endif
+      );
+#else
+  fprintf(f, "Compiler: <unknown>\n");
+#endif
+
 #ifdef AUTH_CYRUS_SASL
   auth_cyrus_sasl_version_report(f);
 #endif
index b4527a9..4a9f01b 100644 (file)
@@ -47,7 +47,7 @@ length = length;
 errmsg = errmsg;
 do_cache = do_cache;
 
-switch (wso_query(query, CS buffer, sizeof(buffer)))
+switch (wso_query(CS query, CS buffer, sizeof(buffer)))
   {
   case 0:
   *result = string_copy(buffer);    /* IP in database; return name of user */
index abf1f53..7a83da8 100644 (file)
@@ -31,7 +31,7 @@ local_scan.h includes it and exim.h includes them both (to get this earlier). */
 /* If gcc is being used to compile Exim, we can use its facility for checking
 the arguments of printf-like functions. This is done by a macro. */
 
-#ifdef __GNUC__
+#if defined(__GNUC__) || defined(__clang__)
 #define PRINTF_FUNCTION(A,B)  __attribute__((format(printf,A,B)))
 #else
 #define PRINTF_FUNCTION(A,B)