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