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