]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMakeLists.txt
Fix OpenGL3 driver to compile standalone
[irrlicht.git] / source / Irrlicht / CMakeLists.txt
1 option(BUILD_SHARED_LIBS "Build shared library" TRUE)
2 option(USE_SDL2 "Use the SDL2 backend" FALSE)
3
4 # Compiler flags
5
6 add_definitions(-DIRRLICHT_EXPORTS)
7 if(BUILD_SHARED_LIBS)
8         if(WIN32)
9                 set(API_IMPORT "__declspec(dllimport)")
10                 set(API_EXPORT "__declspec(dllexport)")
11         elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
12                 set(API_EXPORT "__attribute__ ((visibility(\"default\")))") # only necessary if default visibility is set to hidden
13         endif()
14 else()
15         add_definitions(-D_IRR_STATIC_LIB_)
16 endif()
17 add_definitions("-DIRRLICHT_API=${API_EXPORT}")
18
19 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
20         add_definitions(-D_DEBUG)
21 endif()
22 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
23 set(CMAKE_CXX_STANDARD 11)
24 set(CMAKE_CXX_STANDARD_REQUIRED ON)
25
26 if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
27         set(CMAKE_CXX_FLAGS_RELEASE "-O3")
28         set(CMAKE_CXX_FLAGS_DEBUG "-g")
29
30         add_compile_options(-Wall -pipe -fno-exceptions -fno-rtti)
31
32         # Enable SSE for floating point math on 32-bit x86 by default
33         # reasoning see minetest issue #11810 and https://gcc.gnu.org/wiki/FloatingPointMath
34         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
35                 include(CheckCXXSourceCompiles)
36                 check_cxx_source_compiles("#ifndef __i686__\n#error\n#endif\nint main(){}" IS_I686)
37                 if(IS_I686)
38                         message(STATUS "Detected Intel x86: using SSE instead of x87 FPU")
39                         add_compile_options(-mfpmath=sse -msse)
40                 endif()
41         endif()
42
43 elseif(MSVC)
44         string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " msvcrt.lib") # ???? fuck off
45
46         add_compile_options(/GR- /Zl)
47
48         # Enable SSE for floating point math on 32-bit x86 by default
49         # reasoning see minetest issue #11810 and https://gcc.gnu.org/wiki/FloatingPointMath
50         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
51                 add_compile_options(/arch:SSE)
52         endif()
53 endif()
54
55 # Sanity-check version
56
57 include(CheckCXXSourceCompiles)
58 set(CMAKE_REQUIRED_INCLUDES ${PROJECT_SOURCE_DIR}/include)
59 unset(REVISION_SANITY_CHECK CACHE)
60 check_cxx_source_compiles("#include <IrrCompileConfig.h>\n\
61 #if IRRLICHT_VERSION_MT_REVISION != ${IRRLICHTMT_REVISION}\n\
62 #error\n\
63 #endif\n\
64 int main() {}" REVISION_SANITY_CHECK)
65 if(NOT REVISION_SANITY_CHECK)
66         message(FATAL_ERROR "IrrlichtMt revision number mismatches between CMake and headers.")
67 endif()
68
69 # Platform-independent configuration (hard-coded currently)
70 add_definitions(
71         -DIRR_ENABLE_BUILTIN_FONT
72         -D_IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
73 )
74
75 # Platform-specific configuration
76
77 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
78         set(SOLARIS TRUE)
79 endif()
80
81 # Device
82
83 if(WIN32)
84         add_definitions(-D_IRR_WINDOWS_ -D_IRR_WINDOWS_API_)
85         set(DEVICE "WINDOWS")
86 elseif(APPLE)
87         add_definitions(-D_IRR_OSX_PLATFORM_)
88         set(DEVICE "OSX")
89 elseif(ANDROID)
90         add_definitions(-D_IRR_ANDROID_PLATFORM_ -D_IRR_COMPILE_ANDROID_ASSET_READER_)
91         if(USE_SDL2)
92                 message(FATAL_ERROR "SDL2 device is not (yet) supported on Android")
93         endif()
94         set(DEVICE "Android")
95 elseif(EMSCRIPTEN)
96         add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_ -D_IRR_COMPILE_WITH_EGL_MANAGER_)
97         set(LINUX_PLATFORM TRUE)
98         set(DEVICE "SDL")
99 elseif(SOLARIS)
100         add_definitions(-D_IRR_SOLARIS_PLATFORM_ -D_IRR_POSIX_API_)
101         set(DEVICE "X11")
102 else()
103         add_definitions(-D_IRR_POSIX_API_)
104         set(LINUX_PLATFORM TRUE)
105         set(DEVICE "X11")
106 endif()
107
108 if(LINUX_PLATFORM)
109         add_definitions(-D_IRR_LINUX_PLATFORM_)
110 endif()
111
112 if(USE_SDL2)
113         set(DEVICE "SDL")
114 elseif(DEVICE STREQUAL "SDL")
115         message(FATAL_ERROR "SDL was used but not enabled?!")
116 endif()
117
118 add_definitions("-D_IRR_COMPILE_WITH_${DEVICE}_DEVICE_")
119
120 # X11
121
122 if(DEVICE STREQUAL "X11")
123         option(USE_X11 "Use X11" TRUE)
124 else()
125         set(USE_X11 FALSE)
126 endif()
127
128 if(LINUX_PLATFORM AND USE_X11)
129         option(USE_XINPUT2 "Use XInput2" TRUE)
130         option(USE_XCURSOR "Use XCursor" FALSE)
131 else()
132         set(USE_XINPUT2 FALSE)
133         set(USE_XCURSOR FALSE)
134 endif()
135
136 # Joystick
137
138 if(NOT (BSD OR SOLARIS OR EMSCRIPTEN))
139         add_definitions(-D_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
140 endif()
141
142 # OpenGL
143
144 option(ENABLE_OPENGL3 "Enable OpenGL 3+" FALSE)
145
146 if(ANDROID OR EMSCRIPTEN)
147         set(ENABLE_OPENGL FALSE)
148 else()
149         option(ENABLE_OPENGL "Enable OpenGL" TRUE)
150 endif()
151
152 if(EMSCRIPTEN OR APPLE)
153         set(ENABLE_GLES1 FALSE)
154 else()
155         if(ANDROID)
156                 set(DEFAULT_GLES1 TRUE)
157         endif()
158         option(ENABLE_GLES1 "Enable OpenGL ES" ${DEFAULT_GLES1})
159 endif()
160
161 if(APPLE)
162         set(ENABLE_GLES2 FALSE)
163         set(ENABLE_WEBGL1 FALSE)
164 else()
165         if(ANDROID OR EMSCRIPTEN)
166                 set(DEFAULT_GLES2 TRUE)
167         endif()
168         if(EMSCRIPTEN)
169                 set(DEFAULT_WEBGL1 TRUE)
170         endif()
171         option(ENABLE_GLES2 "Enable OpenGL ES 2+" ${DEFAULT_GLES2})
172         option(ENABLE_WEBGL1 "Enable WebGL (requires GLES2)" ${DEFAULT_WEBGL1})
173         if(ENABLE_WEBGL1)
174                 set(ENABLE_GLES2 TRUE)
175         endif()
176 endif()
177
178 if(ENABLE_OPENGL)
179         add_definitions(-D_IRR_COMPILE_WITH_OPENGL_)
180         if(DEVICE STREQUAL "WINDOWS")
181                 add_definitions(-D_IRR_COMPILE_WITH_WGL_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
182         elseif(DEVICE STREQUAL "X11")
183                 add_definitions(-D_IRR_COMPILE_WITH_GLX_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
184         elseif(DEVICE STREQUAL "OSX")
185                 add_definitions(-D_IRR_COMPILE_WITH_NSOGL_MANAGER_)
186         elseif(DEVICE STREQUAL "SDL")
187                 add_definitions(-D_IRR_OPENGL_USE_EXTPOINTER_)
188         endif()
189 endif()
190
191 if(ENABLE_OPENGL3)
192         if (NOT USE_SDL2)
193                 message(FATAL_ERROR "OpenGL 3 driver requires SDL2")
194         endif()
195         set(USE_SDLGL ON)
196         set(USE_SDLGL3 ON)
197 endif()
198
199 if(ENABLE_GLES1)
200         if (USE_SDL2)
201                 message(FATAL_ERROR "OpenGL ES 1 is not supported with SDL2")
202         endif()
203         add_definitions(-D_IRR_COMPILE_WITH_OGLES1_)
204         if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$")
205                 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES1_USE_EXTPOINTER_)
206         endif()
207 endif()
208
209 if(ENABLE_GLES2)
210         add_definitions(-D_IRR_COMPILE_WITH_OGLES2_)
211         if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$" OR EMSCRIPTEN)
212                 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES2_USE_EXTPOINTER_)
213         elseif(DEVICE STREQUAL "SDL")
214                 set(USE_SDLGL ON)
215                 set(USE_SDLGLES2 ON)
216         endif()
217 endif()
218
219 if(ENABLE_WEBGL1)
220         add_definitions(-D_IRR_COMPILE_WITH_WEBGL1_)
221 endif()
222
223 # Misc
224
225 include(TestBigEndian)
226 TEST_BIG_ENDIAN(BIG_ENDIAN)
227 if(BIG_ENDIAN)
228         add_definitions(-D__BIG_ENDIAN__)
229 endif()
230
231 # Configuration report
232
233 message(STATUS "Device: ${DEVICE}")
234 message(STATUS "OpenGL: ${ENABLE_OPENGL}")
235 message(STATUS "OpenGL 3: ${ENABLE_OPENGL3}")
236 message(STATUS "OpenGL ES: ${ENABLE_GLES1}")
237 if (USE_SDLGLES2)
238         message(STATUS "OpenGL ES 2: ON (unified)")
239 elseif (ENABLE_GLES2)
240         message(STATUS "OpenGL ES 2: ON (legacy)")
241 else()
242         message(STATUS "OpenGL ES 2: OFF")
243 endif()
244 message(STATUS "WebGL: ${ENABLE_WEBGL1}")
245
246 # Required libs
247
248 find_package(ZLIB REQUIRED)
249 find_package(JPEG REQUIRED)
250 find_package(PNG REQUIRED)
251
252
253 if(ENABLE_GLES1)
254         # only tested on Android, probably works on Linux (is this needed anywhere else?)
255         find_library(OPENGLES_LIBRARY NAMES GLESv1_CM REQUIRED)
256         find_library(EGL_LIBRARY NAMES EGL REQUIRED)
257
258         message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
259 endif()
260 if(ENABLE_GLES2)
261         find_package(OpenGLES2 REQUIRED)
262 endif()
263 if(ENABLE_OPENGL OR ENABLE_OPENGL3)
264         set(OpenGL_GL_PREFERENCE "LEGACY")
265         find_package(OpenGL REQUIRED)
266 endif()
267 if(USE_SDL2)
268         find_package(SDL2 CONFIG REQUIRED)
269         message(STATUS "Found SDL2: ${SDL2_LIBRARIES}")
270 endif()
271
272 # Platform-specific libs
273
274 if(ANDROID)
275         enable_language(C)
276         add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
277 elseif(APPLE)
278         find_library(COCOA_LIB Cocoa REQUIRED)
279         find_library(IOKIT_LIB IOKit REQUIRED)
280
281         add_definitions(-DGL_SILENCE_DEPRECATION)
282 elseif(NOT USE_SDL2)
283         # Unix probably
284         find_package(X11 REQUIRED)
285         if(USE_XINPUT2 AND NOT X11_Xi_FOUND)
286                 message(FATAL_ERROR "XInput not found")
287         endif()
288 endif()
289
290 set(link_includes
291         "${PROJECT_SOURCE_DIR}/include"
292         "${CMAKE_CURRENT_SOURCE_DIR}"
293
294         "${ZLIB_INCLUDE_DIR}"
295         "${JPEG_INCLUDE_DIR}"
296         "${PNG_INCLUDE_DIR}"
297         "$<$<BOOL:${USE_SDL2}>:${SDL2_INCLUDE_DIRS}>"
298
299         ${OPENGL_INCLUDE_DIR}
300         ${OPENGLES2_INCLUDE_DIR}
301         ${EGL_INCLUDE_DIR}
302
303         "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
304         "$<$<BOOL:${USE_X11}>:${X11_INCLUDE_DIR}>"
305 )
306
307 set(link_libs
308         "${ZLIB_LIBRARY}"
309         "${JPEG_LIBRARY}"
310         "${PNG_LIBRARY}"
311         "$<$<BOOL:USE_SDL2>:${SDL2_LIBRARIES}>"
312
313         ${OPENGL_LIBRARIES}
314         ${OPENGLES_LIBRARY}
315         ${OPENGLES2_LIBRARIES}
316         ${EGL_LIBRARY}
317
318         "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
319         ${COCOA_LIB}
320         ${IOKIT_LIB}
321         "$<$<PLATFORM_ID:Windows>:gdi32>"
322         "$<$<PLATFORM_ID:Windows>:winmm>"
323         "$<$<BOOL:${USE_X11}>:${X11_X11_LIB}>"
324         "$<$<BOOL:${USE_X11}>:${X11_Xi_LIB}>"
325 )
326
327 # Source files
328
329 set(IRRMESHLOADER
330         CB3DMeshFileLoader.cpp
331         COBJMeshFileLoader.cpp
332         CXMeshFileLoader.cpp
333 )
334
335 add_library(IRRMESHOBJ OBJECT
336         CSkinnedMesh.cpp
337         CBoneSceneNode.cpp
338         CMeshSceneNode.cpp
339         CAnimatedMeshSceneNode.cpp
340         ${IRRMESHLOADER}
341 )
342
343 add_library(IRROBJ OBJECT
344         CBillboardSceneNode.cpp
345         CCameraSceneNode.cpp
346         CDummyTransformationSceneNode.cpp
347         CEmptySceneNode.cpp
348         CMeshManipulator.cpp
349         CSceneCollisionManager.cpp
350         CSceneManager.cpp
351         CMeshCache.cpp
352 )
353
354 set(IRRDRVROBJ
355         CNullDriver.cpp
356         COpenGLCacheHandler.cpp
357         COpenGLDriver.cpp
358         COpenGLShaderMaterialRenderer.cpp
359         COpenGLSLMaterialRenderer.cpp
360         COpenGLExtensionHandler.cpp
361         COGLESDriver.cpp
362         COGLESExtensionHandler.cpp
363         CGLXManager.cpp
364         CWGLManager.cpp
365         CEGLManager.cpp
366         CSDLManager.cpp
367         mt_opengl_loader.cpp
368 )
369
370 set(IRRIMAGEOBJ
371         CColorConverter.cpp
372         CImage.cpp
373         CImageLoaderBMP.cpp
374         CImageLoaderJPG.cpp
375         CImageLoaderPNG.cpp
376         CImageLoaderTGA.cpp
377         CImageWriterJPG.cpp
378         CImageWriterPNG.cpp
379 )
380
381 add_library(IRRVIDEOOBJ OBJECT
382         CFPSCounter.cpp
383         ${IRRDRVROBJ}
384         ${IRRIMAGEOBJ}
385 )
386
387 if(USE_SDLGL)
388         target_sources(IRRVIDEOOBJ PRIVATE
389                 OpenGL/Driver.cpp
390                 OpenGL/ExtensionHandler.cpp
391                 OpenGL/FixedPipelineRenderer.cpp
392                 OpenGL/MaterialRenderer.cpp
393                 OpenGL/Renderer2D.cpp
394         )
395 endif()
396
397 if(USE_SDLGL3)
398         target_sources(IRRVIDEOOBJ PRIVATE
399                 OpenGL3/Driver.cpp
400         )
401 endif()
402
403 if(USE_SDLGLES2)
404         target_sources(IRRVIDEOOBJ PRIVATE
405                 OpenGLES2/Driver.cpp
406         )
407 else()
408         target_sources(IRRVIDEOOBJ PRIVATE
409                 COGLES2Driver.cpp
410                 COGLES2ExtensionHandler.cpp
411                 COGLES2FixedPipelineRenderer.cpp
412                 COGLES2MaterialRenderer.cpp
413                 COGLES2Renderer2D.cpp
414                 CWebGL1Driver.cpp
415         )
416 endif()
417
418 add_library(IRRIOOBJ OBJECT
419         CFileList.cpp
420         CFileSystem.cpp
421         CLimitReadFile.cpp
422         CMemoryFile.cpp
423         CReadFile.cpp
424         CWriteFile.cpp
425         CZipReader.cpp
426         CAttributes.cpp
427 )
428
429 add_library(IRROTHEROBJ OBJECT
430         CIrrDeviceSDL.cpp
431         CIrrDeviceLinux.cpp
432         CIrrDeviceStub.cpp
433         CIrrDeviceWin32.cpp
434         CLogger.cpp
435         COSOperator.cpp
436         Irrlicht.cpp
437         os.cpp
438 )
439
440 if(ENABLE_OPENGL3)
441         target_compile_definitions(IRROTHEROBJ PRIVATE ENABLE_OPENGL3)
442 endif()
443
444 if(ANDROID)
445         target_sources(IRROTHEROBJ PRIVATE
446                 Android/CIrrDeviceAndroid.cpp
447                 Android/CAndroidAssetReader.cpp
448                 Android/CAndroidAssetFileArchive.cpp
449                 Android/CKeyEventWrapper.cpp
450         )
451 elseif(APPLE)
452         # Build all IRROTHEROBJ sources as objc++, including the .cpp's
453         set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
454         target_sources(IRROTHEROBJ PRIVATE
455                 CIrrDeviceOSX.mm
456                 CNSOGLManager.mm
457         )
458 endif()
459
460 if(USE_X11)
461         target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_COMPILE_WITH_X11_)
462 endif()
463
464 if(USE_XINPUT2)
465         target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_LINUX_X11_XINPUT2_)
466 endif()
467
468 if(USE_XCURSOR)
469         target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_LINUX_XCURSOR_)
470 endif()
471
472 add_library(IRRGUIOBJ OBJECT
473         CGUIButton.cpp
474         CGUICheckBox.cpp
475         CGUIComboBox.cpp
476         CGUIEditBox.cpp
477         CGUIEnvironment.cpp
478         CGUIFileOpenDialog.cpp
479         CGUIFont.cpp
480         CGUIImage.cpp
481         CGUIListBox.cpp
482         CGUIScrollBar.cpp
483         CGUISkin.cpp
484         CGUIStaticText.cpp
485         CGUITabControl.cpp
486         CGUISpriteBank.cpp
487         CGUIImageList.cpp
488 )
489
490 # Library
491
492 add_library(IrrlichtMt)
493 foreach(object_lib
494         IRRMESHOBJ IRROBJ IRRVIDEOOBJ
495         IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
496         # Set include directories for object library compilation
497         target_include_directories(${object_lib} PRIVATE ${link_includes})
498         # Add objects from object library to main library
499         target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
500 endforeach()
501
502 # Alias target provides add_submodule compatibility
503 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
504
505 target_include_directories(IrrlichtMt
506         PUBLIC
507                 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
508                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
509                 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
510         PRIVATE
511                 ${link_includes}
512 )
513
514 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
515
516 if(WIN32)
517         target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_) # used in _IRR_DEBUG_BREAK_IF definition in a public header
518 endif()
519 target_compile_definitions(IrrlichtMt INTERFACE "IRRLICHT_API=${API_IMPORT}")
520 if(APPLE OR ANDROID OR EMSCRIPTEN)
521         target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
522 endif()
523
524 set_target_properties(IrrlichtMt PROPERTIES
525         VERSION ${PROJECT_VERSION}
526 )
527
528 if(WIN32)
529         set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
530 endif()
531
532 # Installation of library
533 if(ANDROID)
534         set(INSTALL_TARGETS IrrlichtMt native_app_glue)
535 else()
536         set(INSTALL_TARGETS IrrlichtMt)
537 endif()
538
539 install(TARGETS ${INSTALL_TARGETS}
540         EXPORT IrrlichtMt-export
541         DESTINATION "${CMAKE_INSTALL_LIBDIR}"
542 )