]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMakeLists.txt
Error out on unsupported configurations
[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_GLES1)
202         add_definitions(-D_IRR_COMPILE_WITH_OGLES1_)
203         if(DEVICE MATCHES "^WINDOWS|X11|ANDROID$")
204                 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES1_USE_EXTPOINTER_)
205         elseif(DEVICE STREQUAL "IOS")
206                 add_definitions(-D_IRR_COMPILE_WITH_EAGL_MANAGER_)
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 "IOS")
215                 add_definitions(-D_IRR_COMPILE_WITH_EAGL_MANAGER_)
216         endif()
217 endif()
218
219 if(ENABLE_WEBGL1)
220         add_definitions(-D_IRR_COMPILE_WITH_WEBGL1_)
221 endif()
222
223 # Misc
224
225 include(TestBigEndian)
226 TEST_BIG_ENDIAN(BIG_ENDIAN)
227 if(BIG_ENDIAN)
228         add_definitions(-D__BIG_ENDIAN__)
229 endif()
230
231 # Configuration report
232
233 message(STATUS "Device: ${DEVICE}")
234 message(STATUS "OpenGL: ${ENABLE_OPENGL}")
235 message(STATUS "OpenGL ES: ${ENABLE_GLES1}")
236 message(STATUS "OpenGL ES 2: ${ENABLE_GLES2}")
237 message(STATUS "WebGL: ${ENABLE_WEBGL1}")
238
239 # Required libs
240
241 find_package(ZLIB REQUIRED)
242 find_package(JPEG REQUIRED)
243 find_package(PNG REQUIRED)
244
245
246 if(ENABLE_GLES1)
247         # only tested on Android, probably works on Linux (is this needed anywhere else?)
248         find_library(OPENGLES_LIBRARY NAMES GLESv1_CM REQUIRED)
249         find_library(EGL_LIBRARY NAMES EGL REQUIRED)
250
251         message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
252 endif()
253 if(ENABLE_GLES2)
254         find_package(OpenGLES2 REQUIRED)
255 endif()
256 if(ENABLE_OPENGL)
257         set(OpenGL_GL_PREFERENCE "LEGACY")
258         find_package(OpenGL REQUIRED)
259 endif()
260 if(USE_SDL2)
261         find_package(SDL2 CONFIG REQUIRED)
262         message(STATUS "Found SDL2: ${SDL2_LIBRARIES}")
263 endif()
264
265 # Platform-specific libs
266
267 if(ANDROID)
268         enable_language(C)
269         add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
270 elseif(APPLE)
271         find_library(COCOA_LIB Cocoa REQUIRED)
272         find_library(IOKIT_LIB IOKit REQUIRED)
273
274         add_definitions(-DGL_SILENCE_DEPRECATION)
275 else()
276         # Unix probably
277         find_package(X11 REQUIRED)
278         if(${USE_XINPUT2} AND NOT X11_Xi_FOUND)
279                 message(FATAL_ERROR "XInput not found")
280         endif()
281 endif()
282
283 set(link_includes
284         "${PROJECT_SOURCE_DIR}/include"
285         "${CMAKE_CURRENT_SOURCE_DIR}"
286
287         "${ZLIB_INCLUDE_DIR}"
288         "${JPEG_INCLUDE_DIR}"
289         "${PNG_INCLUDE_DIR}"
290         "${SDL2_INCLUDE_DIRS}"
291
292         ${OPENGL_INCLUDE_DIR}
293         ${OPENGLES2_INCLUDE_DIR}
294         ${EGL_INCLUDE_DIR}
295
296         "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
297         ${X11_INCLUDE_DIR}
298 )
299
300 set(link_libs
301         "${ZLIB_LIBRARY}"
302         "${JPEG_LIBRARY}"
303         "${PNG_LIBRARY}"
304         "${SDL2_LIBRARIES}"
305
306         ${OPENGL_LIBRARIES}
307         ${OPENGLES_LIBRARY}
308         ${OPENGLES2_LIBRARIES}
309         ${EGL_LIBRARY}
310
311         "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
312         ${COCOA_LIB}
313         ${IOKIT_LIB}
314         "$<$<PLATFORM_ID:Windows>:gdi32>"
315         "$<$<PLATFORM_ID:Windows>:winmm>"
316         ${X11_X11_LIB}
317         ${X11_Xi_LIB}
318 )
319
320 # Source files
321
322 set(IRRMESHLOADER
323         CB3DMeshFileLoader.cpp
324         COBJMeshFileLoader.cpp
325         CXMeshFileLoader.cpp
326 )
327
328 add_library(IRRMESHOBJ OBJECT
329         CSkinnedMesh.cpp
330         CBoneSceneNode.cpp
331         CMeshSceneNode.cpp
332         CAnimatedMeshSceneNode.cpp
333         ${IRRMESHLOADER}
334 )
335
336 add_library(IRROBJ OBJECT
337         CBillboardSceneNode.cpp
338         CCameraSceneNode.cpp
339         CDummyTransformationSceneNode.cpp
340         CEmptySceneNode.cpp
341         CMeshManipulator.cpp
342         CSceneCollisionManager.cpp
343         CSceneManager.cpp
344         CMeshCache.cpp
345 )
346
347 set(IRRDRVROBJ
348         CNullDriver.cpp
349         COpenGLCacheHandler.cpp
350         COpenGLDriver.cpp
351         COpenGLShaderMaterialRenderer.cpp
352         COpenGLSLMaterialRenderer.cpp
353         COpenGLExtensionHandler.cpp
354         COGLESDriver.cpp
355         COGLESExtensionHandler.cpp
356         COGLES2Driver.cpp
357         COGLES2ExtensionHandler.cpp
358         COGLES2FixedPipelineRenderer.cpp
359         COGLES2MaterialRenderer.cpp
360         COGLES2Renderer2D.cpp
361         CWebGL1Driver.cpp
362         CGLXManager.cpp
363         CWGLManager.cpp
364         CEGLManager.cpp
365         CSDLManager.cpp
366         mt_opengl_loader.cpp
367 )
368
369 set(IRRIMAGEOBJ
370         CColorConverter.cpp
371         CImage.cpp
372         CImageLoaderBMP.cpp
373         CImageLoaderJPG.cpp
374         CImageLoaderPNG.cpp
375         CImageLoaderTGA.cpp
376         CImageWriterJPG.cpp
377         CImageWriterPNG.cpp
378 )
379
380 add_library(IRRVIDEOOBJ OBJECT
381         CFPSCounter.cpp
382         ${IRRDRVROBJ}
383         ${IRRIMAGEOBJ}
384 )
385
386 if(ENABLE_OPENGL3)
387         if (NOT USE_SDL2)
388                 message(SEND_ERROR "OpenGL3 support requires SDL2")
389         endif()
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 add_library(IRRIOOBJ OBJECT
400         CFileList.cpp
401         CFileSystem.cpp
402         CLimitReadFile.cpp
403         CMemoryFile.cpp
404         CReadFile.cpp
405         CWriteFile.cpp
406         CZipReader.cpp
407         CAttributes.cpp
408 )
409
410 add_library(IRROTHEROBJ OBJECT
411         CIrrDeviceSDL.cpp
412         CIrrDeviceLinux.cpp
413         CIrrDeviceStub.cpp
414         CIrrDeviceWin32.cpp
415         CLogger.cpp
416         COSOperator.cpp
417         Irrlicht.cpp
418         os.cpp
419 )
420
421 if(ENABLE_OPENGL3)
422         target_compile_definitions(IRROTHEROBJ PRIVATE ENABLE_OPENGL3)
423 endif()
424
425 if(ANDROID)
426         target_sources(IRROTHEROBJ PRIVATE
427                 Android/CIrrDeviceAndroid.cpp
428                 Android/CAndroidAssetReader.cpp
429                 Android/CAndroidAssetFileArchive.cpp
430                 Android/CKeyEventWrapper.cpp
431         )
432 elseif(APPLE)
433         # Build all IRROTHEROBJ sources as objc++, including the .cpp's
434         set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
435         target_sources(IRROTHEROBJ PRIVATE
436                 CIrrDeviceOSX.mm
437                 CNSOGLManager.mm
438         )
439 endif()
440
441 add_library(IRRGUIOBJ OBJECT
442         CGUIButton.cpp
443         CGUICheckBox.cpp
444         CGUIComboBox.cpp
445         CGUIEditBox.cpp
446         CGUIEnvironment.cpp
447         CGUIFileOpenDialog.cpp
448         CGUIFont.cpp
449         CGUIImage.cpp
450         CGUIListBox.cpp
451         CGUIScrollBar.cpp
452         CGUISkin.cpp
453         CGUIStaticText.cpp
454         CGUITabControl.cpp
455         CGUISpriteBank.cpp
456         CGUIImageList.cpp
457 )
458
459 # Library
460
461 add_library(IrrlichtMt)
462 foreach(object_lib
463         IRRMESHOBJ IRROBJ IRRVIDEOOBJ
464         IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
465         # Set include directories for object library compilation
466         target_include_directories(${object_lib} PRIVATE ${link_includes})
467         # Add objects from object library to main library
468         target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
469 endforeach()
470
471 # Alias target provides add_submodule compatibility
472 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
473
474 target_include_directories(IrrlichtMt
475         PUBLIC
476                 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
477                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
478                 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
479         PRIVATE
480                 ${link_includes}
481 )
482
483 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
484
485 if(WIN32)
486         target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_)
487 endif()
488 if(WIN32 AND BUILD_SHARED_LIBS)
489         target_compile_definitions(IrrlichtMt INTERFACE IRRLICHT_API=__declspec(dllimport))
490 endif()
491 if(APPLE OR ANDROID OR EMSCRIPTEN)
492         target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
493 endif()
494
495 set_target_properties(IrrlichtMt PROPERTIES
496         VERSION ${PROJECT_VERSION}
497 )
498
499 if(WIN32)
500         set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
501 endif()
502
503 # Installation of library
504 if(ANDROID)
505         set(INSTALL_TARGETS IrrlichtMt native_app_glue)
506 else()
507         set(INSTALL_TARGETS IrrlichtMt)
508 endif()
509
510 install(TARGETS ${INSTALL_TARGETS}
511         EXPORT IrrlichtMt-export
512         DESTINATION "${CMAKE_INSTALL_LIBDIR}"
513 )