From 516a89f936a4e00e86866cfed419564a85740e19 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:00:42 +0200 Subject: [PATCH 1/9] Improve checks for C++11 compiler flags --- CMakeLists.txt | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3c3475..05dbef1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,34 @@ cmake_minimum_required(VERSION 2.8) enable_testing() project(toml11) -include_directories(${PROJECT_SOURCE_DIR}) -add_definitions(-std=c++11) +include(CheckCXXCompilerFlag) +if("${CMAKE_VERSION}" VERSION_GREATER 3.1) + set(CMAKE_CXX_STANDARD 11) + set(CXX_STANDARD_REQUIRED ON) +else() + # Manually check for C++11 compiler flag. + CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) + CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) + CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_GNU11) + CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" COMPILER_SUPPORTS_GNU0X) + if(COMPILER_SUPPORTS_CXX11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + elseif(COMPILER_SUPPORTS_CXXOX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + elseif(COMPILER_SUPPORTS_GNU11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") + elseif(COMPILER_SUPPORTS_GNU0X) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") + else() + if(MSVC) + if(MSVC_VERSION LESS 1900) + message(SEND_ERROR "MSVC < 14.0 is not supported. Please update your compiler or use mingw") + endif() + else() + message(SEND_ERROR "The ${CMAKE_CXX_COMPILER} compiler lacks C++11 support. Use another compiler.") + endif() + endif() +endif() +include_directories(${PROJECT_SOURCE_DIR}) add_subdirectory(tests) From 2f2a75af4a91ee246bb99ae6350a5a166b71d2af Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:03:01 +0200 Subject: [PATCH 2/9] Only set flags if the compiler support them --- tests/CMakeLists.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d977fd2..4decca0 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,7 +12,16 @@ set(TEST_NAMES test_parse_file ) -add_definitions("-Wall -Wpedantic") +CHECK_CXX_COMPILER_FLAG("-Wall" COMPILER_SUPPORTS_WALL) +CHECK_CXX_COMPILER_FLAG("-Wpedantic" COMPILER_SUPPORTS_WPEDANTIC) + +if(COMPILER_SUPPORTS_WALL) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +endif() + +if(COMPILER_SUPPORTS_WPEDANTIC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic") +endif() set(test_library_dependencies) find_library(BOOST_UNITTEST_FRAMEWORK_LIBRARY boost_unit_test_framework) From 28a00c76d0817e378da0947b10d1afce3d98cdc6 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:17:16 +0200 Subject: [PATCH 3/9] Use find_package to find Boost This allow to have an error at cmake configuration time --- tests/CMakeLists.txt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4decca0..37ed82d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -23,16 +23,13 @@ if(COMPILER_SUPPORTS_WPEDANTIC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic") endif() -set(test_library_dependencies) -find_library(BOOST_UNITTEST_FRAMEWORK_LIBRARY boost_unit_test_framework) -if (BOOST_UNITTEST_FRAMEWORK_LIBRARY) - add_definitions(-DBOOST_TEST_DYN_LINK) - add_definitions(-DUNITTEST_FRAMEWORK_LIBRARY_EXIST) - set(test_library_dependencies boost_unit_test_framework) -endif() +find_package(Boost COMPONENTS unit_test_framework REQUIRED) +add_definitions(-DBOOST_TEST_DYN_LINK) +add_definitions(-DUNITTEST_FRAMEWORK_LIBRARY_EXIST) foreach(TEST_NAME ${TEST_NAMES}) add_executable(${TEST_NAME} ${TEST_NAME}.cpp) - target_link_libraries(${TEST_NAME} ${test_library_dependencies}) + target_link_libraries(${TEST_NAME} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) + target_include_directories(${TEST_NAME} PRIVATE ${Boost_INCLUDE_DIRS}) add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/build) endforeach(TEST_NAME) From fdd2a7a640d4083a2f1814ea9205807d0d2eed54 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:18:43 +0200 Subject: [PATCH 4/9] Do not assume the project is built in a `build` folder --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 37ed82d..25322d4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -31,5 +31,5 @@ foreach(TEST_NAME ${TEST_NAMES}) add_executable(${TEST_NAME} ${TEST_NAME}.cpp) target_link_libraries(${TEST_NAME} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) target_include_directories(${TEST_NAME} PRIVATE ${Boost_INCLUDE_DIRS}) - add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/build) + add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}) endforeach(TEST_NAME) From 552de18501d5b4869d63e982103d02cf716ee5e8 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 10:52:33 +0200 Subject: [PATCH 5/9] Add Appveyor CI --- appveyor.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..4804623 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,25 @@ +version: "{build}" +os: Visual Studio 2015 + +environment: + matrix: + - generator: Visual Studio 14 2015 Win64 + - generator: Visual Studio 14 2015 + +configuration: + - Release + - Debug + +clone_depth: 10 +clone_folder: c:\toml11 + +build_script: + - cd C:\toml11 + - mkdir build + - cd build + - git clone https://github.com/toml-lang/toml.git + - cmake -G"%generator%" -DBOOST_ROOT=C:/Libraries/boost_1_63_0 .. + - cmake --build . --config "%configuration%" + +test_script: + - ctest --build-config "%configuration%" --timeout 300 --output-on-failure From 612119fa1ef941ae4dd83ae7faef86d17c814d32 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:30:35 +0200 Subject: [PATCH 6/9] Do not use the macro shortcut for not It is not required by the standard --- tests/test_utility.cpp | 6 +++--- toml/acceptor.hpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_utility.cpp b/tests/test_utility.cpp index a36ff38..1512e4f 100644 --- a/tests/test_utility.cpp +++ b/tests/test_utility.cpp @@ -15,7 +15,7 @@ BOOST_AUTO_TEST_CASE(test_resize) typedef std::vector resizable_type; typedef std::array non_resizable_type; BOOST_CHECK(toml::detail::has_resize_method::value); - BOOST_CHECK(not toml::detail::has_resize_method::value); + BOOST_CHECK(!toml::detail::has_resize_method::value); } { @@ -29,7 +29,7 @@ BOOST_AUTO_TEST_CASE(test_resize) { thrown = true; } - BOOST_CHECK(not thrown); + BOOST_CHECK(!thrown); BOOST_CHECK_EQUAL(v.size(), 10); } @@ -44,7 +44,7 @@ BOOST_AUTO_TEST_CASE(test_resize) { thrown = true; } - BOOST_CHECK(not thrown); + BOOST_CHECK(!thrown); BOOST_CHECK_EQUAL(a.size(), 15); } diff --git a/toml/acceptor.hpp b/toml/acceptor.hpp index 42a9816..5033e40 100644 --- a/toml/acceptor.hpp +++ b/toml/acceptor.hpp @@ -109,7 +109,7 @@ struct is_chain_of_impl static Iterator invoke(Iterator iter, Iterator rollback) { const Iterator tmp = headT::invoke(iter); - return (tmp == iter && not ignorable) ? rollback : + return (tmp == iter && !ignorable) ? rollback : is_chain_of_impl::invoke(tmp, rollback); } }; From fe1b96a2592fae41afc35f4728713162a316697a Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:30:58 +0200 Subject: [PATCH 7/9] MSVC 2015 can compile C++11 code, but does not define __cplusplus --- toml.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toml.hpp b/toml.hpp index bfca738..cfae56b 100644 --- a/toml.hpp +++ b/toml.hpp @@ -29,7 +29,7 @@ # error "__cplusplus is not defined" #endif -#if __cplusplus < 201103L +#if __cplusplus < 201103L && _MSC_VER < 1900 # error "toml11 requires C++11 or later." #endif From 6b1e8be121b7386a59935a20cf4ee9be2b66c813 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 11:38:46 +0200 Subject: [PATCH 8/9] Disable a few MSVC warnings --- tests/CMakeLists.txt | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 25322d4..3ed82c7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -23,6 +23,44 @@ if(COMPILER_SUPPORTS_WPEDANTIC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic") endif() +# Disable some MSVC warnings +if(MSVC) + # conversion from 'double' to 'unsigned int', possible loss of data + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244") + # conversion from 'int' to 'unsigned int', signed/unsigned mismatch + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4365") + # layout of class may have changed from a previous version of the compiler + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4371") + # enumerator in switch of enum is not explicitly handled by a case label + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4061") + # unreferenced inline function has been removed + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4514") + # constructor is not implicitly called + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4582") + # destructor is not implicitly called + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4583") + # pragma warning: there is no warning number + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4619") + # default constructor was implicitly defined as deleted + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4623") + # copy constructor was implicitly defined as deleted + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4625") + # assignment operator was implicitly defined as deleted + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4626") + # move assignment operator was implicitly defined as deleted + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4627") + # is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4668") + # function not inlined + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4710") + # function selected for automatic inlining + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4711") + # bytes padding added after data member + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4820") + # pragma warning(pop): likely mismatch, popping warning state pushed in different file + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd5031") +endif() + find_package(Boost COMPONENTS unit_test_framework REQUIRED) add_definitions(-DBOOST_TEST_DYN_LINK) add_definitions(-DUNITTEST_FRAMEWORK_LIBRARY_EXIST) From da15736a04d8075eda02a10ac4eb5ff118564afe Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Mon, 15 May 2017 14:00:51 +0200 Subject: [PATCH 9/9] Set the tests PATH to find Boost DLL --- tests/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3ed82c7..2578947 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -70,4 +70,12 @@ foreach(TEST_NAME ${TEST_NAMES}) target_link_libraries(${TEST_NAME} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) target_include_directories(${TEST_NAME} PRIVATE ${Boost_INCLUDE_DIRS}) add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}) + + # Set the PATH to be able to find Boost DLL + if(WIN32) + STRING(REPLACE ";" "\\;" PATH_STRING "$ENV{PATH}") + set_tests_properties(${TEST_NAME} + PROPERTIES ENVIRONMENT "PATH=${PATH_STRING}\;${Boost_LIBRARY_DIRS}" + ) + endif() endforeach(TEST_NAME)