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