mirror of
https://github.com/glfw/glfw.git
synced 2024-11-10 00:51:47 +00:00
56a4cb0a3a
This adds compile-time support for multiple platforms and runtime detection of them. Window system related platform functions are now called from shared code via the function pointer struct _GLFWplatform. The timer, thread and module loading platform functions are still called directly by name and the implementation chosen at link-time. These functions are the same for any backend on a given OS, including the Null backend. The platforms are now enabled via CMake dependent options following the GLFW_BUILD_<platform> pattern instead of a mix of automagic and ad-hoc option names. There is no longer any option for the Null backend as it is now always enabled. Much of the struct stitching work in platform.h was based on an earlier experimental branch for runtime platform selection by @ronchaine. Every platform function related to windows, contexts, monitors, input, event processing and Vulkan have been renamed so that multiple sets of them can exist without colliding. Calls to these are now routed through the _glfw.platform struct member. These changes makes up most of this commit. For Wayland and X11 the client library loading and display creation is used to detect a running compositor/server. The XDG_SESSION_TYPE environment variable is ignored for now, as X11 is still by far the more complete implementation. Closes #1655 Closes #1958
181 lines
6.1 KiB
CMake
181 lines
6.1 KiB
CMake
cmake_minimum_required(VERSION 3.4...3.20 FATAL_ERROR)
|
|
|
|
project(GLFW VERSION 3.4.0 LANGUAGES C)
|
|
|
|
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
|
|
|
|
if (POLICY CMP0054)
|
|
cmake_policy(SET CMP0054 NEW)
|
|
endif()
|
|
|
|
if (POLICY CMP0069)
|
|
cmake_policy(SET CMP0069 NEW)
|
|
endif()
|
|
|
|
if (POLICY CMP0077)
|
|
cmake_policy(SET CMP0077 NEW)
|
|
endif()
|
|
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
set(GLFW_STANDALONE TRUE)
|
|
endif()
|
|
|
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
|
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ${GLFW_STANDALONE})
|
|
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ${GLFW_STANDALONE})
|
|
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
|
|
option(GLFW_INSTALL "Generate installation target" ON)
|
|
option(GLFW_VULKAN_STATIC "Assume the Vulkan loader is linked with the application" OFF)
|
|
|
|
include(GNUInstallDirs)
|
|
include(CMakeDependentOption)
|
|
|
|
if (GLFW_USE_OSMESA)
|
|
message(FATAL_ERROR "GLFW_USE_OSMESA has been removed; set the GLFW_PLATFORM init hint")
|
|
endif()
|
|
|
|
cmake_dependent_option(GLFW_BUILD_WIN32 "Build support for Win32" ON "WIN32" OFF)
|
|
cmake_dependent_option(GLFW_BUILD_COCOA "Build support for Cocoa" ON "APPLE" OFF)
|
|
cmake_dependent_option(GLFW_BUILD_X11 "Build support for X11" ON "UNIX;NOT APPLE" OFF)
|
|
cmake_dependent_option(GLFW_BUILD_WAYLAND "Build support for Wayland"
|
|
"${GLFW_USE_WAYLAND}" "UNIX;NOT APPLE" OFF)
|
|
|
|
cmake_dependent_option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF
|
|
"WIN32" OFF)
|
|
cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON
|
|
"MSVC" OFF)
|
|
|
|
set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING
|
|
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
|
|
|
if (GLFW_LIBRARY_TYPE)
|
|
if (GLFW_LIBRARY_TYPE STREQUAL "SHARED")
|
|
set(GLFW_BUILD_SHARED_LIBRARY TRUE)
|
|
else()
|
|
set(GLFW_BUILD_SHARED_LIBRARY FALSE)
|
|
endif()
|
|
else()
|
|
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
|
endif()
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
if (GLFW_BUILD_DOCS)
|
|
set(DOXYGEN_SKIP_DOT TRUE)
|
|
find_package(Doxygen)
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Report backend selection
|
|
#--------------------------------------------------------------------
|
|
if (GLFW_BUILD_WIN32)
|
|
message(STATUS "Including Win32 support")
|
|
endif()
|
|
if (GLFW_BUILD_COCOA)
|
|
message(STATUS "Including Cocoa support")
|
|
endif()
|
|
if (GLFW_BUILD_WAYLAND)
|
|
message(STATUS "Including Wayland support")
|
|
endif()
|
|
if (GLFW_BUILD_X11)
|
|
message(STATUS "Including X11 support")
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Apply Microsoft C runtime library option
|
|
# This is here because it also applies to tests and examples
|
|
#--------------------------------------------------------------------
|
|
if (MSVC AND NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
|
if (CMAKE_VERSION VERSION_LESS 3.15)
|
|
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()
|
|
else()
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
endif()
|
|
endif()
|
|
|
|
#--------------------------------------------------------------------
|
|
# Create generated files
|
|
#--------------------------------------------------------------------
|
|
include(CMakePackageConfigHelpers)
|
|
|
|
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
|
|
|
|
configure_package_config_file(CMake/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}
|
|
COMPATIBILITY SameMajorVersion)
|
|
|
|
#--------------------------------------------------------------------
|
|
# 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 ${CMAKE_INSTALL_INCLUDEDIR}
|
|
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 "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
|
|
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
|
|
install(DIRECTORY "${GLFW_BINARY_DIR}/docs/html"
|
|
DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
|
endif()
|
|
|
|
# Only generate this target if no higher-level project already has
|
|
if (NOT TARGET uninstall)
|
|
configure_file(CMake/cmake_uninstall.cmake.in
|
|
cmake_uninstall.cmake IMMEDIATE @ONLY)
|
|
|
|
add_custom_target(uninstall
|
|
"${CMAKE_COMMAND}" -P
|
|
"${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
|
|
set_target_properties(uninstall PROPERTIES FOLDER "GLFW3")
|
|
endif()
|
|
endif()
|
|
|