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