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
148
elseif (APPLE)
    set(_GLFW_COCOA 1)
    message(STATUS "Using Cocoa for window creation")
elseif (UNIX)
Camilla Berglund's avatar
Camilla Berglund committed
149
150
    set(_GLFW_X11 1)
    message(STATUS "Using X11 for window creation")
151
152
153
else()
    message(FATAL_ERROR "No supported platform was detected")
endif()
Camilla Berglund's avatar
Camilla Berglund committed
154

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

    if (CMAKE_DL_LIBS)
        list(APPEND glfw_LIBRARIES "${CMAKE_DL_LIBS}")
        list(APPEND glfw_PKG_LIBS "-l${CMAKE_DL_LIBS}")
    endif()
177
178
endif()

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

184
    list(APPEND glfw_PKG_LIBS "-lgdi32")
185

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

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

196
197
    find_package(X11 REQUIRED)

198
    list(APPEND glfw_PKG_DEPS "x11")
Camilla Berglund's avatar
Camilla Berglund committed
199

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

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

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

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

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

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

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

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

243
    find_package(Wayland REQUIRED Client Cursor Egl)
244
    find_package(WaylandScanner REQUIRED)
245
    find_package(WaylandProtocols 1.15 REQUIRED)
246

247
    list(APPEND glfw_PKG_DEPS "wayland-egl")
248

249
    list(APPEND glfw_INCLUDE_DIRS "${Wayland_INCLUDE_DIRS}")
250
    list(APPEND glfw_LIBRARIES "${Wayland_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
251

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

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

    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()
267
268
endif()

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

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

282
283
284
    list(APPEND glfw_LIBRARIES
        "-framework Cocoa"
        "-framework IOKit"
285
        "-framework CoreFoundation")
286

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

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

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

308
#--------------------------------------------------------------------
309
# Create generated files
310
#--------------------------------------------------------------------
311
312
include(CMakePackageConfigHelpers)

313
set(GLFW_CONFIG_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3")
314

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

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

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

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

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

if (GLFW_BUILD_EXAMPLES)
    add_subdirectory(examples)
endif()

if (GLFW_BUILD_TESTS)
    add_subdirectory(tests)
endif()

341
if (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)
342
343
344
    add_subdirectory(docs)
endif()

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

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

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

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

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