summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/CMakeLists.txt12
-rwxr-xr-xqpid/cpp/src/check-abi49
2 files changed, 52 insertions, 9 deletions
diff --git a/qpid/cpp/src/CMakeLists.txt b/qpid/cpp/src/CMakeLists.txt
index 1335578146..9e48c240b5 100644
--- a/qpid/cpp/src/CMakeLists.txt
+++ b/qpid/cpp/src/CMakeLists.txt
@@ -26,6 +26,16 @@ foreach (r ${REQUIRE})
message(STATUS "Forcing ${r} to ${${r}_force}")
endforeach(r)
+# Capture specified C++ compiler (if any)
+if (NOT ENV_CXX)
+ if (NOT "$ENV{CXX}" STREQUAL "")
+ set(CXX $ENV{CXX})
+ else(NOT "$ENV{CXX}" STREQUAL "")
+ set(CXX ${CMAKE_CXX_COMPILER})
+ endif(NOT "$ENV{CXX}" STREQUAL "")
+ set(ENV_CXX ${CXX} CACHE INTERNAL "C++ compiler specified in cmake environment")
+endif (NOT ENV_CXX)
+
include(CheckFunctionExists)
include(CheckIncludeFileCXX)
include(CheckIncludeFiles)
@@ -148,7 +158,7 @@ ENDMACRO (add_msvc_version)
# Add a test to check the exported library API against expected API symbols
MACRO (add_api_test libname)
if (NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
- add_test(api_check_${libname} ${CMAKE_CURRENT_SOURCE_DIR}/check-abi ${CMAKE_CURRENT_BINARY_DIR}/lib${libname}.so ${CMAKE_CURRENT_SOURCE_DIR}/lib${libname}-api-symbols.txt)
+ add_test(api_check_${libname} ${CMAKE_CURRENT_SOURCE_DIR}/check-abi "${ENV_CXX}" ${CMAKE_CURRENT_BINARY_DIR}/lib${libname}.so ${CMAKE_CURRENT_SOURCE_DIR}/lib${libname}-api-symbols.txt)
endif (NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
ENDMACRO (add_api_test libname)
diff --git a/qpid/cpp/src/check-abi b/qpid/cpp/src/check-abi
index 6742ce8253..2b5d4eda68 100755
--- a/qpid/cpp/src/check-abi
+++ b/qpid/cpp/src/check-abi
@@ -1,5 +1,35 @@
#! /bin/bash
+# Ask the compiler the implementation specific type for a standard typedeffed type
+# (int64_t, size_t etc.). Operates by test compiling and using the demangling ABI call.
+#
+# This works for gcc and clang on Unix.
+full_type_of () {
+ prog=$(mktemp)
+ trap "rm $prog" EXIT
+
+ ${CXX:-g++} -x c++ -o $prog - <<END-FILE
+#include <stdint.h>
+#include <stdlib.h>
+#include <cxxabi.h>
+#include <iostream>
+#include <typeinfo>
+
+int main() {
+ int status;
+ char* printable_type =
+ __cxxabiv1::__cxa_demangle(typeid($1).name(), 0, 0, &status);
+ if (printable_type) {
+ std::cout << printable_type;
+ } else {
+ std::cout << "$1";
+ }
+ ::free(printable_type);
+}
+END-FILE
+$prog
+}
+
rc=0
syms_desired=$(mktemp)
syms_library=$(mktemp)
@@ -8,25 +38,28 @@ syms_extra=$(mktemp)
trap 'rm $syms_desired $syms_library $syms_missing $syms_extra' EXIT
+CXX=$1
+export CXX
+
# Extract exported symbols from library
-nm -DC --defined-only -f s $1 | cut -f1 -d'|' -s | sort -u > $syms_library
+nm -DC --defined-only -f s $2 | cut -f1 -d'|' -s | sort -u > $syms_library
# Process API syms (substitute in some typedefs etc.)
-sed $2 -e '
- s/uint64_t/unsigned long/
+sed $3 -e "
+ s/uint64_t/$(full_type_of uint64_t)/
s/uint32_t/unsigned int/
s/uint16_t/unsigned short/
s/uint8_t/unsigned char/
- s/size_t/unsigned long/
- s/int64_t/long/
+ s/size_t/$(full_type_of size_t)/
+ s/int64_t/$(full_type_of int64_t)/
s/int32_t/int/
s/int16_t/short/
s/int8_t/signed char/
s/qpid::types::Variant::Map/std::map<std::string, qpid::types::Variant, std::less<std::string>, std::allocator<std::pair<std::string const, qpid::types::Variant> > >/
s/qpid::types::Variant::List/std::list<qpid::types::Variant, std::allocator<qpid::types::Variant> >/
- /^$/d
- /^#.*$/d
-' | sort -u > $syms_desired
+ /^\$/d
+ /^#.*\$/d
+" | sort -u > $syms_desired
comm -23 $syms_desired $syms_library > $syms_missing
comm -13 $syms_desired $syms_library > $syms_extra