summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2018-11-16 16:21:48 +0000
committerSimon McVittie <smcv@collabora.com>2018-11-19 11:27:25 +0000
commitf33038bc1b195c91aa70bad405cab4eaf366caea (patch)
treeff97119e644d449155f9014a00cb14aa80749a29
parentdab4a12e0e556a5a3c88abfdd83e55cab465b79c (diff)
downloaddbus-f33038bc1b195c91aa70bad405cab4eaf366caea.tar.gz
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 <smcv@collabora.com>
-rw-r--r--NEWS4
-rw-r--r--cmake/ConfigureChecks.cmake20
-rw-r--r--cmake/config.h.cmake3
-rw-r--r--configure.ac33
-rw-r--r--dbus/dbus-sysdeps.h14
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 <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("
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 <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
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.