PROJECT(libSDL2pp) # meta CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) SET(SDL2PP_MAJOR_VERSION 0) SET(SDL2PP_MINOR_VERSION 11) SET(SDL2PP_PATCH_VERSION 0) SET(SDL2PP_VERSION "${SDL2PP_MAJOR_VERSION}.${SDL2PP_MINOR_VERSION}.${SDL2PP_PATCH_VERSION}") # there are functions present on wiki, but not yet in stable SDL2 releases; # we hide these under following options 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_CXXSTD "c++11" CACHE STRING "Used c++ standard") IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) OPTION(SDL2PP_WITH_IMAGE "Enable SDL2_image support" ON) OPTION(SDL2PP_WITH_TTF "Enable SDL2_ttf support" ON) OPTION(SDL2PP_WITH_MIXER "Enable SDL2_mixer support" ON) ELSE(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # please set SDL2PP_WITH_IMAGE, SDL2PP_WITH_TTF, SDL2PP_WITH_MIXER in parent project as needed ENDIF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # depends FIND_PACKAGE(SDL2 REQUIRED) SET(SDL2_ALL_INCLUDE_DIRS ${SDL2_INCLUDE_DIR}) SET(SDL2_ALL_LIBRARIES ${SDL2_LIBRARY}) IF(SDL2PP_WITH_IMAGE) FIND_PACKAGE(SDL2_image REQUIRED) SET(SDL2_ALL_INCLUDE_DIRS ${SDL2_ALL_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIR}) SET(SDL2_ALL_LIBRARIES ${SDL2_ALL_LIBRARIES} ${SDL2_IMAGE_LIBRARY}) ELSE(SDL2PP_WITH_IMAGE) MESSAGE(STATUS "SDL2_image support disabled") ENDIF(SDL2PP_WITH_IMAGE) IF(SDL2PP_WITH_TTF) FIND_PACKAGE(SDL2_ttf REQUIRED) SET(SDL2_ALL_INCLUDE_DIRS ${SDL2_ALL_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIR}) SET(SDL2_ALL_LIBRARIES ${SDL2_ALL_LIBRARIES} ${SDL2_TTF_LIBRARY}) ELSE(SDL2PP_WITH_TTF) MESSAGE(STATUS "SDL2_ttf support disabled") ENDIF(SDL2PP_WITH_TTF) IF(SDL2PP_WITH_MIXER) FIND_PACKAGE(SDL2_mixer REQUIRED) SET(SDL2_ALL_INCLUDE_DIRS ${SDL2_ALL_INCLUDE_DIRS} ${SDL2_MIXER_INCLUDE_DIR}) SET(SDL2_ALL_LIBRARIES ${SDL2_ALL_LIBRARIES} ${SDL2_MIXER_LIBRARY}) ELSE(SDL2PP_WITH_MIXER) MESSAGE(STATUS "SDL2_mixer support disabled") ENDIF(SDL2PP_WITH_MIXER) FIND_PACKAGE(Doxygen) # compiler flags & definitions IF(MSVC) SET(SDL2PP_WARNINGS "${SDL2PP_WARNINGS} /W3") SET(SDL2PP_WERROR_FLAG "/WX") ELSE(MSVC) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${SDL2PP_CXXSTD}") SET(SDL2PP_WARNINGS "${SDL2PP_WARNINGS} -Wall -Wextra -pedantic") SET(SDL2PP_WERROR_FLAG "-Werror") INCLUDE(AppendCXXFlagIfSupported) APPEND_CXX_FLAG_IF_SUPPORTED(-Wmissing-prototypes SDL2PP_WARNINGS) APPEND_CXX_FLAG_IF_SUPPORTED(-Wtautological-compare SDL2PP_WARNINGS) APPEND_CXX_FLAG_IF_SUPPORTED(-Wshorten-64-to-32 SDL2PP_WARNINGS) ENDIF(MSVC) LIST(REMOVE_DUPLICATES SDL2_ALL_INCLUDE_DIRS) INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR}) INCLUDE_DIRECTORIES(SYSTEM ${SDL2_ALL_INCLUDE_DIRS}) INCLUDE(CheckCompile) CHECK_COMPILE( SDL2PP_WITH_EXPERIMENTAL_OPTIONAL "#include \nint main() { std::experimental::optional o; return !o; }" "experimental/optional header" ) CHECK_COMPILE( SDL2PP_WITH_DEPRECATED "[[deprecated]]\nstatic void f() {} int main() { return 0; }" "[[deprecated]] attribute" ) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SDL2PP_WARNINGS}") IF(SDL2PP_WITH_WERROR) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SDL2PP_WERROR_FLAG}") ENDIF(SDL2PP_WITH_WERROR) # config.h CONFIGURE_FILE( SDL2pp/Config.hh.in SDL2pp/Config.hh ) INCLUDE_DIRECTORIES(BEFORE ${PROJECT_BINARY_DIR}) # doxygen IF(DOXYGEN_FOUND) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) ADD_CUSTOM_TARGET(doxygen ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM ) ENDIF(DOXYGEN_FOUND) # sources SET(LIBRARY_SOURCES SDL2pp/AudioDevice.cc SDL2pp/AudioLock.cc SDL2pp/AudioSpec.cc SDL2pp/Exception.cc SDL2pp/Point.cc SDL2pp/RWops.cc SDL2pp/Rect.cc SDL2pp/Renderer.cc SDL2pp/SDL.cc SDL2pp/Surface.cc SDL2pp/SurfaceLock.cc SDL2pp/Texture.cc SDL2pp/TextureLock.cc SDL2pp/Wav.cc SDL2pp/Window.cc ) SET(LIBRARY_HEADERS SDL2pp/AudioDevice.hh SDL2pp/AudioSpec.hh SDL2pp/ContainerRWops.hh SDL2pp/Exception.hh SDL2pp/Optional.hh SDL2pp/Point.hh SDL2pp/RWops.hh SDL2pp/Rect.hh SDL2pp/Renderer.hh SDL2pp/SDL.hh SDL2pp/SDL2pp.hh SDL2pp/StreamRWops.hh SDL2pp/Surface.hh SDL2pp/Texture.hh SDL2pp/Wav.hh SDL2pp/Window.hh ) SET(LIBRARY_EXTERNAL_HEADERS SDL2pp/external/libcpp_optional.hh ) # optional sources IF(SDL2PP_WITH_TTF) SET(LIBRARY_SOURCES ${LIBRARY_SOURCES} SDL2pp/SDLTTF.cc SDL2pp/Font.cc ) SET(LIBRARY_HEADERS ${LIBRARY_HEADERS} SDL2pp/SDLTTF.hh SDL2pp/Font.hh ) ENDIF(SDL2PP_WITH_TTF) IF(SDL2PP_WITH_IMAGE) SET(LIBRARY_SOURCES ${LIBRARY_SOURCES} SDL2pp/SDLImage.cc ) SET(LIBRARY_HEADERS ${LIBRARY_HEADERS} SDL2pp/SDLImage.hh ) ENDIF(SDL2PP_WITH_IMAGE) IF(SDL2PP_WITH_MIXER) SET(LIBRARY_SOURCES ${LIBRARY_SOURCES} SDL2pp/Chunk.cc SDL2pp/Mixer.cc SDL2pp/Music.cc SDL2pp/SDLMixer.cc ) SET(LIBRARY_HEADERS ${LIBRARY_HEADERS} SDL2pp/Chunk.hh SDL2pp/Mixer.hh SDL2pp/Music.hh SDL2pp/SDLMixer.hh ) ENDIF(SDL2PP_WITH_MIXER) # targets IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # library ADD_LIBRARY(SDL2pp SHARED ${LIBRARY_SOURCES} ${LIBRARY_HEADERS}) TARGET_LINK_LIBRARIES(SDL2pp ${SDL2_ALL_LIBRARIES}) SET_TARGET_PROPERTIES(SDL2pp PROPERTIES VERSION 6.0.0 SOVERSION 6) # examples and tests OPTION(SDL2PP_WITH_EXAMPLES "Build examples" ON) OPTION(SDL2PP_WITH_TESTS "Build tests" ON) OPTION(SDL2PP_ENABLE_LIVE_TESTS "Enable live tests (require X11 display and audio device)" ON) IF(SDL2PP_WITH_EXAMPLES) ADD_SUBDIRECTORY(examples) ENDIF(SDL2PP_WITH_EXAMPLES) IF(SDL2PP_WITH_TESTS) ENABLE_TESTING() ADD_SUBDIRECTORY(tests) ENDIF(SDL2PP_WITH_TESTS) # pkgconfig SET(PKGCONFIGDIR lib/pkgconfig CACHE STRING "directory where to install pkg-config files") IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" OR CMAKE_SYSTEM_NAME MATCHES "DragonFly") SET(PKGCONFIGDIR libdata/pkgconfig) ENDIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" OR CMAKE_SYSTEM_NAME MATCHES "DragonFly") SET(SDL2_PKGCONFIG_CFLAGS "") FOREACH(INCDIR IN LISTS SDL2_ALL_INCLUDE_DIRS) SET(SDL2_PKGCONFIG_CFLAGS "${SDL2_PKGCONFIG_CFLAGS} -I${INCDIR}") ENDFOREACH(INCDIR IN SDL2_ALL_INCLUDE_DIRS) SET(SDL2_PKGCONFIG_LIBS "") FOREACH(LIB IN LISTS SDL2_ALL_LIBRARIES) SET(SDL2_PKGCONFIG_LIBS "${SDL2_PKGCONFIG_LIBS} ${LIB}") ENDFOREACH(LIB IN SDL2_LIBRARIES) CONFIGURE_FILE( sdl2pp.pc.in sdl2pp.pc @ONLY ) # cmake file SET(CMAKEMODDIR share/cmake/Modules CACHE STRING "directory where to install cmake module") CONFIGURE_FILE( FindSDL2PP.cmake.in FindSDL2PP.cmake @ONLY ) # install INSTALL(FILES ${LIBRARY_HEADERS} ${PROJECT_BINARY_DIR}/SDL2pp/Config.hh DESTINATION include/SDL2pp) INSTALL(FILES ${LIBRARY_EXTERNAL_HEADERS} DESTINATION include/SDL2pp/external) INSTALL(TARGETS SDL2pp RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) INSTALL(FILES ${PROJECT_BINARY_DIR}/sdl2pp.pc DESTINATION ${PKGCONFIGDIR}) INSTALL(FILES ${PROJECT_BINARY_DIR}/FindSDL2PP.cmake DESTINATION ${CMAKEMODDIR}) MESSAGE(STATUS "libSDL2pp ${SDL2PP_VERSION} standalone build") ELSE(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # library ADD_LIBRARY(SDL2pp STATIC ${LIBRARY_SOURCES} ${LIBRARY_HEADERS}) # provide variables to parent SET(SDL2PP_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${SDL2_ALL_INCLUDE_DIRS} PARENT_SCOPE) SET(SDL2PP_LIBRARIES SDL2pp ${SDL2_ALL_LIBRARIES} PARENT_SCOPE) MESSAGE(STATUS "libSDL2pp ${SDL2PP_VERSION} bundled build") ENDIF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)