100 lines
3.7 KiB
CMake
100 lines
3.7 KiB
CMake
cmake_minimum_required(VERSION 4.0)
|
|
project(WindowGlfwGlLib CXX C)
|
|
|
|
include(GNUInstallDirs)
|
|
include(CMakePackageConfigHelpers)
|
|
include(CheckIPOSupported)
|
|
check_ipo_supported(RESULT IS_IPO_SUPPORTED OUTPUT IPO_OUTPUT_VERBOSE)
|
|
|
|
find_package(OpenGL REQUIRED)
|
|
find_package(GLEW REQUIRED)
|
|
find_package(glfw3 REQUIRED)
|
|
find_package(PkgConfig REQUIRED)
|
|
pkg_check_modules(Jemalloc REQUIRED IMPORTED_TARGET GLOBAL jemalloc)
|
|
|
|
set(COMPILE_FLAGS
|
|
-pipe
|
|
-march=native
|
|
-mtune=native
|
|
-Wall
|
|
-Wextra
|
|
-Winline
|
|
-pedantic
|
|
-pedantic-errors
|
|
-Wnrvo
|
|
)
|
|
|
|
set(COMPILE_OPTIMIZED_FLAGS
|
|
-fno-plt
|
|
-fuse-ld=mold
|
|
-funroll-loops
|
|
-ffunction-sections
|
|
-fdata-sections
|
|
-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
|
|
)
|
|
|
|
set(LINKER_OPTIONS
|
|
-Wl,--sort-common,--as-needed
|
|
)
|
|
|
|
set(LINKER_OPTIMIZED_OPTIONS
|
|
-Wl,--gc-sections
|
|
-fuse-ld=mold
|
|
)
|
|
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
|
|
set(COMPILE_FLAGS -stdlib=libc++ ${COMPILE_FLAGS})
|
|
set(LINKER_FLAGS ${LINKER_FLAGS} c++)
|
|
|
|
set(COMPILE_OPTIMIZED_FLAGS ${COMPILE_OPTIMIZED_FLAGS} -fwhole-program-vtables)
|
|
set(LINKER_OPTIMIZED_OPTIONS ${LINKER_OPTIMIZED_OPTIONS} -fwhole-program-vtables)
|
|
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
|
|
set(LINKER_FLAGS ${LINKER_FLAGS} stdc++)
|
|
|
|
set(COMPILE_OPTIMIZED_FLAGS ${COMPILE_OPTIMIZED_FLAGS} -fdevirtualize-at-ltrans)
|
|
set(LINKER_OPTIMIZED_OPTIONS ${LINKER_OPTIMIZED_OPTIONS} -fdevirtualize-at-ltrans)
|
|
endif ()
|
|
|
|
add_library(${PROJECT_NAME} SHARED src/window.cpp include/window.hpp include/basic_data.hpp)
|
|
target_precompile_headers(${PROJECT_NAME} PUBLIC include/window.hpp include/basic_data.hpp)
|
|
target_include_directories(${PROJECT_NAME}
|
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
INTERFACE $<INSTALL_INTERFACE:include/windowGlfwGlLib>
|
|
)
|
|
target_compile_definitions(${PROJECT_NAME} PUBLIC GLFW_INCLUDE_NONE PRIVATE $<$<AND:$<CONFIG:Debug>,$<CXX_COMPILER_ID:GNU>>:_GLIBCXX_DEBUG>)
|
|
target_compile_options(${PROJECT_NAME} PUBLIC ${COMPILE_FLAGS} $<$<CONFIG:Release>:${COMPILE_OPTIMIZED_FLAGS}>)
|
|
target_link_options(${PROJECT_NAME} PUBLIC ${LINKER_OPTIONS} $<$<CONFIG:Release>:${LINKER_OPTIMIZED_OPTIONS}>)
|
|
target_link_libraries(${PROJECT_NAME} PUBLIC $<$<CONFIG:Release>:PkgConfig::Jemalloc> OpenGL::GL GLEW::GLEW glfw)
|
|
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23 CXX_EXTENSIONS OFF UNITY_BUILD ON)
|
|
if (IS_IPO_SUPPORTED)
|
|
set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)
|
|
else ()
|
|
message(WARNING "IPO is not supported: ${IPO_OUTPUT_VERBOSE}")
|
|
endif ()
|
|
|
|
install(TARGETS ${PROJECT_NAME}
|
|
EXPORT windowGlfwGlLibTargets
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
INCLUDES DESTINATION include/windowGlfwGlLib
|
|
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/windowGlfwGlLibTargets"
|
|
)
|
|
|
|
install(EXPORT windowGlfwGlLibTargets
|
|
FILE windowGlfwGlLibTargets.cmake
|
|
NAMESPACE windowGlfwGlLibTargets::
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/windowGlfwGlLibTargets
|
|
)
|
|
|
|
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
|
|
"${CMAKE_CURRENT_BINARY_DIR}/windowGlfwGlLibTargetsConfig.cmake"
|
|
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/windowGlfwGlLibTargets
|
|
)
|
|
|
|
install(FILES include/window.hpp include/basic_data.hpp DESTINATION include/windowGlfwGlLib)
|
|
|
|
install(FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/windowGlfwGlLibTargetsConfig.cmake"
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/windowGlfwGlLibTargets
|
|
)
|