diff options
Diffstat (limited to 'qpid/cpp/src')
| -rw-r--r-- | qpid/cpp/src/CMakeLists.txt | 12 | ||||
| -rwxr-xr-x | qpid/cpp/src/check-abi | 49 |
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 |
