libnbd/0004-Fix-compilation-with-C.patch

163 lines
4.6 KiB
Diff
Raw Normal View History

From e1efb1fd2efbadfa0a2b53662f2757c728e119ab Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 3 Aug 2019 11:00:40 +0100
Subject: [PATCH 04/11] Fix compilation with C++.
We lacked the appropriate extern "C" section in the header, so
compilation would fail if you were using C++.
This also adds a simple regression test.
---
.gitignore | 1 +
configure.ac | 11 +++++++++
generator/generator | 8 +++++++
tests/Makefile.am | 12 ++++++++++
tests/compile-cxx.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++
5 files changed, 84 insertions(+)
create mode 100644 tests/compile-cxx.cpp
diff --git a/.gitignore b/.gitignore
index e69d243..9558577 100644
--- a/.gitignore
+++ b/.gitignore
@@ -111,6 +111,7 @@ Makefile.in
/tests/closure-lifetimes
/tests/compile
/tests/compile-ansi-c
+/tests/compile-cxx
/tests/compile-header-only
/tests/connect-tcp
/tests/connect-tls-certs
diff --git a/configure.ac b/configure.ac
index 30d7f90..8c47e61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,6 +44,17 @@ AM_PROG_CC_C_O
AX_PTHREAD
+dnl Check for C++ (optional, we just use this to test the header
+dnl can be included from C++ code).
+AC_PROG_CXX
+
+dnl The C++ compiler test is pretty useless because even if it fails
+dnl it sets CXX=g++. So test the compiler actually works.
+AC_MSG_CHECKING([if the C++ compiler really really works])
+AS_IF([$CXX --version >&AS_MESSAGE_LOG_FD 2>&1],[have_cxx=yes],[have_cxx=no])
+AC_MSG_RESULT([$have_cxx])
+AM_CONDITIONAL([HAVE_CXX], [test "$have_cxx" = "yes"])
+
AC_ARG_ENABLE([gcc-warnings],
[AS_HELP_STRING([--enable-gcc-warnings],
[turn on lots of GCC warnings (for developers)])],
diff --git a/generator/generator b/generator/generator
index 62ca99c..0d10214 100755
--- a/generator/generator
+++ b/generator/generator
@@ -3332,6 +3332,10 @@ let generate_include_libnbd_h () =
pr "#include <stdint.h>\n";
pr "#include <sys/socket.h>\n";
pr "\n";
+ pr "#ifdef __cplusplus\n";
+ pr "extern \"C\" {\n";
+ pr "#endif\n";
+ pr "\n";
pr "struct nbd_handle;\n";
pr "\n";
pr "typedef void (*nbd_close_callback) (void *user_data);\n";
@@ -3361,6 +3365,10 @@ let generate_include_libnbd_h () =
fun (ns, ctxts) -> print_ns ns ctxts
) metadata_namespaces;
pr "\n";
+ pr "#ifdef __cplusplus\n";
+ pr "}\n";
+ pr "#endif\n";
+ pr "\n";
pr "#endif /* LIBNBD_H */\n"
let generate_lib_unlocked_h () =
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 59318b4..3064301 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -109,6 +109,18 @@ export_name_CPPFLAGS = -I$(top_srcdir)/include
export_name_CFLAGS = $(WARNINGS_CFLAGS)
export_name_LDADD = $(top_builddir)/lib/libnbd.la
+if HAVE_CXX
+
+check_PROGRAMS += compile-cxx
+TESTS += compile-cxx
+
+compile_cxx_SOURCES = compile-cxx.cpp
+compile_cxx_CPPFLAGS = -I$(top_srcdir)/include
+compile_cxx_CXXFLAGS = $(WARNINGS_CFLAGS)
+compile_cxx_LDADD = $(top_builddir)/lib/libnbd.la
+
+endif HAVE_CXX
+
#----------------------------------------------------------------------
# The following tests require nbdkit as an NBD server to test against.
diff --git a/tests/compile-cxx.cpp b/tests/compile-cxx.cpp
new file mode 100644
index 0000000..4c8447c
--- /dev/null
+++ b/tests/compile-cxx.cpp
@@ -0,0 +1,52 @@
+/* NBD client library in userspace
+ * Copyright (C) 2013-2019 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/* Test compilation with C++. */
+
+#ifndef __cplusplus
+#error "this test should be compiled with a C++ compiler"
+#endif
+
+#include <config.h>
+
+#include <iostream>
+#include <cstdlib>
+
+#include <libnbd.h>
+
+using namespace std;
+
+int
+main ()
+{
+ struct nbd_handle *nbd;
+
+ nbd = nbd_create ();
+ if (nbd == NULL) {
+ cerr << nbd_get_error () << endl;
+ exit (EXIT_FAILURE);
+ }
+
+ cout << nbd_get_package_name (nbd)
+ << " "
+ << nbd_get_version (nbd)
+ << endl;
+
+ nbd_close (nbd);
+ exit (EXIT_SUCCESS);
+}
--
2.22.0