]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
build: Require va_copy() or __va_copy() on non-MSVC compilers
authorSimon McVittie <smcv@collabora.com>
Fri, 16 Nov 2018 16:21:48 +0000 (16:21 +0000)
committerSimon McVittie <smcv@collabora.com>
Mon, 19 Nov 2018 11:27:25 +0000 (11:27 +0000)
va_copy() is a C99 feature, and should be widely supported by now.
gcc in strict C89 mode implements an equivalent __va_copy() instead.

MSVC 2013 implements va_copy(), but at the moment we still aim to support
MSVC 2010 and 2012, which don't have it. However, we know that in
Windows ABIs, va_list is a pointer, so we can use
_DBUS_VA_COPY_ASSIGN. We do not support MSVC for Autotools builds, only
CMake, due to its non-Unixish command-line interface.

Signed-off-by: Simon McVittie <smcv@collabora.com>
NEWS
cmake/ConfigureChecks.cmake
cmake/config.h.cmake
configure.ac
dbus/dbus-sysdeps.h

diff --git a/NEWS b/NEWS
index 6ef72373b2972a31ae03e9c835e17aefa55152a7..19667cc5f876432ad7bf7acca9f9f68235e6a3f2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,10 @@ Dependencies:
   MSVC >= 2005. In practice this requirement has existed since version
   1.9.2, but it is now official.
 
+• dbus now requires a C99-compatible va_copy() macro (or a __va_copy()
+  macro with the same behaviour), except when building for Windows using
+  MSVC and CMake.
+
 Enhancements:
 
 • Rewrite CONTRIBUTING.md to reflect the current setup
index 1144e93da750ce3bcb7a725a306b2eee93f580e0..21346a24eec77bf7fd4e1f688aed6a0031645a4a 100644 (file)
@@ -121,25 +121,7 @@ elseif(MSVC)
     # this is used for msvc < 2013
     set(DBUS_VA_COPY _DBUS_VA_COPY_ASSIGN)
 else()
-    CHECK_C_SOURCE_RUNS("
-    #include <stdarg.h>
-    #include <stdlib.h>
-    static void f (int i, ...) {
-        va_list args1, args2;
-        va_start (args1, i);
-        args2 = args1;
-        if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
-            exit (1);
-        va_end (args1); va_end (args2);
-    }
-    int main() {
-        f (0, 42);
-        return 0;
-    }
-    " VA_COPY_AS_ARRAY)
-    if (NOT VA_COPY_AS_ARRAY)
-        set(DBUS_VA_COPY_AS_ARRAY 1 CACHE STRING "Set to 1 if va_list cannot be copied as a value")
-    endif()
+    message(FATAL_ERROR "dbus requires an ISO C99-compatible va_copy() macro, or a similar __va_copy(), or MSVC >= 2010")
 endif()
 
 CHECK_C_SOURCE_COMPILES("
index d223881662bd26e77145890a9c12d36261e4ab40..6ca77675f223a3ac0c081a83da5c34deb7dca534 100644 (file)
@@ -71,9 +71,6 @@
 /* for msvc */
 #define _DBUS_VA_COPY_ASSIGN(a1,a2) { a1 = a2; }
 
-/* Define if va_list cannot be copied as a value */
-#cmakedefine DBUS_VA_COPY_AS_ARRAY 1
-
 #cmakedefine DBUS_WITH_GLIB 1
 #cmakedefine GLIB_VERSION_MIN_REQUIRED @GLIB_VERSION_MIN_REQUIRED@
 #cmakedefine GLIB_VERSION_MAX_ALLOWED  @GLIB_VERSION_MAX_ALLOWED@
index fa542290ccea47c5c9397b3c7a454abc1c130c0e..45bd8d66400623706ff7c594d19ca9346109d9f5 100644 (file)
@@ -565,38 +565,7 @@ fi
 
 AS_IF([test -n "$dbus_va_copy_func"],
   [AC_DEFINE_UNQUOTED([DBUS_VA_COPY], [$dbus_va_copy_func], [A 'va_copy' style function])],
-  [
-    AC_LANG_PUSH([C])
-    AC_CACHE_CHECK([whether va_lists can be copied by value],
-                   [dbus_cv_va_val_copy],
-                   [AC_RUN_IFELSE([
-                      AC_LANG_PROGRAM([[
-                        #include <stdarg.h>
-                        #include <stdlib.h>
-                      ]],
-                      [[
-                        static void f (int i, ...) {
-                          va_list args1, args2;
-                          va_start (args1, i);
-                          args2 = args1;
-                          if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
-                            exit (1);
-                          va_end (args1); va_end (args2);
-                        }
-                        int main() {
-                          f (0, 42);
-                          return 0;
-                        }
-                      ]])
-                    ],
-                    [dbus_cv_va_val_copy=yes],
-                    [dbus_cv_va_val_copy=no],
-                    [dbus_cv_va_val_copy=yes])
-                   ])
-    AC_LANG_POP([C])
-    AS_IF([test "x$dbus_cv_va_val_copy" = "xno"],
-      [AC_DEFINE([DBUS_VA_COPY_AS_ARRAY], 1, [Define if 'va_list' cannot be copied as a value])])
-  ])
+  [AC_MSG_ERROR([dbus requires an ISO C99-compatible va_copy() macro, or a compatible __va_copy(), or MSVC >= 2010 and CMake])])
 
 #### Atomic integers
 
index a5987ae5add3276d203c4f1b4aed4d4769220d3f..fa20219ed2e3b1241b86938cab05b5dec9869420 100644 (file)
@@ -614,20 +614,6 @@ void _dbus_logv (DBusSystemLogSeverity  severity,
                  const char            *msg,
                  va_list args) _DBUS_GNUC_PRINTF (2, 0);
 
-/* Define DBUS_VA_COPY() to do the right thing for copying va_list variables.
- * config.h may have already defined DBUS_VA_COPY as va_copy or __va_copy.
- */
-#if !defined (DBUS_VA_COPY)
-#  if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
-#    define DBUS_VA_COPY(ap1, ap2)   (*(ap1) = *(ap2))
-#  elif defined (DBUS_VA_COPY_AS_ARRAY)
-#    define DBUS_VA_COPY(ap1, ap2)   memcpy ((ap1), (ap2), sizeof (va_list))
-#  else /* va_list is a pointer */
-#    define DBUS_VA_COPY(ap1, ap2)   ((ap1) = (ap2))
-#  endif /* va_list is a pointer */
-#endif /* !DBUS_VA_COPY */
-
-
 /**
  * Casts a primitive C type to a byte array and then indexes
  * a particular byte of the array.