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