]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMakeLists.txt
Error out early on unsupported SDL2+GLES1 combo
[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         if (USE_SDL2)
208                 message(SEND_ERROR "OpenGL ES 1 is not supported with SDL2")
209         endif()
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 if(USE_X11)
466         target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_COMPILE_WITH_X11_)
467 endif()
468
469 if(USE_XINPUT2)
470         target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_LINUX_X11_XINPUT2_)
471 endif()
472
473 if(USE_XCURSOR)
474         target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_LINUX_XCURSOR_)
475 endif()
476
477 add_library(IRRGUIOBJ OBJECT
478         CGUIButton.cpp
479         CGUICheckBox.cpp
480         CGUIComboBox.cpp
481         CGUIEditBox.cpp
482         CGUIEnvironment.cpp
483         CGUIFileOpenDialog.cpp
484         CGUIFont.cpp
485         CGUIImage.cpp
486         CGUIListBox.cpp
487         CGUIScrollBar.cpp
488         CGUISkin.cpp
489         CGUIStaticText.cpp
490         CGUITabControl.cpp
491         CGUISpriteBank.cpp
492         CGUIImageList.cpp
493 )
494
495 # Library
496
497 add_library(IrrlichtMt)
498 foreach(object_lib
499         IRRMESHOBJ IRROBJ IRRVIDEOOBJ
500         IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
501         # Set include directories for object library compilation
502         target_include_directories(${object_lib} PRIVATE ${link_includes})
503         # Add objects from object library to main library
504         target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
505 endforeach()
506
507 # Alias target provides add_submodule compatibility
508 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
509
510 target_include_directories(IrrlichtMt
511         PUBLIC
512                 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
513                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
514                 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
515         PRIVATE
516                 ${link_includes}
517 )
518
519 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
520
521 if(WIN32)
522         target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_) # used in _IRR_DEBUG_BREAK_IF definition in a public header
523 endif()
524 target_compile_definitions(IrrlichtMt INTERFACE "IRRLICHT_API=${API_IMPORT}")
525 if(APPLE OR ANDROID OR EMSCRIPTEN)
526         target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
527 endif()
528
529 set_target_properties(IrrlichtMt PROPERTIES
530         VERSION ${PROJECT_VERSION}
531 )
532
533 if(WIN32)
534         set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
535 endif()
536
537 # Installation of library
538 if(ANDROID)
539         set(INSTALL_TARGETS IrrlichtMt native_app_glue)
540 else()
541         set(INSTALL_TARGETS IrrlichtMt)
542 endif()
543
544 install(TARGETS ${INSTALL_TARGETS}
545         EXPORT IrrlichtMt-export
546         DESTINATION "${CMAKE_INSTALL_LIBDIR}"
547 )