mirror of
https://github.com/glfw/glfw.git
synced 2025-06-16 04:32:14 +00:00
Enable compile-time support for multiple platforms and runtime detection of them. Most platform functions (but not all) 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 backends are now chosen via CMake dependent options following the GLFW_BUILD_<platform> pattern instead of a mix of automagic and ad-hoc option names. There is no option for the Null backend as it is always enabled. Much of the struct stitching work in platform.h was based on an earlier experimental branch for runtime platform selection by @ronchaine. NOTE: This is not its final form. - The detection logic for X11 and Wayland is still placeholder. - There is no guide documentation. - The new functions have not been reviewed for thread safety. - The changelog entries are incomplete. - The automatic platform selection logic in CMake is unchanged from 3.3 so by default non-macOS Unices will not include support for Wayland. - There are potentially more aspects of this change that can be extracted into separate commits. - The joystick implementation selection on non-macOS Unices is kludgy. - Probably more things. Related to #1655.
176 lines
5.9 KiB
CMake
176 lines
5.9 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)
|
|
|
|
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" OFF "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()
|
|
|