add gcc5 ABI test tool
authorRobin Gareus <robin@gareus.org>
Fri, 11 Sep 2015 10:36:08 +0000 (12:36 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 11 Sep 2015 10:40:39 +0000 (12:40 +0200)
tools/g++5ABIcheck/Makefile [new file with mode: 0644]
tools/g++5ABIcheck/README [new file with mode: 0644]
tools/g++5ABIcheck/gcc5stc++test.i386-linux-gnu [new file with mode: 0755]
tools/g++5ABIcheck/gcc5stc++test.x86_64-linux-gnu [new file with mode: 0755]
tools/g++5ABIcheck/test.cc [new file with mode: 0644]

diff --git a/tools/g++5ABIcheck/Makefile b/tools/g++5ABIcheck/Makefile
new file mode 100644 (file)
index 0000000..3061785
--- /dev/null
@@ -0,0 +1,6 @@
+all:
+       g++ -o gcc5stc++test.`gcc -print-multiarch` test.cc -Wall -std=c++11 -O0
+       nm gcc5stc++test.`gcc -print-multiarch` | c++filt | grep -q __cxx11
+       strip gcc5stc++test.`gcc -print-multiarch`
+
+.PHONY: all
diff --git a/tools/g++5ABIcheck/README b/tools/g++5ABIcheck/README
new file mode 100644 (file)
index 0000000..0017bf8
--- /dev/null
@@ -0,0 +1,57 @@
+g++5 ABI test tool
+==================
+
+This is a simple tool to test a system for g++5's libstdc++ at runtime.
+
+GCC5.1 introduced a new library ABI for the C++ standard library.
+The old 3.4 .. 5.0 ABI is not compatible.
+
+Some GNU/Linux distributions systems switched to the new ABI already
+and compile plugins with the new gcc.
+
+If a plugin uses a c++ library that is also shipped with ardour-bundles,
+the ABI of that library must match. Currently known cases: gtkmm, glibmm.
+
+e.g. Ingen or eq10q provided by a distro compiled with gcc5 will not
+load in Ardour as provided by ardour.org compiled with gcc4 because ardour
+ships an incompatible gtkmm, glibmm, cairomm, ...
+
+The plugin will fail to load. For example:
+
+```
+suil error: Unable to open UI library /usr/lib/lv2/sapistaEQv2.lv2/gui/eq10qs_gui.so (/usr/lib/lv2/sapistaEQv2.lv2/gui/eq10qs_gui.so: undefined symbol: _ZN4Glib7ustringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE)
+suil error: Unable to open UI library /usr/lib/lv2/vocproc.lv2/vocproc_gui.so (/usr/lib/lv2/vocproc.lv2/vocproc_gui.so: undefined symbol: _ZN3Gtk7Builder13add_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE)
+lilv_lib_open(): error: Failed to open library /usr/lib/lv2/ingen.lv2/libingen_lv2.so (/usr/lib/libingen.so.0: undefined symbol: _ZN4Glib6ModuleC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_11ModuleFlagsEEE)
+```
+
+ie `Glib::ustring::ustring(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)`
+
+
+Compilation
+-----------
+
+This tool must be compiled on a system with gcc5.1 or later.
+
+   make
+
+will fail the resulting binary does not use the new __cxx11 ABI.
+The resulting binary will *not* run on systems with only the old ABI.
+
+For convenience (packaging gcc4 builds), pre-compiled binaries are included.
+
+
+Check
+-----
+
+The idea is to include the precompiled binaries in the installer
+
+ - Ardour/gcc-4 installer must fail if the binary runs
+ - Ardour/gcc-5 installer must fail if the binary does not run
+
+
+References
+----------
+
+https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
+https://wiki.debian.org/GCC5
+https://mail.gnome.org/archives/gtkmm-list/2015-June/thread.html
diff --git a/tools/g++5ABIcheck/gcc5stc++test.i386-linux-gnu b/tools/g++5ABIcheck/gcc5stc++test.i386-linux-gnu
new file mode 100755 (executable)
index 0000000..8678858
Binary files /dev/null and b/tools/g++5ABIcheck/gcc5stc++test.i386-linux-gnu differ
diff --git a/tools/g++5ABIcheck/gcc5stc++test.x86_64-linux-gnu b/tools/g++5ABIcheck/gcc5stc++test.x86_64-linux-gnu
new file mode 100755 (executable)
index 0000000..8ee0b27
Binary files /dev/null and b/tools/g++5ABIcheck/gcc5stc++test.x86_64-linux-gnu differ
diff --git a/tools/g++5ABIcheck/test.cc b/tools/g++5ABIcheck/test.cc
new file mode 100644 (file)
index 0000000..c3a915c
--- /dev/null
@@ -0,0 +1,13 @@
+#include <cstdio>
+#include <string>
+
+void check (std::string const& str) {
+       std::printf ("%s\n",    str.c_str());
+}
+
+int main (int argc, char **argv) {
+       std::printf ("gcc %s\n", __VERSION__);
+       std::string test("gcc5/libstc++11");
+       check (test);
+       return 0;
+}