You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2017/10/19 12:40:13 UTC

[27/50] qpid-proton git commit: PROTON-1621: Enable C++11 example testing for C++11 build environments

PROTON-1621: Enable C++11 example testing for C++11 build environments

Run the C++ compilier feature checking from the top level Cmake file so
examples and the C++ binding are built consistently.

NOTE: This does not address the problem of building examples with partially
capable compilers (MSVC < 13), only compilers that advertize full C++11 support.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6b2e7dcd
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6b2e7dcd
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6b2e7dcd

Branch: refs/heads/go1
Commit: 6b2e7dcdbee49947f2fdcfa2a8f5950a9b87fbd3
Parents: 38019a6
Author: Alan Conway <ac...@redhat.com>
Authored: Fri Oct 13 18:10:04 2017 +0100
Committer: Alan Conway <ac...@redhat.com>
Committed: Fri Oct 13 18:51:37 2017 +0100

----------------------------------------------------------------------
 CMakeLists.txt                                  |   2 +
 .../cpp/multithreaded_client_flow_control.cpp   |   3 +-
 proton-c/bindings/cpp/CMakeLists.txt            |  43 +------
 proton-c/bindings/cpp/cpp.cmake                 | 116 ++++++++++++++-----
 4 files changed, 96 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6b2e7dcd/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b87f232..bab0ccf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -192,6 +192,8 @@ macro(set_search_path result)
   file(TO_NATIVE_PATH "${${result}}" ${result}) # native slash separators
 endmacro()
 
+# Include C++ compiler definition needed by bindings/cpp and examples/cpp
+include(${CMAKE_CURRENT_SOURCE_DIR}/proton-c/bindings/cpp/cpp.cmake)
 add_subdirectory(proton-c)
 add_subdirectory(examples)
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6b2e7dcd/examples/cpp/multithreaded_client_flow_control.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/multithreaded_client_flow_control.cpp b/examples/cpp/multithreaded_client_flow_control.cpp
index 3f7e2b4..427b9c8 100644
--- a/examples/cpp/multithreaded_client_flow_control.cpp
+++ b/examples/cpp/multithreaded_client_flow_control.cpp
@@ -261,7 +261,8 @@ int main(int argc, const char **argv) {
         int count = n_messages * n_threads;
 
         // Total messages to be received, multiple receiver threads will decrement this.
-        std::atomic_int remaining(count);
+        std::atomic_int remaining;
+        remaining.store(count);
 
         // Run the proton container
         proton::container container;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6b2e7dcd/proton-c/bindings/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt
index 859e364..33cbfa8 100644
--- a/proton-c/bindings/cpp/CMakeLists.txt
+++ b/proton-c/bindings/cpp/CMakeLists.txt
@@ -17,47 +17,8 @@
 # under the License.
 #
 
-set (BUILD_CPP_03 OFF CACHE BOOL "Compile the C++ binding as C++03 even when C++11 is available")
-
-# This effectively checks for cmake version 3.1 or later
-if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
-  if (BUILD_CPP_03)
-    set(STD 98)
-  else ()
-    set(STD 11)
-  endif ()
-  set(CMAKE_CXX_STANDARD ${STD})
-  set(CMAKE_CXX_EXTENSIONS OFF)
-# AStitcher 20170804: Disabled for present - work on this when Windows C++ works
-#  cmake_minimum_required(VERSION 3.1)
-#  include(WriteCompilerDetectionHeader)
-#  write_compiler_detection_header(
-#    FILE cpp_features.h
-#    PREFIX PN
-#    COMPILERS GNU Clang MSVC SunPro
-#    FEATURES ${CMAKE_CXX_COMPILE_FEATURES}
-#    ALLOW_UNKNOWN_COMPILERS)
-  if (MSVC)  # Compiler feature checks only needed for Visual Studio in this case
-    include(cpp.cmake)
-  endif()
-else ()
-  if (BUILD_CPP_03)
-    set(CXX_STANDARD "-std=c++98")
-  else ()
-    include(CheckCXXCompilerFlag)
-    # These flags work with GCC/Clang/SunPro compilers
-    check_cxx_compiler_flag("-std=c++11" ACCEPTS_CXX11)
-    check_cxx_compiler_flag("-std=c++0x" ACCEPTS_CXX0X)
-    if (ACCEPTS_CXX11)
-      set(CXX_STANDARD "-std=c++11")
-    elseif(ACCEPTS_CXX0X)
-      set(CXX_STANDARD "-std=c++0x")
-      include(cpp.cmake) # Compiler checks needed for C++0x as not all C++11 may be supported
-    else()
-      include(cpp.cmake) # Compiler checks needed as we have no idea whats going on here!
-    endif()
-  endif()
-endif ()
+# NOTE: cpp.cmake is included at the top level so the examples can be built with
+# the same version C++ compiler as the library.
 
 include_directories(
   "${CMAKE_SOURCE_DIR}/proton-c/include"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6b2e7dcd/proton-c/bindings/cpp/cpp.cmake
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/cpp.cmake b/proton-c/bindings/cpp/cpp.cmake
index e49ec9a..2c8f296 100644
--- a/proton-c/bindings/cpp/cpp.cmake
+++ b/proton-c/bindings/cpp/cpp.cmake
@@ -17,35 +17,99 @@
 # under the License.
 #
 
+include(CheckCXXCompilerFlag)
+include(CheckCXXSourceCompiles)
+
 # Check C++ capabilities.
 
-include(CheckCXXSourceCompiles)
+# NOTE: The checks here are for the C++ compiler used to build the proton *library*
+#
+# A developer using the library will get the checks done by internal/config.hpp
+# which may not be the same, for example you can use a c++03 compiler to build
+# applications that are linked with a library built with c++11.
+
+
+set (BUILD_CPP_03 OFF CACHE BOOL "Compile the C++ binding as C++03 even when C++11 is available")
+
+# Manual feature checks for older CMake versions
+
+macro(cxx_compile_checks)
+
+  macro (cxx_test prog name)
+    check_cxx_source_compiles("${prog}" HAS_${name})
+    if (HAS_${name})
+      add_definitions(-DPN_CPP_HAS_${name}=1)
+    endif()
+  endmacro()
 
-macro (cxx_test prog name)
-  check_cxx_source_compiles("${prog}" HAS_${name})
-  if (HAS_${name})
-    add_definitions(-DPN_CPP_HAS_${name}=1)
+  check_cxx_source_compiles("#if defined(__cplusplus) && __cplusplus >= 201103\nint main(int, char**) { return 0; }\n#endif" CPP11)
+
+  # Don't need to check individual flags if compiler claims to be C++11 or later as they will be set automatically
+  if (NOT CPP11)
+    set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD} ${CXX_WARNING_FLAGS}")
+    cxx_test("long long ll; int main(int, char**) { return 0; }" LONG_LONG_TYPE)
+    cxx_test("int* x = nullptr; int main(int, char**) { return 0; }" NULLPTR)
+    cxx_test("#include <string>\nvoid blah(std::string&&) {} int main(int, char**) { blah(\"hello\"); return 0; }" RVALUE_REFERENCES)
+    cxx_test("class x {explicit operator int(); }; int main(int, char**) { return 0; }" EXPLICIT_CONVERSIONS)
+    cxx_test("class x {x()=default; }; int main(int, char**) { return 0; }" DEFAULTED_FUNCTIONS)
+    cxx_test("class x {x(x&&)=default; }; int main(int, char**) { return 0; }" DEFAULTED_MOVE_INITIALIZERS)
+    cxx_test("class x {x()=delete; }; int main(int, char**) { return 0; }" DELETED_FUNCTIONS)
+    cxx_test("struct x {x() {}}; int main(int, char**) { static thread_local x foo; return 0; }" THREAD_LOCAL)
+    cxx_test("int main(int, char**) { int a=[](){return 42;}(); return a; }" LAMBDAS)
+    cxx_test("template <class... X> void x(X... a) {} int main(int, char**) { x(1); x(43, \"\"); return 0; }" VARIADIC_TEMPLATES)
+
+    cxx_test("#include <random>\nint main(int, char**) { return 0; }" HEADER_RANDOM)
+    cxx_test("#include <memory>\nstd::unique_ptr<int> u; int main(int, char**) { return 0; }" STD_UNIQUE_PTR)
+    cxx_test("#include <thread>\nstd::thread t; int main(int, char**) { return 0; }" STD_THREAD)
+    cxx_test("#include <mutex>\nstd::mutex m; int main(int, char**) { return 0; }" STD_MUTEX)
+    cxx_test("#include <atomic>\nstd::atomic<int> a; int main(int, char**) { return 0; }" STD_ATOMIC)
   endif()
 endmacro()
 
-check_cxx_source_compiles("#if defined(__cplusplus) && __cplusplus >= 201103\nint main(int, char**) { return 0; }\n#endif" CPP11)
-# Don't need to check individual flags if compiler claims to be C++11 or later as they will be set automatically
-if (NOT CPP11)
-  set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD} ${CXX_WARNING_FLAGS}")
-  cxx_test("long long ll; int main(int, char**) { return 0; }" LONG_LONG_TYPE)
-  cxx_test("int* x = nullptr; int main(int, char**) { return 0; }" NULLPTR)
-  cxx_test("#include <string>\nvoid blah(std::string&&) {} int main(int, char**) { blah(\"hello\"); return 0; }" RVALUE_REFERENCES)
-  cxx_test("class x {explicit operator int(); }; int main(int, char**) { return 0; }" EXPLICIT_CONVERSIONS)
-  cxx_test("class x {x()=default; }; int main(int, char**) { return 0; }" DEFAULTED_FUNCTIONS)
-  cxx_test("class x {x(x&&)=default; }; int main(int, char**) { return 0; }" DEFAULTED_MOVE_INITIALIZERS)
-  cxx_test("class x {x()=delete; }; int main(int, char**) { return 0; }" DELETED_FUNCTIONS)
-  cxx_test("struct x {x() {}}; int main(int, char**) { static thread_local x foo; return 0; }" THREAD_LOCAL)
-  cxx_test("int main(int, char**) { int a=[](){return 42;}(); return a; }" LAMBDAS)
-  cxx_test("template <class... X> void x(X... a) {} int main(int, char**) { x(1); x(43, \"\"); return 0; }" VARIADIC_TEMPLATES)
-
-  cxx_test("#include <random>\nint main(int, char**) { return 0; }" HEADER_RANDOM)
-  cxx_test("#include <memory>\nstd::unique_ptr<int> u; int main(int, char**) { return 0; }" STD_UNIQUE_PTR)
-  cxx_test("#include <thread>\nstd::thread t; int main(int, char**) { return 0; }" STD_THREAD)
-  cxx_test("#include <mutex>\nstd::mutex m; int main(int, char**) { return 0; }" STD_MUTEX)
-  cxx_test("#include <atomic>\nstd::atomic<int> a; int main(int, char**) { return 0; }" STD_ATOMIC)
-endif()
+
+# Check for cmake C++ feature support (version 3.1 or later)
+if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
+  if (BUILD_CPP_03)
+    set(STD 98)
+  else ()
+    set(STD 11)
+    list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_11 INDEX)
+    if (NOT ${INDEX} EQUAL -1)
+      set(HAS_CPP11 True)
+    endif()
+  endif ()
+
+  # Note: this will "degrade" to the highest available standard <= ${STD}
+  set(CMAKE_CXX_STANDARD ${STD})
+  set(CMAKE_CXX_EXTENSIONS OFF)
+  # AStitcher 20170804: Disabled for present - work on this when Windows C++ works
+  #  cmake_minimum_required(VERSION 3.1)
+  #  include(WriteCompilerDetectionHeader)
+  #  write_compiler_detection_header(
+  #    FILE cpp_features.h
+  #    PREFIX PN
+  #    COMPILERS GNU Clang MSVC SunPro
+  #    FEATURES ${CMAKE_CXX_COMPILE_FEATURES}
+  #    ALLOW_UNKNOWN_COMPILERS)
+  if (MSVC)  # Compiler feature checks only needed for Visual Studio in this case
+    cxx_compile_checks()
+  endif()
+
+else (DEFINED CMAKE_CXX_COMPILE_FEATURES)
+
+  if (BUILD_CPP_03)
+    set(CXX_STANDARD "-std=c++98")
+  else ()
+    # These flags work with GCC/Clang/SunPro compilers
+    check_cxx_compiler_flag("-std=c++11" ACCEPTS_CXX11)
+    check_cxx_compiler_flag("-std=c++0x" ACCEPTS_CXX0X)
+    if (ACCEPTS_CXX11)
+      set(CXX_STANDARD "-std=c++11")
+    elseif(ACCEPTS_CXX0X)
+      set(CXX_STANDARD "-std=c++0x")
+      cxx_compile_checks() # Compiler checks needed for C++0x as not all C++11 may be supported
+    else()
+      cxx_compile_checks() # Compiler checks needed as we have no idea whats going on here!
+    endif()
+  endif()
+endif ()


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org