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