CMakeLists.txt 12.9 KB
Newer Older
1
cmake_minimum_required(VERSION 3.0)
2

Camilla Löwy's avatar
Camilla Löwy committed
3
project(GLFW VERSION 3.3.2 LANGUAGES C)
Camilla Berglund's avatar
Camilla Berglund committed
4

5
set(CMAKE_LEGACY_CYGWIN_WIN32 OFF)
Camilla Berglund's avatar
Camilla Berglund committed
6

7
if (POLICY CMP0054)
Camilla Löwy's avatar
Camilla Löwy committed
8
9
10
    cmake_policy(SET CMP0054 NEW)
endif()

11
12
13
14
if (POLICY CMP0077)
    cmake_policy(SET CMP0077 NEW)
endif()

15
16
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

Camilla Berglund's avatar
Camilla Berglund committed
17
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
18
19
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
20
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
21
option(GLFW_INSTALL "Generate installation target" ON)
22
option(GLFW_VULKAN_STATIC "Assume the Vulkan loader is linked with the application" OFF)
Camilla Berglund's avatar
Camilla Berglund committed
23

24
include(GNUInstallDirs)
25
26
27
28
29
30
31
32
33
34
include(CMakeDependentOption)

cmake_dependent_option(GLFW_USE_OSMESA "Use OSMesa for offscreen context creation" OFF
                       "UNIX" OFF)
cmake_dependent_option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on hybrid systems" OFF
                       "WIN32" OFF)
cmake_dependent_option(GLFW_USE_WAYLAND "Use Wayland for window creation" OFF
                       "UNIX;NOT APPLE" OFF)
cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON
                       "MSVC" OFF)
Camilla Berglund's avatar
Camilla Berglund committed
35
36
37
38
39

if (BUILD_SHARED_LIBS)
    set(_GLFW_BUILD_DLL 1)
endif()

40
41
42
43
44
45
46
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()

Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
47
if (GLFW_VULKAN_STATIC)
48
49
50
51
52
    if (BUILD_SHARED_LIBS)
        # If you absolutely must do this, remove this line and add the Vulkan
        # loader static library via the CMAKE_SHARED_LINKER_FLAGS
        message(FATAL_ERROR "You are trying to link the Vulkan loader static library into the GLFW shared library")
    endif()
Camilla Berglund's avatar
Cleanup    
Camilla Berglund committed
53
54
55
    set(_GLFW_VULKAN_STATIC 1)
endif()

56
list(APPEND CMAKE_MODULE_PATH "${GLFW_SOURCE_DIR}/CMake/modules")
Camilla Berglund's avatar
Camilla Berglund committed
57

58
59
find_package(Threads REQUIRED)

60
61
62
if (GLFW_BUILD_DOCS)
    set(DOXYGEN_SKIP_DOT TRUE)
    find_package(Doxygen)
Camilla Berglund's avatar
Camilla Berglund committed
63
64
endif()

Camilla Berglund's avatar
Camilla Berglund committed
65
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
66
# Set compiler specific flags
Camilla Berglund's avatar
Camilla Berglund committed
67
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
68
if (MSVC)
Camilla Löwy's avatar
Camilla Löwy committed
69
70
71
72
73
    if (MSVC90)
        # Workaround for VS 2008 not shipping with the DirectX 9 SDK
        include(CheckIncludeFile)
        check_include_file(dinput.h DINPUT_H_FOUND)
        if (NOT DINPUT_H_FOUND)
74
            message(FATAL_ERROR "DirectX 9 headers not found; install DirectX 9 SDK")
Camilla Löwy's avatar
Camilla Löwy committed
75
76
77
78
79
        endif()
        # Workaround for VS 2008 not shipping with stdint.h
        list(APPEND glfw_INCLUDE_DIRS "${GLFW_SOURCE_DIR}/deps/vs2008")
    endif()

Camilla Berglund's avatar
Camilla Berglund committed
80
81
    if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
        foreach (flag CMAKE_C_FLAGS
Camilla Berglund's avatar
Camilla Berglund committed
82
83
84
85
                      CMAKE_C_FLAGS_DEBUG
                      CMAKE_C_FLAGS_RELEASE
                      CMAKE_C_FLAGS_MINSIZEREL
                      CMAKE_C_FLAGS_RELWITHDEBINFO)
Camilla Berglund's avatar
Camilla Berglund committed
86
87
88
89
90
91
92
93
94
95

            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()
96
97
endif()

98
if (MINGW)
99
100
101
102
103
104
105
106
107
    # 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()

108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    # 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()

Camilla Berglund's avatar
Camilla Berglund committed
133
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
134
# Detect and select backend APIs
Camilla Berglund's avatar
Camilla Berglund committed
135
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
136
137
138
139
140
141
142
if (GLFW_USE_WAYLAND)
    set(_GLFW_WAYLAND 1)
    message(STATUS "Using Wayland for window creation")
elseif (GLFW_USE_OSMESA)
    set(_GLFW_OSMESA 1)
    message(STATUS "Using OSMesa for headless context creation")
elseif (WIN32)
143
    set(_GLFW_WIN32 1)
144
    message(STATUS "Using Win32 for window creation")
145
146
147
elseif (APPLE)
    set(_GLFW_COCOA 1)
    message(STATUS "Using Cocoa for window creation")
148
149
    set(VK_USE_PLATFORM_METAL_EXT 1)
    message(STATUS "Using VK_EXT_metal_surface")
150
elseif (UNIX)
Camilla Berglund's avatar
Camilla Berglund committed
151
152
    set(_GLFW_X11 1)
    message(STATUS "Using X11 for window creation")
153
154
155
else()
    message(FATAL_ERROR "No supported platform was detected")
endif()
Camilla Berglund's avatar
Camilla Berglund committed
156

157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#--------------------------------------------------------------------
# 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()
174
175
176
177
178

    if (CMAKE_DL_LIBS)
        list(APPEND glfw_LIBRARIES "${CMAKE_DL_LIBS}")
        list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
    endif()
179
180
endif()

181
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
182
# Use Win32 for window creation
183
#--------------------------------------------------------------------
184
if (_GLFW_WIN32)
185

186
    list(APPEND glfw_PKG_LIBS "-lgdi32")
187

188
189
    if (GLFW_USE_HYBRID_HPG)
        set(_GLFW_USE_HYBRID_HPG 1)
Camilla Berglund's avatar
Camilla Berglund committed
190
    endif()
Camilla Berglund's avatar
Camilla Berglund committed
191
endif()
Camilla Berglund's avatar
Camilla Berglund committed
192

Camilla Berglund's avatar
Camilla Berglund committed
193
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
194
# Use X11 for window creation
Camilla Berglund's avatar
Camilla Berglund committed
195
#--------------------------------------------------------------------
196
if (_GLFW_X11)
197

198
199
    find_package(X11 REQUIRED)

200
    list(APPEND glfw_PKG_DEPS "x11")
Camilla Berglund's avatar
Camilla Berglund committed
201

202
    # Set up library and include paths
203
204
    list(APPEND glfw_INCLUDE_DIRS "${X11_X11_INCLUDE_PATH}")
    list(APPEND glfw_LIBRARIES "${X11_X11_LIB}" "${CMAKE_THREAD_LIBS_INIT}")
205

206
    # Check for XRandR (modern resolution switching and gamma control)
207
    if (NOT X11_Xrandr_INCLUDE_PATH)
208
        message(FATAL_ERROR "RandR headers not found; install libxrandr development package")
209
    endif()
Camilla Berglund's avatar
Camilla Berglund committed
210

211
    # Check for Xinerama (legacy multi-monitor support)
212
    if (NOT X11_Xinerama_INCLUDE_PATH)
213
        message(FATAL_ERROR "Xinerama headers not found; install libxinerama development package")
214
215
    endif()

216
    # Check for Xkb (X keyboard extension)
217
    if (NOT X11_Xkb_INCLUDE_PATH)
218
        message(FATAL_ERROR "XKB headers not found; install X11 development package")
219
    endif()
220

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
221
    # Check for Xcursor (cursor creation from RGBA images)
222
    if (NOT X11_Xcursor_INCLUDE_PATH)
223
        message(FATAL_ERROR "Xcursor headers not found; install libxcursor development package")
224
225
    endif()

226
    # Check for XInput (modern HID input)
227
    if (NOT X11_Xi_INCLUDE_PATH)
228
        message(FATAL_ERROR "XInput headers not found; install libxi development package")
229
230
    endif()

Camilla Löwy's avatar
Cleanup    
Camilla Löwy committed
231
232
233
    list(APPEND glfw_INCLUDE_DIRS "${X11_Xrandr_INCLUDE_PATH}"
                                  "${X11_Xinerama_INCLUDE_PATH}"
                                  "${X11_Xkb_INCLUDE_PATH}"
234
                                  "${X11_Xcursor_INCLUDE_PATH}"
235
                                  "${X11_Xi_INCLUDE_PATH}")
236
237
endif()

238
239
240
241
#--------------------------------------------------------------------
# Use Wayland for window creation
#--------------------------------------------------------------------
if (_GLFW_WAYLAND)
242
    find_package(ECM REQUIRED NO_MODULE)
243
    list(APPEND CMAKE_MODULE_PATH "${ECM_MODULE_PATH}")
244

245
    find_package(Wayland REQUIRED Client Cursor Egl)
246
    find_package(WaylandScanner REQUIRED)
247
    find_package(WaylandProtocols 1.15 REQUIRED)
248

249
    list(APPEND glfw_PKG_DEPS "wayland-egl")
250

251
    list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIRS}")
252
    list(APPEND glfw_LIBRARIES "${Wayland_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
253

Jonas Ådahl's avatar
Jonas Ådahl committed
254
    find_package(XKBCommon REQUIRED)
255
    list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
256
257

    include(CheckIncludeFiles)
258
    include(CheckFunctionExists)
259
    check_include_files(xkbcommon/xkbcommon-compose.h HAVE_XKBCOMMON_COMPOSE_H)
260
    check_function_exists(memfd_create HAVE_MEMFD_CREATE)
261
262
263
264
265
266
267
268

    if (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux"))
        find_package(EpollShim)
        if (EPOLLSHIM_FOUND)
            list(APPEND glfw_INCLUDE_DIRS "${EPOLLSHIM_INCLUDE_DIRS}")
            list(APPEND glfw_LIBRARIES "${EPOLLSHIM_LIBRARIES}")
        endif()
    endif()
269
270
endif()

Jason Daly's avatar
Jason Daly committed
271
272
273
274
#--------------------------------------------------------------------
# Use OSMesa for offscreen context creation
#--------------------------------------------------------------------
if (_GLFW_OSMESA)
Camilla Berglund's avatar
Camilla Berglund committed
275
276
    find_package(OSMesa REQUIRED)
    list(APPEND glfw_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}")
Jason Daly's avatar
Jason Daly committed
277
278
endif()

Camilla Berglund's avatar
Camilla Berglund committed
279
#--------------------------------------------------------------------
280
# Use Cocoa for window creation and NSOpenGL for context creation
Camilla Berglund's avatar
Camilla Berglund committed
281
#--------------------------------------------------------------------
282
if (_GLFW_COCOA)
283

284
285
286
    list(APPEND glfw_LIBRARIES
        "-framework Cocoa"
        "-framework IOKit"
287
        "-framework CoreFoundation")
288

289
    set(glfw_PKG_DEPS "")
290
    set(glfw_PKG_LIBS "-framework Cocoa -framework IOKit -framework CoreFoundation")
Camilla Berglund's avatar
Camilla Berglund committed
291
endif()
Camilla Berglund's avatar
Camilla Berglund committed
292

293
294
295
296
297
298
299
#--------------------------------------------------------------------
# Add the Vulkan loader as a dependency if necessary
#--------------------------------------------------------------------
if (GLFW_VULKAN_STATIC)
    list(APPEND glfw_PKG_DEPS "vulkan")
endif()

300
301
302
#--------------------------------------------------------------------
# Export GLFW library dependencies
#--------------------------------------------------------------------
303
304
305
306
307
308
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()
309

310
#--------------------------------------------------------------------
311
# Create generated files
312
#--------------------------------------------------------------------
313
314
include(CMakePackageConfigHelpers)

315
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
316

317
318
configure_package_config_file(src/glfw3Config.cmake.in
                              src/glfw3Config.cmake
319
320
321
                              INSTALL_DESTINATION "${GLFW_CONFIG_PATH}"
                              NO_CHECK_REQUIRED_COMPONENTS_MACRO)

322
write_basic_package_version_file(src/glfw3ConfigVersion.cmake
323
                                 VERSION ${GLFW_VERSION}
324
325
                                 COMPATIBILITY SameMajorVersion)

326
configure_file(src/glfw_config.h.in src/glfw_config.h @ONLY)
Camilla Berglund's avatar
Camilla Berglund committed
327

328
configure_file(src/glfw3.pc.in src/glfw3.pc @ONLY)
Lambert Clara's avatar
Lambert Clara committed
329

330
331
332
333
334
335
336
337
338
339
340
341
342
#--------------------------------------------------------------------
# Add subdirectories
#--------------------------------------------------------------------
add_subdirectory(src)

if (GLFW_BUILD_EXAMPLES)
    add_subdirectory(examples)
endif()

if (GLFW_BUILD_TESTS)
    add_subdirectory(tests)
endif()

343
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
344
345
346
    add_subdirectory(docs)
endif()

Camilla Berglund's avatar
Camilla Berglund committed
347
#--------------------------------------------------------------------
Camilla Berglund's avatar
Camilla Berglund committed
348
# Install files other than the library
349
# The library is installed by src/CMakeLists.txt
Camilla Berglund's avatar
Camilla Berglund committed
350
#--------------------------------------------------------------------
351
if (GLFW_INSTALL)
352
    install(DIRECTORY include/GLFW DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
353
            FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)
354

355
356
    install(FILES "${GLFW_BINARY_DIR}/src/glfw3Config.cmake"
                  "${GLFW_BINARY_DIR}/src/glfw3ConfigVersion.cmake"
357
            DESTINATION "${GLFW_CONFIG_PATH}")
358

359
    install(EXPORT glfwTargets FILE glfw3Targets.cmake
360
            EXPORT_LINK_INTERFACE_LIBRARIES
361
            DESTINATION "${GLFW_CONFIG_PATH}")
362
    install(FILES "${GLFW_BINARY_DIR}/src/glfw3.pc"
363
            DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
Camilla Berglund's avatar
Camilla Berglund committed
364

Camilla Berglund's avatar
Camilla Berglund committed
365
366
    # Only generate this target if no higher-level project already has
    if (NOT TARGET uninstall)
367
368
        configure_file(cmake_uninstall.cmake.in
                       cmake_uninstall.cmake IMMEDIATE @ONLY)
Camilla Berglund's avatar
Camilla Berglund committed
369

Camilla Berglund's avatar
Camilla Berglund committed
370
        add_custom_target(uninstall
371
372
                          "${CMAKE_COMMAND}" -P
                          "${GLFW_BINARY_DIR}/cmake_uninstall.cmake")
373
        set_target_properties(uninstall PROPERTIES FOLDER "GLFW3")
Camilla Berglund's avatar
Camilla Berglund committed
374
    endif()
375
endif()
Camilla Berglund's avatar
Camilla Berglund committed
376