Modernize CMake syntax

This commit is contained in:
Dmitry Marakasov 2019-02-20 20:57:17 +03:00
parent 70e57a7ec2
commit e36cbfbfa0

View File

@ -1,85 +1,85 @@
PROJECT(libSDL2pp)
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# meta
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
project(libSDL2pp)
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
SET(SDL2PP_MAJOR_VERSION 0)
SET(SDL2PP_MINOR_VERSION 16)
SET(SDL2PP_PATCH_VERSION 0)
set(SDL2PP_MAJOR_VERSION 0)
set(SDL2PP_MINOR_VERSION 16)
set(SDL2PP_PATCH_VERSION 0)
SET(SDL2PP_VERSION "${SDL2PP_MAJOR_VERSION}.${SDL2PP_MINOR_VERSION}.${SDL2PP_PATCH_VERSION}")
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_WERROR "Make warnings fatal" OFF)
option(SDL2PP_WITH_WERROR "Make warnings fatal" OFF)
SET(SDL2PP_CXXSTD "c++11" CACHE STRING "Used c++ standard")
set(SDL2PP_CXXSTD "c++11" CACHE STRING "Used c++ standard")
IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
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)
else()
# please set SDL2PP_WITH_IMAGE, SDL2PP_WITH_TTF, SDL2PP_WITH_MIXER in parent project as needed
ENDIF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
endif()
# 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})
SET(SDL2PP_EXTRA_PKGCONFIG_LIBRARIES ${SDL2MAIN_LIBRARY})
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})
set(SDL2PP_EXTRA_PKGCONFIG_LIBRARIES ${SDL2MAIN_LIBRARY})
IF(MINGW)
SET(MINGW32_LIBRARY "mingw32" CACHE STRING "mingw32 library")
SET(SDL2PP_EXTRA_LIBRARIES ${MINGW32_LIBRARY} ${SDL2PP_EXTRA_LIBRARIES})
SET(SDL2PP_EXTRA_PKGCONFIG_LIBRARIES "-l${MINGW32_LIBRARY} ${SDL2PP_EXTRA_PKGCONFIG_LIBRARIES}")
ENDIF(MINGW)
if(MINGW)
set(MINGW32_LIBRARY "mingw32" CACHE STRING "mingw32 library")
set(SDL2PP_EXTRA_LIBRARIES ${MINGW32_LIBRARY} ${SDL2PP_EXTRA_LIBRARIES})
set(SDL2PP_EXTRA_PKGCONFIG_LIBRARIES "-l${MINGW32_LIBRARY} ${SDL2PP_EXTRA_PKGCONFIG_LIBRARIES}")
endif()
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_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()
message(STATUS "SDL2_image support disabled")
endif()
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_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()
message(STATUS "SDL2_ttf support disabled")
endif()
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)
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()
message(STATUS "SDL2_mixer support disabled")
endif()
# 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")
if(MSVC)
set(SDL2PP_WARNINGS "${SDL2PP_WARNINGS} /W3")
set(SDL2PP_WERROR_FLAG "/WX")
else()
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")
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)
include(AppendCXXFlagIfSupported)
# enable for more cleanups
#APPEND_CXX_FLAG_IF_SUPPORTED(-Weverything SDL2PP_WARNINGS)
@ -92,36 +92,36 @@ ELSE(MSVC)
# 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)
endif()
LIST(REMOVE_DUPLICATES SDL2_ALL_INCLUDE_DIRS)
list(REMOVE_DUPLICATES SDL2_ALL_INCLUDE_DIRS)
INCLUDE_DIRECTORIES(BEFORE ${PROJECT_SOURCE_DIR})
INCLUDE_DIRECTORIES(SYSTEM ${SDL2_ALL_INCLUDE_DIRS})
include_directories(BEFORE ${PROJECT_SOURCE_DIR})
include_directories(SYSTEM ${SDL2_ALL_INCLUDE_DIRS})
INCLUDE(CheckCompile)
CHECK_COMPILE(
include(CheckCompile)
check_compile(
SDL2PP_WITH_EXPERIMENTAL_OPTIONAL
"#include <experimental/optional>\nint main() { std::experimental::optional<int> o; return !o; }"
"experimental/optional header"
)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SDL2PP_WARNINGS}")
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)
if(SDL2PP_WITH_WERROR)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SDL2PP_WERROR_FLAG}")
endif()
# config.h
CONFIGURE_FILE(
configure_file(
SDL2pp/Config.hh.in
SDL2pp/Config.hh
)
INCLUDE_DIRECTORIES(BEFORE ${PROJECT_BINARY_DIR})
include_directories(BEFORE ${PROJECT_BINARY_DIR})
# sources
SET(LIBRARY_SOURCES
set(LIBRARY_SOURCES
SDL2pp/AudioDevice.cc
SDL2pp/AudioLock.cc
SDL2pp/AudioSpec.cc
@ -140,7 +140,7 @@ SET(LIBRARY_SOURCES
SDL2pp/Window.cc
)
SET(LIBRARY_HEADERS
set(LIBRARY_HEADERS
SDL2pp/AudioDevice.hh
SDL2pp/AudioSpec.hh
SDL2pp/Color.hh
@ -160,146 +160,146 @@ SET(LIBRARY_HEADERS
SDL2pp/Window.hh
)
SET(LIBRARY_EXTERNAL_HEADERS
set(LIBRARY_EXTERNAL_HEADERS
SDL2pp/external/libcpp_optional.hh
)
# optional sources
IF(SDL2PP_WITH_TTF)
SET(LIBRARY_SOURCES
if(SDL2PP_WITH_TTF)
set(LIBRARY_SOURCES
${LIBRARY_SOURCES}
SDL2pp/SDLTTF.cc
SDL2pp/Font.cc
)
SET(LIBRARY_HEADERS
set(LIBRARY_HEADERS
${LIBRARY_HEADERS}
SDL2pp/SDLTTF.hh
SDL2pp/Font.hh
)
ENDIF(SDL2PP_WITH_TTF)
endif()
IF(SDL2PP_WITH_IMAGE)
SET(LIBRARY_SOURCES
if(SDL2PP_WITH_IMAGE)
set(LIBRARY_SOURCES
${LIBRARY_SOURCES}
SDL2pp/SDLImage.cc
)
SET(LIBRARY_HEADERS
set(LIBRARY_HEADERS
${LIBRARY_HEADERS}
SDL2pp/SDLImage.hh
)
ENDIF(SDL2PP_WITH_IMAGE)
endif()
IF(SDL2PP_WITH_MIXER)
SET(LIBRARY_SOURCES
if(SDL2PP_WITH_MIXER)
set(LIBRARY_SOURCES
${LIBRARY_SOURCES}
SDL2pp/Chunk.cc
SDL2pp/Mixer.cc
SDL2pp/Music.cc
SDL2pp/SDLMixer.cc
)
SET(LIBRARY_HEADERS
set(LIBRARY_HEADERS
${LIBRARY_HEADERS}
SDL2pp/Chunk.hh
SDL2pp/Mixer.hh
SDL2pp/Music.hh
SDL2pp/SDLMixer.hh
)
ENDIF(SDL2PP_WITH_MIXER)
endif()
# targets
INCLUDE(GenerateExportHeader)
include(GenerateExportHeader)
IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
# options
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)
OPTION(SDL2PP_STATIC "Build static library instead of shared one" OFF)
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)
option(SDL2PP_STATIC "Build static library instead of shared one" OFF)
# library
IF(SDL2PP_STATIC)
if(SDL2PP_STATIC)
ADD_LIBRARY(SDL2pp STATIC ${LIBRARY_SOURCES} ${LIBRARY_HEADERS})
ELSE(SDL2PP_STATIC)
else()
ADD_LIBRARY(SDL2pp SHARED ${LIBRARY_SOURCES} ${LIBRARY_HEADERS})
TARGET_LINK_LIBRARIES(SDL2pp ${SDL2_ALL_LIBRARIES})
SET_TARGET_PROPERTIES(SDL2pp PROPERTIES VERSION 8.3.0 SOVERSION 8)
ENDIF(SDL2PP_STATIC)
endif()
GENERATE_EXPORT_HEADER(SDL2pp EXPORT_FILE_NAME SDL2pp/Export.hh)
generate_export_header(SDL2pp EXPORT_FILE_NAME SDL2pp/Export.hh)
SET(SDL2PP_LIBRARIES ${SDL2PP_EXTRA_LIBRARIES} SDL2pp ${SDL2_ALL_LIBRARIES})
set(SDL2PP_LIBRARIES ${SDL2PP_EXTRA_LIBRARIES} SDL2pp ${SDL2_ALL_LIBRARIES})
# examples and tests
IF(SDL2PP_WITH_EXAMPLES)
ADD_SUBDIRECTORY(examples)
ENDIF(SDL2PP_WITH_EXAMPLES)
if(SDL2PP_WITH_EXAMPLES)
add_subdirectory(examples)
endif()
IF(SDL2PP_WITH_TESTS)
ENABLE_TESTING()
ADD_SUBDIRECTORY(tests)
ENDIF(SDL2PP_WITH_TESTS)
if(SDL2PP_WITH_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
# 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
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)
endif()
# pkgconfig and cmake modules
SET(CMAKEMODDIR share/cmake/Modules CACHE STRING "directory where to install cmake module")
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(CMAKEMODDIR share/cmake/Modules CACHE STRING "directory where to install cmake module")
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")
endif()
INCLUDE(Join)
include(Join)
JOIN_QUOTED("${SDL2PP_EXTRA_LIBRARIES}" SDL2PP_EXTRA_LIBRARIES_STR)
JOIN_QUOTED("${SDL2_ALL_LIBRARIES}" SDL2_ALL_LIBRARIES_STR)
JOIN_QUOTED("${SDL2_ALL_INCLUDE_DIRS}" SDL2_ALL_INCLUDE_DIRS_STR)
CONFIGURE_FILE(
configure_file(
sdl2pp.pc.in
sdl2pp.pc
@ONLY
)
CONFIGURE_FILE(
configure_file(
FindSDL2PP.cmake.in
FindSDL2PP.cmake
@ONLY
)
# install
INSTALL(FILES
install(FILES
${LIBRARY_HEADERS}
${PROJECT_BINARY_DIR}/SDL2pp/Config.hh
${PROJECT_BINARY_DIR}/SDL2pp/Export.hh
DESTINATION include/SDL2pp
)
INSTALL(FILES ${LIBRARY_EXTERNAL_HEADERS} DESTINATION include/SDL2pp/external)
INSTALL(TARGETS 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})
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)
message(STATUS "libSDL2pp ${SDL2PP_VERSION} standalone build")
else()
# library
ADD_LIBRARY(SDL2pp STATIC ${LIBRARY_SOURCES} ${LIBRARY_HEADERS})
GENERATE_EXPORT_HEADER(SDL2pp EXPORT_FILE_NAME SDL2pp/Export.hh)
add_library(SDL2pp STATIC ${LIBRARY_SOURCES} ${LIBRARY_HEADERS})
generate_export_header(SDL2pp EXPORT_FILE_NAME SDL2pp/Export.hh)
# 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)
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)
message(STATUS "libSDL2pp ${SDL2PP_VERSION} bundled build")
endif()