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}")