mirror of
https://github.com/gwm17/glfw.git
synced 2024-11-26 20:28:49 -05:00
7c3706763a
Cleanup of 8bdb105897
.
Add build macro to configuration header and documentation. Add
corresponding CMake option. Add change log entry and credit. Add
loader static library to link dependencies and add detection to
FindVulkan.cmake.
420 lines
14 KiB
CMake
420 lines
14 KiB
CMake
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
|
|
|
|
project(GLFW C)
|
|
|
|
cmake_minimum_required(VERSION 2.8.12)
|
|
|
|
if (NOT CMAKE_VERSION VERSION_LESS "3.0")
|
|
# Until all major package systems have moved to CMake 3,
|
|
# we stick with the older INSTALL_NAME_DIR mechanism
|
|
cmake_policy(SET CMP0042 OLD)
|
|
endif()
|
|
|
|
set(GLFW_VERSION_MAJOR "3")
|
|
set(GLFW_VERSION_MINOR "2")
|
|
set(GLFW_VERSION_PATCH "1")
|
|
set(GLFW_VERSION_EXTRA "")
|
|
set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
|
|
set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}")
|
|
set(LIB_SUFFIX "" CACHE STRING "Takes an empty string or 64. Directory where lib will be installed: lib or lib64")
|
|
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
|
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
|
|
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
|
|
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
|
|
option(GLFW_INSTALL "Generate installation target" ON)
|
|
option(GLFW_VULKAN_STATIC "Use the Vulkan loader statically linked into application" OFF)
|
|
option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF)
|
|
|
|
if (WIN32)
|
|
option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF)
|
|
endif()
|
|
|
|
if (APPLE)
|
|
option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON)
|
|
option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON)
|
|
option(GLFW_USE_RETINA "Use the full resolution of Retina displays" ON)
|
|
endif()
|
|
|
|
if (UNIX AND NOT APPLE)
|
|
option(GLFW_USE_WAYLAND "Use Wayland for window creation" OFF)
|
|
option(GLFW_USE_MIR "Use Mir for window creation" OFF)
|
|
endif()
|
|
|
|
if (MSVC)
|
|
option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON)
|
|
endif()
|
|
|
|
if (BUILD_SHARED_LIBS)
|
|
set(_GLFW_BUILD_DLL 1)
|
|
endif()
|
|
|
|
if (BUILD_SHARED_LIBS AND UNIX)
|
|
# On Unix-like systems, shared libraries can use the soname system.
|
|
set(GLFW_LIB_NAME glfw)
|
|
else()
|
|
set(GLFW_LIB_NAME glfw3)
|
|
endif()
|
|
|
|
if (GLFW_VULKAN_STATIC)
|
|
set(_GLFW_VULKAN_STATIC 1)
|
|
endif()
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
|
|
|
|
find_package(Threads REQUIRED)
|
|
find_package(Vulkan)
|
|
|
|
if (GLFW_BUILD_DOCS)
|
|
set(DOXYGEN_SKIP_DOT TRUE)
|
|
find_package(Doxygen)
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Set compiler specific flags
|
|
#--------------------------------------------------------------------
|
|
if (MSVC)
|
|
if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
|
foreach (flag CMAKE_C_FLAGS
|
|
CMAKE_C_FLAGS_DEBUG
|
|
CMAKE_C_FLAGS_RELEASE
|
|
CMAKE_C_FLAGS_MINSIZEREL
|
|
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
|
|
if (${flag} MATCHES "/MD")
|
|
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
|
endif()
|
|
if (${flag} MATCHES "/MDd")
|
|
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
|
endif()
|
|
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
if (MINGW)
|
|
# Workaround for legacy MinGW not providing XInput and DirectInput
|
|
include(CheckIncludeFile)
|
|
|
|
check_include_file(dinput.h DINPUT_H_FOUND)
|
|
check_include_file(xinput.h XINPUT_H_FOUND)
|
|
if (NOT DINPUT_H_FOUND OR NOT XINPUT_H_FOUND)
|
|
list(APPEND glfw_INCLUDE_DIRS "${GLFW_SOURCE_DIR}/deps/mingw")
|
|
endif()
|
|
|
|
# Enable link-time exploit mitigation features enabled by default on MSVC
|
|
include(CheckCCompilerFlag)
|
|
|
|
# Compatibility with data execution prevention (DEP)
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
|
check_c_compiler_flag("" _GLFW_HAS_DEP)
|
|
if (_GLFW_HAS_DEP)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--nxcompat ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
|
|
# Compatibility with address space layout randomization (ASLR)
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
|
check_c_compiler_flag("" _GLFW_HAS_ASLR)
|
|
if (_GLFW_HAS_ASLR)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--dynamicbase ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
|
|
# Compatibility with 64-bit address space layout randomization (ASLR)
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
|
check_c_compiler_flag("" _GLFW_HAS_64ASLR)
|
|
if (_GLFW_HAS_64ASLR)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--high-entropy-va ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Detect and select backend APIs
|
|
#--------------------------------------------------------------------
|
|
if (WIN32)
|
|
set(_GLFW_WIN32 1)
|
|
message(STATUS "Using Win32 for window creation")
|
|
elseif (APPLE)
|
|
set(_GLFW_COCOA 1)
|
|
message(STATUS "Using Cocoa for window creation")
|
|
elseif (UNIX)
|
|
if (GLFW_USE_WAYLAND)
|
|
set(_GLFW_WAYLAND 1)
|
|
message(STATUS "Using Wayland for window creation")
|
|
elseif (GLFW_USE_MIR)
|
|
set(_GLFW_MIR 1)
|
|
message(STATUS "Using Mir for window creation")
|
|
else()
|
|
set(_GLFW_X11 1)
|
|
message(STATUS "Using X11 for window creation")
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "No supported platform was detected")
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Add Vulkan static library if requested
|
|
#--------------------------------------------------------------------
|
|
if (GLFW_VULKAN_STATIC)
|
|
if (VULKAN_FOUND AND VULKAN_STATIC_LIBRARY)
|
|
list(APPEND glfw_LIBRARIES ${VULKAN_STATIC_LIBRARY})
|
|
else()
|
|
if (BUILD_SHARED_LIBS OR GLFW_BUILD_EXAMPLES OR GLFW_BUILD_TESTS)
|
|
message(FATAL_ERROR "Vulkan loader static library not found")
|
|
else()
|
|
message(WARNING "Vulkan loader static library not found")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Find and add Unix math and time libraries
|
|
#--------------------------------------------------------------------
|
|
if (UNIX AND NOT APPLE)
|
|
find_library(RT_LIBRARY rt)
|
|
mark_as_advanced(RT_LIBRARY)
|
|
if (RT_LIBRARY)
|
|
list(APPEND glfw_LIBRARIES "${RT_LIBRARY}")
|
|
list(APPEND glfw_PKG_LIBS "-lrt")
|
|
endif()
|
|
|
|
find_library(MATH_LIBRARY m)
|
|
mark_as_advanced(MATH_LIBRARY)
|
|
if (MATH_LIBRARY)
|
|
list(APPEND glfw_LIBRARIES "${MATH_LIBRARY}")
|
|
list(APPEND glfw_PKG_LIBS "-lm")
|
|
endif()
|
|
|
|
if (CMAKE_DL_LIBS)
|
|
list(APPEND glfw_LIBRARIES "${CMAKE_DL_LIBS}")
|
|
list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
|
|
endif()
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Use Win32 for window creation
|
|
#--------------------------------------------------------------------
|
|
if (_GLFW_WIN32)
|
|
|
|
list(APPEND glfw_PKG_LIBS "-lgdi32")
|
|
|
|
if (GLFW_USE_HYBRID_HPG)
|
|
set(_GLFW_USE_HYBRID_HPG 1)
|
|
endif()
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Use X11 for window creation
|
|
#--------------------------------------------------------------------
|
|
if (_GLFW_X11)
|
|
|
|
find_package(X11 REQUIRED)
|
|
|
|
list(APPEND glfw_PKG_DEPS "x11")
|
|
|
|
# Set up library and include paths
|
|
list(APPEND glfw_INCLUDE_DIRS "${X11_X11_INCLUDE_PATH}")
|
|
list(APPEND glfw_LIBRARIES "${X11_X11_LIB}" "${CMAKE_THREAD_LIBS_INIT}")
|
|
|
|
# Check for XRandR (modern resolution switching and gamma control)
|
|
if (NOT X11_Xrandr_FOUND)
|
|
message(FATAL_ERROR "The RandR library and headers were not found")
|
|
endif()
|
|
|
|
list(APPEND glfw_INCLUDE_DIRS "${X11_Xrandr_INCLUDE_PATH}")
|
|
list(APPEND glfw_LIBRARIES "${X11_Xrandr_LIB}")
|
|
list(APPEND glfw_PKG_DEPS "xrandr")
|
|
|
|
# Check for Xinerama (legacy multi-monitor support)
|
|
if (NOT X11_Xinerama_FOUND)
|
|
message(FATAL_ERROR "The Xinerama library and headers were not found")
|
|
endif()
|
|
|
|
list(APPEND glfw_INCLUDE_DIRS "${X11_Xinerama_INCLUDE_PATH}")
|
|
list(APPEND glfw_LIBRARIES "${X11_Xinerama_LIB}")
|
|
list(APPEND glfw_PKG_DEPS "xinerama")
|
|
|
|
# Check for Xf86VidMode (fallback gamma control)
|
|
if (X11_xf86vmode_FOUND)
|
|
list(APPEND glfw_INCLUDE_DIRS "${X11_xf86vmode_INCLUDE_PATH}")
|
|
list(APPEND glfw_PKG_DEPS "xxf86vm")
|
|
|
|
if (X11_Xxf86vm_LIB)
|
|
list(APPEND glfw_LIBRARIES "${X11_Xxf86vm_LIB}")
|
|
else()
|
|
# Backwards compatibility (see CMake bug 0006976)
|
|
list(APPEND glfw_LIBRARIES Xxf86vm)
|
|
endif()
|
|
|
|
set(_GLFW_HAS_XF86VM TRUE)
|
|
endif()
|
|
|
|
# Check for Xkb (X keyboard extension)
|
|
if (NOT X11_Xkb_FOUND)
|
|
message(FATAL_ERROR "The X keyboard extension headers were not found")
|
|
endif()
|
|
|
|
list(APPEND glfw_INCLUDE_DIR "${X11_Xkb_INCLUDE_PATH}")
|
|
|
|
# Check for Xcursor
|
|
if (NOT X11_Xcursor_FOUND)
|
|
message(FATAL_ERROR "The Xcursor libraries and headers were not found")
|
|
endif()
|
|
|
|
list(APPEND glfw_INCLUDE_DIR "${X11_Xcursor_INCLUDE_PATH}")
|
|
list(APPEND glfw_LIBRARIES "${X11_Xcursor_LIB}")
|
|
list(APPEND glfw_PKG_DEPS "xcursor")
|
|
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Use Wayland for window creation
|
|
#--------------------------------------------------------------------
|
|
if (_GLFW_WAYLAND)
|
|
find_package(ECM REQUIRED NO_MODULE)
|
|
list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
|
|
|
|
find_package(Wayland REQUIRED)
|
|
find_package(WaylandScanner REQUIRED)
|
|
find_package(WaylandProtocols 1.1 REQUIRED)
|
|
|
|
list(APPEND glfw_PKG_DEPS "wayland-egl")
|
|
|
|
list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIR}")
|
|
list(APPEND glfw_LIBRARIES "${Wayland_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
|
|
|
find_package(XKBCommon REQUIRED)
|
|
list(APPEND glfw_PKG_DEPS "xkbcommon")
|
|
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
|
list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Use Mir for window creation
|
|
#--------------------------------------------------------------------
|
|
if (_GLFW_MIR)
|
|
find_package(Mir REQUIRED)
|
|
list(APPEND glfw_PKG_DEPS "mirclient")
|
|
|
|
list(APPEND glfw_INCLUDE_DIRS "${MIR_INCLUDE_DIR}")
|
|
list(APPEND glfw_LIBRARIES "${MIR_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
|
|
|
|
find_package(XKBCommon REQUIRED)
|
|
list(APPEND glfw_PKG_DEPS "xkbcommon")
|
|
list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
|
|
list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Use Cocoa for window creation and NSOpenGL for context creation
|
|
#--------------------------------------------------------------------
|
|
if (_GLFW_COCOA)
|
|
|
|
if (GLFW_USE_MENUBAR)
|
|
set(_GLFW_USE_MENUBAR 1)
|
|
endif()
|
|
|
|
if (GLFW_USE_CHDIR)
|
|
set(_GLFW_USE_CHDIR 1)
|
|
endif()
|
|
|
|
if (GLFW_USE_RETINA)
|
|
set(_GLFW_USE_RETINA 1)
|
|
endif()
|
|
|
|
# Set up library and include paths
|
|
find_library(COCOA_FRAMEWORK Cocoa)
|
|
find_library(IOKIT_FRAMEWORK IOKit)
|
|
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
|
|
find_library(CORE_VIDEO_FRAMEWORK CoreVideo)
|
|
mark_as_advanced(COCOA_FRAMEWORK
|
|
IOKIT_FRAMEWORK
|
|
CORE_FOUNDATION_FRAMEWORK
|
|
CORE_VIDEO_FRAMEWORK)
|
|
list(APPEND glfw_LIBRARIES "${COCOA_FRAMEWORK}"
|
|
"${IOKIT_FRAMEWORK}"
|
|
"${CORE_FOUNDATION_FRAMEWORK}"
|
|
"${CORE_VIDEO_FRAMEWORK}")
|
|
|
|
set(glfw_PKG_DEPS "")
|
|
set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo")
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Export GLFW library dependencies
|
|
#--------------------------------------------------------------------
|
|
foreach(arg ${glfw_PKG_DEPS})
|
|
set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} ${arg}")
|
|
endforeach()
|
|
foreach(arg ${glfw_PKG_LIBS})
|
|
set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} ${arg}")
|
|
endforeach()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Create generated files
|
|
#--------------------------------------------------------------------
|
|
include(CMakePackageConfigHelpers)
|
|
|
|
set(GLFW_CONFIG_PATH "lib${LIB_SUFFIX}/cmake/glfw3")
|
|
|
|
configure_package_config_file(src/glfw3Config.cmake.in
|
|
src/glfw3Config.cmake
|
|
INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
|
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
|
|
|
write_basic_package_version_file(src/glfw3ConfigVersion.cmake
|
|
VERSION ${GLFW_VERSION_FULL}
|
|
COMPATIBILITY SameMajorVersion)
|
|
|
|
configure_file(src/glfw_config.h.in src/glfw_config.h @ONLY)
|
|
|
|
configure_file(src/glfw3.pc.in src/glfw3.pc @ONLY)
|
|
|
|
#--------------------------------------------------------------------
|
|
# Add subdirectories
|
|
#--------------------------------------------------------------------
|
|
add_subdirectory(src)
|
|
|
|
if (GLFW_BUILD_EXAMPLES)
|
|
add_subdirectory(examples)
|
|
endif()
|
|
|
|
if (GLFW_BUILD_TESTS)
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
|
|
add_subdirectory(docs)
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Install files other than the library
|
|
# The library is installed by src/CMakeLists.txt
|
|
#--------------------------------------------------------------------
|
|
if (GLFW_INSTALL)
|
|
install(DIRECTORY include/GLFW DESTINATION include
|
|
FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
|
|
|
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3Config.cmake"
|
|
"${GLFW_BINARY_DIR}/src/glfw3ConfigVersion.cmake"
|
|
DESTINATION "${GLFW_CONFIG_PATH}")
|
|
|
|
install(EXPORT glfwTargets FILE glfw3Targets.cmake
|
|
EXPORT_LINK_INTERFACE_LIBRARIES
|
|
DESTINATION "${GLFW_CONFIG_PATH}")
|
|
install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
|
|
DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
|
|
|
|
# Only generate this target if no higher-level project already has
|
|
if (NOT TARGET uninstall)
|
|
configure_file(cmake_uninstall.cmake.in
|
|
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
|
|
|
add_custom_target(uninstall
|
|
"${CMAKE_COMMAND}" -P
|
|
"${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
|
|
endif()
|
|
endif()
|
|
|