diff --git a/.travis.yml b/.travis.yml index 60d4617..c581186 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,17 @@ language: cpp compiler: - gcc - clang +env: + - SDL2PP_CSTD=c++11 + - SDL2PP_CSTD=c++1y before_install: - sudo add-apt-repository --yes ppa:zoogie/sdl2-snapshots - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test - sudo apt-get update -qq - sudo apt-get install -qq cmake libsdl2-dev libsdl2-image-dev g++-4.8 - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi -script: cmake . -DSDL2PP_ENABLE_GUI_TEST=OFF -DCMAKE_INSTALL_PREFIX=`pwd`/_prefix -DSDL2PP_WITH_WERROR=YES && make && make test && make install +script: + - cmake . -DSDL2PP_ENABLE_GUI_TEST=OFF -DCMAKE_INSTALL_PREFIX=`pwd`/_prefix -DSDL2PP_WITH_WERROR=YES -DSDL2PP_CSTD=$SDL2PP_CSTD + - make + - make test + - make install diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d3fe76..89157d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ SET(SDL2PP_VERSION "${SDL2PP_MAJOR_VERSION}.${SDL2PP_MINOR_VERSION}.${SDL2PP_PAT OPTION(SDL2PP_WITH_2_0_4 "Enable new functions available only in SDL2 2.0.4+" OFF) OPTION(SDL2PP_WITH_WERROR "Make warnings fatal" OFF) +SET(SDL2PP_CSTD "c++11" CACHE STRING "Used c++ standard") + IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) OPTION(SDL2PP_WITH_IMAGE "Enable SDL2_image support" ON) ELSE(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) @@ -39,7 +41,7 @@ IF(MSVC) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3") SET(WERROR_FLAG "/WX") ELSE(MSVC) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -pedantic") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${SDL2PP_CSTD} -Wall -Wextra -pedantic") SET(WERROR_FLAG "-Werror") ENDIF(MSVC) @@ -52,6 +54,19 @@ IF(SDL2PP_WITH_WERROR) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WERROR_FLAG}") ENDIF(SDL2PP_WITH_WERROR) +# platform checks +INCLUDE(CheckCompile) +CHECK_COMPILE( + SDL2PP_WITH_EXPERIMENTAL_OPTIONAL + ${PROJECT_SOURCE_DIR}/cmake/std_experimental_optional_test.cc + "Checking for experimental/optional header" +) +CHECK_COMPILE( + SDL2PP_WITH_DEPRECATED + ${PROJECT_SOURCE_DIR}/cmake/attribute_deprecated_test.cc + "Checking for [[deprecated]] attribute" +) + # config.h CONFIGURE_FILE( SDL2pp/Config.hh.in @@ -82,6 +97,7 @@ SET(LIBRARY_HEADERS SDL2pp/AudioSpec.hh SDL2pp/ContainerRWops.hh SDL2pp/Exception.hh + SDL2pp/Optional.hh SDL2pp/Point.hh SDL2pp/RWops.hh SDL2pp/Rect.hh diff --git a/SDL2pp/Config.hh.in b/SDL2pp/Config.hh.in index ac60ca8..a9ce0bc 100644 --- a/SDL2pp/Config.hh.in +++ b/SDL2pp/Config.hh.in @@ -30,5 +30,13 @@ #cmakedefine SDL2PP_WITH_IMAGE #cmakedefine SDL2PP_WITH_2_0_4 +#cmakedefine SDL2PP_WITH_EXPERIMENTAL_OPTIONAL +#cmakedefine SDL2PP_WITH_DEPRECATED + +#if defined(SDL2PP_WITH_DEPRECATED) +# define SDL2PP_DEPRECATED [[deprecated]] +#else +# define SDL2PP_DEPRECATED +#endif #endif diff --git a/SDL2pp/Optional.hh b/SDL2pp/Optional.hh index 8641d1b..a87c252 100644 --- a/SDL2pp/Optional.hh +++ b/SDL2pp/Optional.hh @@ -22,7 +22,26 @@ #ifndef SDL2PP_OPTIONAL_HH #define SDL2PP_OPTIONAL_HH -#include +#include + +#if defined(SDL2PP_WITH_EXPERIMENTAL_OPTIONAL) + +# include + +namespace SDL2pp { + +template +using Optional = std::experimental::optional; + +using BadOptionalAccess = std::experimental::bad_optional_access; + +constexpr std::experimental::nullopt_t NullOpt = std::experimental::nullopt; + +} + +#else + +# include namespace SDL2pp { @@ -36,3 +55,5 @@ constexpr sdl2pp_libcpp_optional::nullopt_t NullOpt = sdl2pp_libcpp_optional::nu } #endif + +#endif diff --git a/SDL2pp/libcpp_optional.hh b/SDL2pp/external/libcpp_optional.hh similarity index 100% rename from SDL2pp/libcpp_optional.hh rename to SDL2pp/external/libcpp_optional.hh diff --git a/cmake/CheckCompile.cmake b/cmake/CheckCompile.cmake new file mode 100644 index 0000000..33e72cb --- /dev/null +++ b/cmake/CheckCompile.cmake @@ -0,0 +1,11 @@ +MACRO(CHECK_COMPILE RESULT_VAR SOURCE_FILE DESCRIPTION) + SET(SAVED_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WERROR_FLAG}") + TRY_COMPILE(${RESULT_VAR} ${CMAKE_BINARY_DIR} ${SOURCE_FILE}) + IF(${RESULT_VAR}) + MESSAGE(STATUS "${DESCRIPTION}: yes") + ELSE(${RESULT_VAR}) + MESSAGE(STATUS "${DESCRIPTION}: no") + ENDIF(${RESULT_VAR}) + SET(CMAKE_CXX_FLAGS "${SAVED_CXX_FLAGS}") +ENDMACRO(CHECK_COMPILE) diff --git a/cmake/attribute_deprecated_test.cc b/cmake/attribute_deprecated_test.cc new file mode 100644 index 0000000..fe6b4af --- /dev/null +++ b/cmake/attribute_deprecated_test.cc @@ -0,0 +1,7 @@ +[[deprecated]] +void f() { +} + +int main() { + return 0; +} diff --git a/cmake/std_experimental_optional_test.cc b/cmake/std_experimental_optional_test.cc new file mode 100644 index 0000000..8d77d5d --- /dev/null +++ b/cmake/std_experimental_optional_test.cc @@ -0,0 +1,8 @@ +#include +#include + +int main() { + std::experimental::optional o; + + return !o; +}