From f33038bc1b195c91aa70bad405cab4eaf366caea Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 16 Nov 2018 16:21:48 +0000 Subject: build: Require va_copy() or __va_copy() on non-MSVC compilers 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 --- NEWS | 4 ++++ cmake/ConfigureChecks.cmake | 20 +------------------- cmake/config.h.cmake | 3 --- configure.ac | 33 +-------------------------------- dbus/dbus-sysdeps.h | 14 -------------- 5 files changed, 6 insertions(+), 68 deletions(-) diff --git a/NEWS b/NEWS index 6ef72373..19667cc5 100644 --- 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 diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index 1144e93d..21346a24 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -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 - #include - 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(" diff --git a/cmake/config.h.cmake b/cmake/config.h.cmake index d2238816..6ca77675 100644 --- a/cmake/config.h.cmake +++ b/cmake/config.h.cmake @@ -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@ diff --git a/configure.ac b/configure.ac index fa542290..45bd8d66 100644 --- a/configure.ac +++ b/configure.ac @@ -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 - #include - ]], - [[ - 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 diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h index a5987ae5..fa20219e 100644 --- a/dbus/dbus-sysdeps.h +++ b/dbus/dbus-sysdeps.h @@ -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. -- cgit v1.2.1