PROTON-2208/PROTON-2080: More C99 changes
- Some changes now that all supported compilers support enough C++11
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd63da1..86ef865 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,10 +49,37 @@
 set (PN_C_LIBRARY_DIR "${CMAKE_BINARY_DIR}/c")
 set (PN_C_SOURCE_DIR "${CMAKE_BINARY_DIR}/c/src")
 
+## C
+if (DEFINED CMAKE_C_COMPILE_FEATURES)
+  set(CMAKE_C_STANDARD 99)
+  set(CMAKE_C_EXTENSIONS OFF)
+  set(CMAKE_C_STANDARD_REQUIRED ON)
+else()
+  set (C_STANDARD_GCC -std=c99)
+endif()
+
 ## C++
 check_language (CXX)
 if (CMAKE_CXX_COMPILER)
   enable_language(CXX)
+
+  # This effectively checks for cmake version 3.1 or later
+  if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
+    set(CMAKE_CXX_STANDARD 11)
+    set(CMAKE_CXX_EXTENSIONS OFF)
+    # Every supported version of Visual Studio (2015 onwards) supports enough C++11 that we
+    # no longer need to run the individual feature tests
+  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")
+    endif()
+  endif ()
 endif()
 
 # Build static C and C++ libraries in addition to shared libraries.
@@ -131,11 +158,9 @@
     set (WERROR "-Werror")
   endif (ENABLE_WARNING_ERROR)
   set (COMPILE_WARNING_FLAGS "${WERROR} -Wall -pedantic-errors")
-  # C++ allow "%z" format specifier and variadic macros
-  set (CXX_WARNING_FLAGS "${COMPILE_WARNING_FLAGS} -Wno-format -Wno-variadic-macros")
-  set (COMPILE_WARNING_FLAGS "${COMPILE_WARNING_FLAGS} -Wstrict-prototypes -Wc++-compat -Wvla -Wsign-compare -Wwrite-strings")
-  set (COMPILE_LANGUAGE_FLAGS "-std=c99")
-  set (COMPILE_PLATFORM_FLAGS "-std=gnu99")
+  set (CXX_WARNING_FLAGS "${COMPILE_WARNING_FLAGS}")
+  set (COMPILE_WARNING_FLAGS "${COMPILE_WARNING_FLAGS} -Wstrict-prototypes -Wvla -Wsign-compare -Wwrite-strings")
+  set (COMPILE_LANGUAGE_FLAGS ${C_STANDARD_GCC})
 
   if (ENABLE_UNDEFINED_ERROR)
     set (CATCH_UNDEFINED "-Wl,--no-undefined")
@@ -159,7 +184,7 @@
 
 if (CMAKE_C_COMPILER_ID MATCHES "Clang")
   set (COMPILE_WARNING_FLAGS  "-Wall -pedantic")
-  set (COMPILE_LANGUAGE_FLAGS "-std=c99")
+  set (COMPILE_LANGUAGE_FLAGS ${C_STANDARD_GCC})
   if (ENABLE_WARNING_ERROR)
     set (COMPILE_WARNING_FLAGS "-Werror ${COMPILE_WARNING_FLAGS}")
   endif (ENABLE_WARNING_ERROR)
diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt
index 797f25d..144cdaf 100644
--- a/c/CMakeLists.txt
+++ b/c/CMakeLists.txt
@@ -351,7 +351,7 @@
     set (PROACTOR_OK iocp)
     set (qpid-proton-proactor src/proactor/win_iocp.cpp ${qpid-proton-proactor-common})
     set_source_files_properties (${qpid-proton-proactor} PROPERTIES
-      COMPILE_FLAGS "${COMPILE_WARNING_FLAGS} ${COMPILE_PLATFORM_FLAGS} ${LTO}"
+      COMPILE_FLAGS "${COMPILE_WARNING_FLAGS} ${COMPILE_LANGUAGE_FLAGS} ${LTO}"
       COMPILE_DEFINITIONS "${PLATFORM_DEFINITIONS}"
       )
   endif(WIN32 AND NOT CYGWIN)
@@ -389,7 +389,7 @@
   ${qpid-proton-platform}
   ${qpid-proton-platform-io}
   PROPERTIES
-  COMPILE_FLAGS "${COMPILE_WARNING_FLAGS} ${COMPILE_PLATFORM_FLAGS} ${LTO}"
+  COMPILE_FLAGS "${COMPILE_WARNING_FLAGS} ${COMPILE_LANGUAGE_FLAGS} ${LTO}"
   COMPILE_DEFINITIONS "${PLATFORM_DEFINITIONS}"
   )
 
@@ -413,6 +413,16 @@
 target_compile_options    (qpid-proton-core-objects PRIVATE $<TARGET_PROPERTY:qpid-proton-core,COMPILE_OPTIONS>)
 target_include_directories(qpid-proton-core-objects PRIVATE $<TARGET_PROPERTY:qpid-proton-core,INCLUDE_DIRECTORIES>)
 
+add_library (qpid-proton-platform-io-objects OBJECT ${qpid-proton-platform-io})
+set_target_properties(qpid-proton-platform-io-objects PROPERTIES
+  POSITION_INDEPENDENT_CODE ON
+  C_EXTENSIONS ON)
+target_compile_definitions(qpid-proton-platform-io-objects PRIVATE qpid_proton_core_EXPORTS)
+
+target_compile_definitions(qpid-proton-platform-io-objects PRIVATE $<TARGET_PROPERTY:qpid-proton,COMPILE_DEFINITIONS>)
+target_compile_options    (qpid-proton-platform-io-objects PRIVATE $<TARGET_PROPERTY:qpid-proton,COMPILE_OPTIONS>)
+target_include_directories(qpid-proton-platform-io-objects PRIVATE $<TARGET_PROPERTY:qpid-proton,INCLUDE_DIRECTORIES>)
+
 add_library (qpid-proton-core SHARED $<TARGET_OBJECTS:qpid-proton-core-objects>)
 target_link_libraries (qpid-proton-core ${SSL_LIB} ${SASL_LIB} ${TIME_LIB} ${PLATFORM_LIBS})
 set_target_properties (qpid-proton-core
@@ -431,11 +441,10 @@
   ${qpid-proton-proactor}
   # Proton Reactor/Messenger
   ${qpid-proton-extra}
-  ${qpid-proton-platform-io}
   ${qpid-proton-include-extra}
 )
 
-add_library (qpid-proton SHARED $<TARGET_OBJECTS:qpid-proton-core-objects> ${qpid-proton-noncore-src})
+add_library (qpid-proton SHARED $<TARGET_OBJECTS:qpid-proton-core-objects> $<TARGET_OBJECTS:qpid-proton-platform-io-objects> ${qpid-proton-noncore-src})
 target_link_libraries (qpid-proton LINK_PRIVATE ${SSL_LIB} ${SASL_LIB} ${TIME_LIB} ${PLATFORM_LIBS} ${PROACTOR_LIBS})
 set_target_properties (qpid-proton
   PROPERTIES
@@ -445,7 +454,7 @@
 )
 
 if (BUILD_STATIC_LIBS)
-  add_library(qpid-proton-static STATIC ${qpid-proton-core-src} ${qpid-proton-noncore-src})
+  add_library(qpid-proton-static STATIC ${qpid-proton-core-src} ${qpid-proton-platform-io} ${qpid-proton-noncore-src})
 endif(BUILD_STATIC_LIBS)
 
 if (qpid-proton-proactor)
diff --git a/c/tests/CMakeLists.txt b/c/tests/CMakeLists.txt
index 0f8521c..787bce9 100644
--- a/c/tests/CMakeLists.txt
+++ b/c/tests/CMakeLists.txt
@@ -44,7 +44,7 @@
   macro(add_c_test exe)
     add_executable(${exe} $<TARGET_OBJECTS:test_main> pn_test.cpp ${ARGN})
     set_target_properties(${exe} PROPERTIES
-      COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_WARNING_FLAGS}")
+      COMPILE_FLAGS "${CXX_STANDARD} ${CMAKE_CXX_FLAGS} ${CXX_WARNING_FLAGS}")
     pn_add_test(
       EXECUTABLE
       NAME ${exe}
diff --git a/c/tests/fuzz/CMakeLists.txt b/c/tests/fuzz/CMakeLists.txt
index 163a9db..4997e7e 100644
--- a/c/tests/fuzz/CMakeLists.txt
+++ b/c/tests/fuzz/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-add_definitions(${COMPILE_WARNING_FLAGS} ${COMPILE_PLATFORM_FLAGS})
+add_definitions(${COMPILE_WARNING_FLAGS})
 
 option(FUZZ_REGRESSION_TESTS "Run fuzz tests with regression test driver" ON)
 option(FUZZ_LONG_TESTS "Run fuzz tests that take a long time" OFF)
diff --git a/c/tools/CMakeLists.txt b/c/tools/CMakeLists.txt
index d58e4b4..3a60df2 100644
--- a/c/tools/CMakeLists.txt
+++ b/c/tools/CMakeLists.txt
@@ -17,8 +17,6 @@
 # under the License.
 #
 
-include(CheckIncludeFiles)
-
 include_directories (${PN_C_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include)
 
 add_executable(msgr-recv msgr-recv.c msgr-common.c)
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 59b6a01..cdfb415 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -18,6 +18,7 @@
 #
 cmake_minimum_required(VERSION 2.8.12)
 
+include(CMakeDependentOption)
 enable_language(CXX)
 
 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
@@ -29,7 +30,8 @@
 
 # Check for JSON-CPP support for connection configuration
 find_package(JsonCpp)
-option(ENABLE_JSONCPP "Use jsoncpp parser for connection configuration" ${JsonCpp_FOUND})
+cmake_dependent_option(ENABLE_JSONCPP "Use jsoncpp parser for connection configuration" ${JsonCpp_FOUND}
+  "NOT BUILD_CPP_03" OFF)
 if (ENABLE_JSONCPP)
   include_directories(${JsonCpp_INCLUDE_DIRS})
   set(CONNECT_CONFIG_SRC src/connect_config.cpp)
@@ -41,40 +43,24 @@
 # This effectively checks for cmake version 3.1 or later
 if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
   if (BUILD_CPP_03)
-    set(STD 98)
+    set(CMAKE_CXX_STANDARD 98)
   else ()
-    set(STD 11)
-    list(APPEND PLATFORM_LIBS Threads::Threads)
-  endif ()
-  set(CMAKE_CXX_STANDARD ${STD})
-  set(CMAKE_CXX_EXTENSIONS OFF)
-  if (MSVC)  # Compiler feature checks only needed for Visual Studio in this case
-    include(cpp.cmake)
-  elseif (STD EQUAL 11)
     set(CPP_DEFINITIONS "HAS_CPP11")
-  endif()
+  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")
       set(CPP_DEFINITIONS "HAS_CPP11")
-      list(APPEND PLATFORM_LIBS Threads::Threads)
-    elseif(ACCEPTS_CXX0X)
-      set(CXX_STANDARD "-std=c++0x")
-      list(APPEND PLATFORM_LIBS Threads::Threads)
-      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!
+      include(cpp.cmake) # Compiler checks needed as not all C++11 may be supported
     endif()
   endif()
 endif ()
 
+list(APPEND PLATFORM_LIBS Threads::Threads)
+
 # Construct #define lines to insert in config_presets.hpp
 foreach(d ${CPP_DEFINITIONS})
   set(presets "${presets}#define PN_CPP_LIB_${d} 1\n")
@@ -167,7 +153,7 @@
 set_source_files_properties (
   ${qpid-proton-cpp-source}
   PROPERTIES
-  COMPILE_FLAGS "${LTO}"
+  COMPILE_OPTIONS "${LTO}"
   )
 
 if (MSVC)
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 710ac05..bdd2b4c 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -41,7 +41,7 @@
 )
 
 swig_add_library(cproton LANGUAGE python SOURCES cproton.i)
-swig_link_libraries(cproton ${BINDING_DEPS} ${PYTHON_LIBRARIES})
+swig_link_libraries(cproton ${BINDING_DEPS} ${PYTHON_LIBRARIES} -lm)
 set_target_properties(${SWIG_MODULE_cproton_REAL_NAME}
     PROPERTIES
     LINK_FLAGS "${CATCH_UNDEFINED}")