libSDL2pp/CMakeLists.txt
Dmitry Marakasov e103c6b9f9 Add libmingw32 to SDL2pp library list on MINGW
Without it, SDL2pp using apps won't compile with mingw, with undefined
reference to WinMain. More investigation is needed on what happens here,
so for now just link the library. To be noted, it's the same as FindSDL
bundled with CMake does.

See also issue #66 and http://forums.libsdl.org/viewtopic.php?p=49618
2016-01-23 14:31:35 +03:00

287 lines
8.3 KiB
CMake

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 12)
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})
SET(SDL2_ALL_PKGCONFIG_MODULES sdl2)
SET(SDL2PP_EXTRA_LIBRARIES ${SDL2MAIN_LIBRARY})
IF(MINGW)
FIND_LIBRARY(MINGW32_LIBRARY NAMES mingw32)
SET(SDL2PP_EXTRA_LIBRARIES "${SDL2PP_EXTRA_LIBRARIES} ${MINGW32_LIBRARY}")
ENDIF(MINGW)
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})
SET(SDL2_ALL_PKGCONFIG_MODULES "${SDL2_ALL_PKGCONFIG_MODULES} SDL2_image")
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})
SET(SDL2_ALL_PKGCONFIG_MODULES "${SDL2_ALL_PKGCONFIG_MODULES} SDL2_ttf")
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})
SET(SDL2_ALL_PKGCONFIG_MODULES "${SDL2_ALL_PKGCONFIG_MODULES} SDL2_mixer")
ELSE(SDL2PP_WITH_MIXER)
MESSAGE(STATUS "SDL2_mixer support disabled")
ENDIF(SDL2PP_WITH_MIXER)
# compiler flags & definitions
IF(MSVC)
SET(SDL2PP_WARNINGS "${SDL2PP_WARNINGS} /W3")
SET(SDL2PP_WERROR_FLAG "/WX")
ELSE(MSVC)
SET(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG} --coverage")
SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --coverage")
SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} --coverage")
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)
# enable for more cleanups
#APPEND_CXX_FLAG_IF_SUPPORTED(-Weverything SDL2PP_WARNINGS)
# always enables some -Weverything warnings
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)
# disable some -Weverything warnings
#APPEND_CXX_FLAG_IF_SUPPORTED(-Wno-c++98-compat SDL2PP_WARNINGS)
#APPEND_CXX_FLAG_IF_SUPPORTED(-Wno-padded 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 <experimental/optional>\nint main() { std::experimental::optional<int> 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})
# 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 7.0.0 SOVERSION 7)
SET(SDL2PP_LIBRARIES ${SDL2PP_EXTRA_LIBRARIES} SDL2pp ${SDL2_ALL_LIBRARIES})
# 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)
# doxygen
FIND_PACKAGE(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)
# 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")
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_EXTRA_LIBRARIES} SDL2pp ${SDL2_ALL_LIBRARIES} PARENT_SCOPE)
MESSAGE(STATUS "libSDL2pp ${SDL2PP_VERSION} bundled build")
ENDIF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)