]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMakeLists.txt
Apply suggestions from code review
[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(WARNING "SDL2 backend is not supported on iOS")
90                 set(USE_SDL2 FALSE)
91         endif()
92         set(DEVICE "IOS")
93 elseif(OSX)
94         add_definitions(-D_IRR_OSX_PLATFORM_)
95         set(DEVICE "OSX")
96 elseif(ANDROID)
97         add_definitions(-D_IRR_ANDROID_PLATFORM_ -D_IRR_COMPILE_ANDROID_ASSET_READER_)
98         if(USE_SDL2)
99                 message(WARNING "SDL2 backend is not supported on Android")
100                 set(USE_SDL2 FALSE)
101         endif()
102         set(DEVICE "Android")
103 elseif(EMSCRIPTEN)
104         add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_ -D_IRR_COMPILE_WITH_EGL_MANAGER_)
105         set(LINUX_PLATFORM TRUE)
106         set(DEVICE "SDL")
107 elseif(SOLARIS)
108         add_definitions(-D_IRR_SOLARIS_PLATFORM_ -D_IRR_POSIX_API_)
109         set(DEVICE "X11")
110 else()
111         add_definitions(-D_IRR_POSIX_API_)
112         set(LINUX_PLATFORM TRUE)
113         set(DEVICE "X11")
114 endif()
115
116 if(USE_SDL2)
117         set(DEVICE "SDL")
118 endif()
119
120 option(USE_X11 "Use X11" TRUE)
121 if(USE_X11)
122         add_definitions(-D_IRR_COMPILE_WITH_X11_)
123 endif()
124
125 if(LINUX_PLATFORM)
126         add_definitions(-D_IRR_LINUX_PLATFORM_)
127 endif()
128
129 if(LINUX_PLATFORM AND USE_X11)
130         add_definitions(-D_IRR_COMPILE_WITH_X11_)
131
132         option(USE_XINPUT2 "Use XInput2" TRUE)
133         if(USE_XINPUT2)
134                 add_definitions(-D_IRR_LINUX_X11_XINPUT2_)
135         endif()
136
137         option(USE_XCURSOR "Use XCursor" FALSE)
138         if(USE_XCURSOR)
139                 add_definitions(-D_IRR_LINUX_XCURSOR_)
140         endif()
141 else()
142         set(USE_XINPUT2 FALSE)
143         set(USE_XCURSOR FALSE)
144 endif()
145
146 add_definitions("-D_IRR_COMPILE_WITH_${DEVICE}_DEVICE_")
147
148 # Joystick
149
150 if(NOT (BSD OR SOLARIS OR EMSCRIPTEN))
151         add_definitions(-D_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
152 endif()
153
154 # OpenGL
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 add_library(IRRIOOBJ OBJECT
387         CFileList.cpp
388         CFileSystem.cpp
389         CLimitReadFile.cpp
390         CMemoryFile.cpp
391         CReadFile.cpp
392         CWriteFile.cpp
393         CZipReader.cpp
394         CAttributes.cpp
395 )
396
397 add_library(IRROTHEROBJ OBJECT
398         CIrrDeviceSDL.cpp
399         CIrrDeviceLinux.cpp
400         CIrrDeviceStub.cpp
401         CIrrDeviceWin32.cpp
402         CLogger.cpp
403         COSOperator.cpp
404         Irrlicht.cpp
405         os.cpp
406 )
407
408 if(ANDROID)
409         target_sources(IRROTHEROBJ PRIVATE
410                 Android/CIrrDeviceAndroid.cpp
411                 Android/CAndroidAssetReader.cpp
412                 Android/CAndroidAssetFileArchive.cpp
413                 Android/CKeyEventWrapper.cpp
414         )
415 elseif(APPLE)
416         # Build all IRROTHEROBJ sources as objc++, including the .cpp's
417         set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
418         target_sources(IRROTHEROBJ PRIVATE
419                 CIrrDeviceOSX.mm
420                 CNSOGLManager.mm
421         )
422 endif()
423
424 add_library(IRRGUIOBJ OBJECT
425         CGUIButton.cpp
426         CGUICheckBox.cpp
427         CGUIComboBox.cpp
428         CGUIEditBox.cpp
429         CGUIEnvironment.cpp
430         CGUIFileOpenDialog.cpp
431         CGUIFont.cpp
432         CGUIImage.cpp
433         CGUIListBox.cpp
434         CGUIScrollBar.cpp
435         CGUISkin.cpp
436         CGUIStaticText.cpp
437         CGUITabControl.cpp
438         CGUISpriteBank.cpp
439         CGUIImageList.cpp
440 )
441
442 # Library
443
444 add_library(IrrlichtMt)
445 foreach(object_lib
446         IRRMESHOBJ IRROBJ IRRVIDEOOBJ
447         IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
448         # Set include directories for object library compilation
449         target_include_directories(${object_lib} PRIVATE ${link_includes})
450         # Add objects from object library to main library
451         target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
452 endforeach()
453
454 # Alias target provides add_submodule compatibility
455 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
456
457 target_include_directories(IrrlichtMt
458         PUBLIC
459                 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
460                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
461                 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
462         PRIVATE
463                 ${link_includes}
464 )
465
466 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
467
468 if(WIN32)
469         target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_)
470 endif()
471 if(WIN32 AND BUILD_SHARED_LIBS)
472         target_compile_definitions(IrrlichtMt INTERFACE IRRLICHT_API=__declspec(dllimport))
473 endif()
474 if(APPLE OR ANDROID OR EMSCRIPTEN)
475         target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
476 endif()
477
478 set_target_properties(IrrlichtMt PROPERTIES
479         VERSION ${PROJECT_VERSION}
480 )
481
482 if(WIN32)
483         set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
484 endif()
485
486 # Installation of library
487 if(ANDROID)
488         set(INSTALL_TARGETS IrrlichtMt native_app_glue)
489 else()
490         set(INSTALL_TARGETS IrrlichtMt)
491 endif()
492
493 install(TARGETS ${INSTALL_TARGETS}
494         EXPORT IrrlichtMt-export
495         DESTINATION "${CMAKE_INSTALL_LIBDIR}"
496 )