CMakeLists.txt
e3676599
 ## CMake
 cmake_minimum_required(VERSION 3.14)
 
 
 ## Project
 set(PROJECT_NAME glfbo3d)
 if ("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}")
     return()
 endif()
 project(${PROJECT_NAME}
     VERSION 1.0.0
     LANGUAGES CXX
 )
 set(CXX_STANDARD          11)
 set(CXX_STANDARD_REQUIRED ON)
 set(CXX_EXTENSIONS        OFF)
 
 
 ## Packages
 find_package(OpenGL REQUIRED)
 find_package(GLEW REQUIRED)
 find_package(glm REQUIRED)
 
 
 ## External projects
 include(FetchContent)
 FetchContent_Declare(glshader
     GIT_REPOSITORY https://git.rcrnstn.net/rcrnstn/glshader
 )
 FetchContent_Declare(gltest
     GIT_REPOSITORY https://git.rcrnstn.net/rcrnstn/gltest
 )
 FetchContent_MakeAvailable(
     glshader
     gltest
 )
 
 
 ## Main target
 add_library(${PROJECT_NAME}
     src/${PROJECT_NAME}.cpp
     include/${PROJECT_NAME}.hpp
 )
 set_property(TARGET ${PROJECT_NAME} PROPERTY PUBLIC_HEADER
     include/${PROJECT_NAME}.hpp
 )
 target_include_directories(${PROJECT_NAME}
     PUBLIC
         $<INSTALL_INTERFACE:include>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
     PRIVATE
         src
 )
 target_link_libraries(${PROJECT_NAME}
     PUBLIC
         OpenGL::GL
         GLEW::GLEW
 )
 
 
 if ("${CMAKE_PROJECT_NAME}" STREQUAL "${PROJECT_NAME}")
 
 
     ## Test target
     add_executable(${PROJECT_NAME}-test
         tests/${PROJECT_NAME}.cpp
     )
     target_include_directories(${PROJECT_NAME}-test
         PRIVATE
             tests
     )
     target_link_libraries(${PROJECT_NAME}-test
         PRIVATE
             ${PROJECT_NAME}
             OpenGL::GL
             GLEW::GLEW
             glm
             glshader
             gltest
     )
     add_test(
         NAME    ${PROJECT_NAME}-test
         COMMAND ${PROJECT_NAME}-test
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
     )
 
 
     ## Default build type for single-configuration generators
     if (NOT CMAKE_BUILD_TYPE)
         set(CMAKE_BUILD_TYPE Debug)
     endif()
 
 
     ## Language tools and options
     set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
     find_program(CPPCHECK             cppcheck)
     find_program(CLANG_TIDY           clang-tidy)
     find_program(INCLUDE_WHAT_YOU_USE include-what-you-use)
     if(CPPCHECK)
         set(CXX_CPPCHECK ${CPPCHECK} --enable=warning,style --error-exitcode=1)
     endif()
     if(CLANG_TIDY)
         set(CXX_CLANG_TIDY ${CLANG_TIDY})
     endif()
     if(INCLUDE_WHAT_YOU_USE)
         set(CXX_INCLUDE_WHAT_YOU_USE ${INCLUDE_WHAT_YOU_USE})
     endif()
     if (MSVC)
         set(COMPILE_OPTIONS
             /permissive-
             /WX
             /W4
         )
     elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|.*Clang")
         set(COMPILE_OPTIONS
             -pedantic
             -Werror -Wfatal-errors
             -Wall -Wextra
             -Wconversion -Wsign-conversion
             -Wdouble-promotion
             -Wimplicit-fallthrough
             -Wvla
             -Wzero-as-null-pointer-constant
             -Weffc++
         )
         set(SANITIZE_OPTIONS
             $<$<CONFIG:Debug>:-fsanitize=address,leak,undefined>
         )
         list(APPEND COMPILE_OPTIONS ${SANITIZE_OPTIONS})
         list(APPEND LINK_OPTIONS    ${SANITIZE_OPTIONS})
     endif()
     include(CheckIPOSupported)
     check_ipo_supported(RESULT INTERPROCEDURAL_OPTIMIZATION)
     get_directory_property(BUILDSYSTEM_TARGETS BUILDSYSTEM_TARGETS)
     set_target_properties(
         ${BUILDSYSTEM_TARGETS}
         PROPERTIES
             CXX_STANDARD             "${CXX_STANDARD}"
             CXX_STANDARD_REQUIRED    "${CXX_STANDARD_REQUIRED}"
             CXX_EXTENSIONS           "${CXX_EXTENSIONS}"
             CXX_CPPCHECK             "${CXX_CPPCHECK}"
             CXX_CLANG_TIDY           "${CXX_CLANG_TIDY}"
             CXX_INCLUDE_WHAT_YOU_USE "${CXX_INCLUDE_WHAT_YOU_USE}"
             COMPILE_OPTIONS          "${COMPILE_OPTIONS}"
             LINK_OPTIONS             "${LINK_OPTIONS}"
             INTERPROCEDURAL_OPTIMIZATION
                 "${INTERPROCEDURAL_OPTIMIZATION}"
     )
 
 
     ## Testing
     include(CTest)
 
 
     ## Packaging and installing
     include(CPack)
     install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME})
     include(GNUInstallDirs)
     set(CMAKE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake
         CACHE PATH "System CMake package config files"
     )
     install(EXPORT ${PROJECT_NAME}
         FILE ${PROJECT_NAME}Config.cmake
         DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/${PROJECT_NAME}
     )
     include(CMakePackageConfigHelpers)
     write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake
         COMPATIBILITY SameMajorVersion
     )
     install(
         FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
         DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/${PROJECT_NAME}
     )
 
 
 endif()