]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMakeLists.txt
Add OpenGL3 renderer
[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(WARNING "SDL2 backend is not supported on iOS")
90                 set(USE_SDL2 FALSE)
91         endif()
92         set(DEVICE "IOS")
93 elseif(OSX)
94         add_definitions(-D_IRR_OSX_PLATFORM_)
95         set(DEVICE "OSX")
96 elseif(ANDROID)
97         add_definitions(-D_IRR_ANDROID_PLATFORM_ -D_IRR_COMPILE_ANDROID_ASSET_READER_)
98         if(USE_SDL2)
99                 message(WARNING "SDL2 backend is not supported on Android")
100                 set(USE_SDL2 FALSE)
101         endif()
102         set(DEVICE "Android")
103 elseif(EMSCRIPTEN)
104         add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_ -D_IRR_COMPILE_WITH_EGL_MANAGER_)
105         set(LINUX_PLATFORM TRUE)
106         set(DEVICE "SDL")
107 elseif(SOLARIS)
108         add_definitions(-D_IRR_SOLARIS_PLATFORM_ -D_IRR_POSIX_API_)
109         set(DEVICE "X11")
110 else()
111         add_definitions(-D_IRR_POSIX_API_)
112         set(LINUX_PLATFORM TRUE)
113         set(DEVICE "X11")
114 endif()
115
116 if(USE_SDL2)
117         set(DEVICE "SDL")
118 endif()
119
120 option(USE_X11 "Use X11" TRUE)
121 if(USE_X11)
122         add_definitions(-D_IRR_COMPILE_WITH_X11_)
123 endif()
124
125 if(LINUX_PLATFORM)
126         add_definitions(-D_IRR_LINUX_PLATFORM_)
127 endif()
128
129 if(LINUX_PLATFORM AND USE_X11)
130         add_definitions(-D_IRR_COMPILE_WITH_X11_)
131
132         option(USE_XINPUT2 "Use XInput2" TRUE)
133         if(USE_XINPUT2)
134                 add_definitions(-D_IRR_LINUX_X11_XINPUT2_)
135         endif()
136
137         option(USE_XCURSOR "Use XCursor" FALSE)
138         if(USE_XCURSOR)
139                 add_definitions(-D_IRR_LINUX_XCURSOR_)
140         endif()
141 else()
142         set(USE_XINPUT2 FALSE)
143         set(USE_XCURSOR FALSE)
144 endif()
145
146 add_definitions("-D_IRR_COMPILE_WITH_${DEVICE}_DEVICE_")
147
148 # Joystick
149
150 if(NOT (BSD OR SOLARIS OR EMSCRIPTEN))
151         add_definitions(-D_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
152 endif()
153
154 # OpenGL
155
156 option(ENABLE_OPENGL3 "Enable OpenGL 3+" FALSE)
157
158 if(IOS OR ANDROID OR EMSCRIPTEN)
159         set(ENABLE_OPENGL FALSE)
160 else()
161         option(ENABLE_OPENGL "Enable OpenGL" TRUE)
162 endif()
163
164 if(EMSCRIPTEN OR OSX)
165         set(ENABLE_GLES1 FALSE)
166 else()
167         if(ANDROID OR IOS)
168                 set(DEFAULT_GLES1 TRUE)
169         endif()
170         option(ENABLE_GLES1 "Enable OpenGL ES" ${DEFAULT_GLES1})
171 endif()
172
173 if(OSX)
174         set(ENABLE_GLES2 FALSE)
175         set(ENABLE_WEBGL1 FALSE)
176 else()
177         if(ANDROID OR IOS OR EMSCRIPTEN)
178                 set(DEFAULT_GLES2 TRUE)
179         endif()
180         if(EMSCRIPTEN)
181                 set(DEFAULT_WEBGL1 TRUE)
182         endif()
183         option(ENABLE_GLES2 "Enable OpenGL ES 2+" ${DEFAULT_GLES2})
184         option(ENABLE_WEBGL1 "Enable WebGL (requires GLES2)" ${DEFAULT_WEBGL1})
185         if(ENABLE_WEBGL1)
186                 set(ENABLE_GLES2 TRUE)
187         endif()
188 endif()
189
190 if(ENABLE_OPENGL)
191         add_definitions(-D_IRR_COMPILE_WITH_OPENGL_)
192         if(DEVICE STREQUAL "WINDOWS")
193                 add_definitions(-D_IRR_COMPILE_WITH_WGL_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
194         elseif(DEVICE STREQUAL "X11")
195                 add_definitions(-D_IRR_COMPILE_WITH_GLX_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
196         elseif(DEVICE STREQUAL "OSX")
197                 add_definitions(-D_IRR_COMPILE_WITH_NSOGL_MANAGER_)
198         elseif(DEVICE STREQUAL "SDL")
199                 add_definitions(-D_IRR_OPENGL_USE_EXTPOINTER_)
200         endif()
201 endif()
202
203 if(ENABLE_GLES1)
204         add_definitions(-D_IRR_COMPILE_WITH_OGLES1_)
205         if(DEVICE MATCHES "^WINDOWS|X11|ANDROID$")
206                 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES1_USE_EXTPOINTER_)
207         elseif(DEVICE STREQUAL "IOS")
208                 add_definitions(-D_IRR_COMPILE_WITH_EAGL_MANAGER_)
209         endif()
210 endif()
211
212 if(ENABLE_GLES2)
213         add_definitions(-D_IRR_COMPILE_WITH_OGLES2_)
214         if(DEVICE MATCHES "^WINDOWS|X11|ANDROID$" OR EMSCRIPTEN)
215                 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES2_USE_EXTPOINTER_)
216         elseif(DEVICE STREQUAL "IOS")
217                 add_definitions(-D_IRR_COMPILE_WITH_EAGL_MANAGER_)
218         endif()
219 endif()
220
221 if(ENABLE_WEBGL1)
222         add_definitions(-D_IRR_COMPILE_WITH_WEBGL1_)
223 endif()
224
225 # Misc
226
227 include(TestBigEndian)
228 TEST_BIG_ENDIAN(BIG_ENDIAN)
229 if(BIG_ENDIAN)
230         add_definitions(-D__BIG_ENDIAN__)
231 endif()
232
233 # Configuration report
234
235 message(STATUS "Device: ${DEVICE}")
236 message(STATUS "OpenGL: ${ENABLE_OPENGL}")
237 message(STATUS "OpenGL ES: ${ENABLE_GLES1}")
238 message(STATUS "OpenGL ES 2: ${ENABLE_GLES2}")
239 message(STATUS "WebGL: ${ENABLE_WEBGL1}")
240
241 # Required libs
242
243 find_package(ZLIB REQUIRED)
244 find_package(JPEG REQUIRED)
245 find_package(PNG REQUIRED)
246
247
248 if(ENABLE_GLES1)
249         # only tested on Android, probably works on Linux (is this needed anywhere else?)
250         find_library(OPENGLES_LIBRARY NAMES GLESv1_CM REQUIRED)
251         find_library(EGL_LIBRARY NAMES EGL REQUIRED)
252
253         message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
254 endif()
255 if(ENABLE_GLES2)
256         find_package(OpenGLES2 REQUIRED)
257 endif()
258 if(ENABLE_OPENGL)
259         set(OpenGL_GL_PREFERENCE "LEGACY")
260         find_package(OpenGL REQUIRED)
261 endif()
262 if(USE_SDL2)
263         find_package(SDL2 CONFIG REQUIRED)
264         message(STATUS "Found SDL2: ${SDL2_LIBRARIES}")
265 endif()
266
267 # Platform-specific libs
268
269 if(ANDROID)
270         enable_language(C)
271         add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
272 elseif(APPLE)
273         find_library(COCOA_LIB Cocoa REQUIRED)
274         find_library(IOKIT_LIB IOKit REQUIRED)
275
276         add_definitions(-DGL_SILENCE_DEPRECATION)
277 else()
278         # Unix probably
279         find_package(X11 REQUIRED)
280         if(${USE_XINPUT2} AND NOT X11_Xi_FOUND)
281                 message(FATAL_ERROR "XInput not found")
282         endif()
283 endif()
284
285 set(link_includes
286         "${PROJECT_SOURCE_DIR}/include"
287         "${CMAKE_CURRENT_SOURCE_DIR}"
288
289         "${ZLIB_INCLUDE_DIR}"
290         "${JPEG_INCLUDE_DIR}"
291         "${PNG_INCLUDE_DIR}"
292         "${SDL2_INCLUDE_DIRS}"
293
294         ${OPENGL_INCLUDE_DIR}
295         ${OPENGLES2_INCLUDE_DIR}
296         ${EGL_INCLUDE_DIR}
297
298         "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
299         ${X11_INCLUDE_DIR}
300 )
301
302 set(link_libs
303         "${ZLIB_LIBRARY}"
304         "${JPEG_LIBRARY}"
305         "${PNG_LIBRARY}"
306         "${SDL2_LIBRARIES}"
307
308         ${OPENGL_LIBRARIES}
309         ${OPENGLES_LIBRARY}
310         ${OPENGLES2_LIBRARIES}
311         ${EGL_LIBRARY}
312
313         "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
314         ${COCOA_LIB}
315         ${IOKIT_LIB}
316         "$<$<PLATFORM_ID:Windows>:gdi32>"
317         "$<$<PLATFORM_ID:Windows>:winmm>"
318         ${X11_X11_LIB}
319         ${X11_Xi_LIB}
320 )
321
322 # Source files
323
324 set(IRRMESHLOADER
325         CB3DMeshFileLoader.cpp
326         COBJMeshFileLoader.cpp
327         CXMeshFileLoader.cpp
328 )
329
330 add_library(IRRMESHOBJ OBJECT
331         CSkinnedMesh.cpp
332         CBoneSceneNode.cpp
333         CMeshSceneNode.cpp
334         CAnimatedMeshSceneNode.cpp
335         ${IRRMESHLOADER}
336 )
337
338 add_library(IRROBJ OBJECT
339         CBillboardSceneNode.cpp
340         CCameraSceneNode.cpp
341         CDummyTransformationSceneNode.cpp
342         CEmptySceneNode.cpp
343         CMeshManipulator.cpp
344         CSceneCollisionManager.cpp
345         CSceneManager.cpp
346         CMeshCache.cpp
347 )
348
349 set(IRRDRVROBJ
350         CNullDriver.cpp
351         COpenGLCacheHandler.cpp
352         COpenGLDriver.cpp
353         COpenGLShaderMaterialRenderer.cpp
354         COpenGLSLMaterialRenderer.cpp
355         COpenGLExtensionHandler.cpp
356         COGLESDriver.cpp
357         COGLESExtensionHandler.cpp
358         COGLES2Driver.cpp
359         COGLES2ExtensionHandler.cpp
360         COGLES2FixedPipelineRenderer.cpp
361         COGLES2MaterialRenderer.cpp
362         COGLES2Renderer2D.cpp
363         CWebGL1Driver.cpp
364         CGLXManager.cpp
365         CWGLManager.cpp
366         CEGLManager.cpp
367         CSDLManager.cpp
368         mt_opengl_loader.cpp
369 )
370
371 set(IRRIMAGEOBJ
372         CColorConverter.cpp
373         CImage.cpp
374         CImageLoaderBMP.cpp
375         CImageLoaderJPG.cpp
376         CImageLoaderPNG.cpp
377         CImageLoaderTGA.cpp
378         CImageWriterJPG.cpp
379         CImageWriterPNG.cpp
380 )
381
382 add_library(IRRVIDEOOBJ OBJECT
383         CFPSCounter.cpp
384         ${IRRDRVROBJ}
385         ${IRRIMAGEOBJ}
386 )
387
388 if(ENABLE_OPENGL3)
389         if (NOT USE_SDL2)
390                 message(SEND_ERROR "OpenGL3 support requires SDL2")
391         endif()
392         target_sources(IRRVIDEOOBJ PUBLIC
393                 OpenGL/Driver.cpp
394                 OpenGL/ExtensionHandler.cpp
395                 OpenGL/FixedPipelineRenderer.cpp
396                 OpenGL/MaterialRenderer.cpp
397                 OpenGL/Renderer2D.cpp
398         )
399 endif()
400
401 add_library(IRRIOOBJ OBJECT
402         CFileList.cpp
403         CFileSystem.cpp
404         CLimitReadFile.cpp
405         CMemoryFile.cpp
406         CReadFile.cpp
407         CWriteFile.cpp
408         CZipReader.cpp
409         CAttributes.cpp
410 )
411
412 add_library(IRROTHEROBJ OBJECT
413         CIrrDeviceSDL.cpp
414         CIrrDeviceLinux.cpp
415         CIrrDeviceStub.cpp
416         CIrrDeviceWin32.cpp
417         CLogger.cpp
418         COSOperator.cpp
419         Irrlicht.cpp
420         os.cpp
421 )
422
423 if(ENABLE_OPENGL3)
424         target_compile_definitions(IRROTHEROBJ PRIVATE ENABLE_OPENGL3)
425 endif()
426
427 if(ANDROID)
428         target_sources(IRROTHEROBJ PRIVATE
429                 Android/CIrrDeviceAndroid.cpp
430                 Android/CAndroidAssetReader.cpp
431                 Android/CAndroidAssetFileArchive.cpp
432                 Android/CKeyEventWrapper.cpp
433         )
434 elseif(APPLE)
435         # Build all IRROTHEROBJ sources as objc++, including the .cpp's
436         set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
437         target_sources(IRROTHEROBJ PRIVATE
438                 CIrrDeviceOSX.mm
439                 CNSOGLManager.mm
440         )
441 endif()
442
443 add_library(IRRGUIOBJ OBJECT
444         CGUIButton.cpp
445         CGUICheckBox.cpp
446         CGUIComboBox.cpp
447         CGUIEditBox.cpp
448         CGUIEnvironment.cpp
449         CGUIFileOpenDialog.cpp
450         CGUIFont.cpp
451         CGUIImage.cpp
452         CGUIListBox.cpp
453         CGUIScrollBar.cpp
454         CGUISkin.cpp
455         CGUIStaticText.cpp
456         CGUITabControl.cpp
457         CGUISpriteBank.cpp
458         CGUIImageList.cpp
459 )
460
461 # Library
462
463 add_library(IrrlichtMt)
464 foreach(object_lib
465         IRRMESHOBJ IRROBJ IRRVIDEOOBJ
466         IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
467         # Set include directories for object library compilation
468         target_include_directories(${object_lib} PRIVATE ${link_includes})
469         # Add objects from object library to main library
470         target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
471 endforeach()
472
473 # Alias target provides add_submodule compatibility
474 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
475
476 target_include_directories(IrrlichtMt
477         PUBLIC
478                 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
479                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
480                 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
481         PRIVATE
482                 ${link_includes}
483 )
484
485 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
486
487 if(WIN32)
488         target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_)
489 endif()
490 if(WIN32 AND BUILD_SHARED_LIBS)
491         target_compile_definitions(IrrlichtMt INTERFACE IRRLICHT_API=__declspec(dllimport))
492 endif()
493 if(APPLE OR ANDROID OR EMSCRIPTEN)
494         target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
495 endif()
496
497 set_target_properties(IrrlichtMt PROPERTIES
498         VERSION ${PROJECT_VERSION}
499 )
500
501 if(WIN32)
502         set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
503 endif()
504
505 # Installation of library
506 if(ANDROID)
507         set(INSTALL_TARGETS IrrlichtMt native_app_glue)
508 else()
509         set(INSTALL_TARGETS IrrlichtMt)
510 endif()
511
512 install(TARGETS ${INSTALL_TARGETS}
513         EXPORT IrrlichtMt-export
514         DESTINATION "${CMAKE_INSTALL_LIBDIR}"
515 )