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