1 option(BUILD_SHARED_LIBS "Build shared library" TRUE)
2 option(USE_SDL2 "Use the SDL2 backend" FALSE)
6 add_definitions(-DIRRLICHT_EXPORTS)
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
15 add_definitions(-D_IRR_STATIC_LIB_)
17 add_definitions("-DIRRLICHT_API=${API_EXPORT}")
19 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
20 add_definitions(-D_DEBUG)
22 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
23 set(CMAKE_CXX_STANDARD 11)
24 set(CMAKE_CXX_STANDARD_REQUIRED ON)
26 if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
27 set(CMAKE_CXX_FLAGS_RELEASE "-O3")
28 set(CMAKE_CXX_FLAGS_DEBUG "-g")
30 add_compile_options(-Wall -pipe -fno-exceptions -fno-rtti)
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)
38 message(STATUS "Detected Intel x86: using SSE instead of x87 FPU")
39 add_compile_options(-mfpmath=sse -msse)
44 string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " msvcrt.lib") # ???? fuck off
46 add_compile_options(/GR- /Zl)
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)
55 # Sanity-check version
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\
64 int main() {}" REVISION_SANITY_CHECK)
65 if(NOT REVISION_SANITY_CHECK)
66 message(FATAL_ERROR "IrrlichtMt revision number mismatches between CMake and headers.")
69 # Platform-independent configuration (hard-coded currently)
71 -DIRR_ENABLE_BUILTIN_FONT
72 -D_IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
73 -D_IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_
76 # Platform-specific configuration
78 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
85 add_definitions(-D_IRR_WINDOWS_ -D_IRR_WINDOWS_API_)
88 add_definitions(-D_IRR_OSX_PLATFORM_)
91 add_definitions(-D_IRR_ANDROID_PLATFORM_ -D_IRR_COMPILE_ANDROID_ASSET_READER_)
93 message(FATAL_ERROR "SDL2 device is not (yet) supported on Android")
97 add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_ -D_IRR_COMPILE_WITH_EGL_MANAGER_)
98 set(LINUX_PLATFORM TRUE)
101 add_definitions(-D_IRR_SOLARIS_PLATFORM_ -D_IRR_POSIX_API_)
104 add_definitions(-D_IRR_POSIX_API_)
105 set(LINUX_PLATFORM TRUE)
110 add_definitions(-D_IRR_LINUX_PLATFORM_)
115 elseif(DEVICE STREQUAL "SDL")
116 message(FATAL_ERROR "SDL was used but not enabled?!")
119 add_definitions("-D_IRR_COMPILE_WITH_${DEVICE}_DEVICE_")
123 if(DEVICE STREQUAL "X11")
124 option(USE_X11 "Use X11" TRUE)
129 if(LINUX_PLATFORM AND USE_X11)
130 option(USE_XINPUT2 "Use XInput2" TRUE)
131 option(USE_XCURSOR "Use XCursor" FALSE)
133 set(USE_XINPUT2 FALSE)
134 set(USE_XCURSOR FALSE)
139 if(NOT (BSD OR SOLARIS OR EMSCRIPTEN))
140 add_definitions(-D_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
145 option(ENABLE_OPENGL3 "Enable OpenGL 3+" FALSE)
147 if(ANDROID OR EMSCRIPTEN)
148 set(ENABLE_OPENGL FALSE)
150 option(ENABLE_OPENGL "Enable OpenGL" TRUE)
153 if(EMSCRIPTEN OR APPLE)
154 set(ENABLE_GLES1 FALSE)
157 set(DEFAULT_GLES1 TRUE)
159 option(ENABLE_GLES1 "Enable OpenGL ES" ${DEFAULT_GLES1})
163 set(ENABLE_GLES2 FALSE)
164 set(ENABLE_WEBGL1 FALSE)
166 if(ANDROID OR EMSCRIPTEN)
167 set(DEFAULT_GLES2 TRUE)
170 set(DEFAULT_WEBGL1 TRUE)
172 option(ENABLE_GLES2 "Enable OpenGL ES 2+" ${DEFAULT_GLES2})
173 option(ENABLE_WEBGL1 "Enable WebGL (requires GLES2)" ${DEFAULT_WEBGL1})
175 set(ENABLE_GLES2 TRUE)
180 add_definitions(-D_IRR_COMPILE_WITH_OPENGL_)
181 if(DEVICE STREQUAL "WINDOWS")
182 add_definitions(-D_IRR_COMPILE_WITH_WGL_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
183 elseif(DEVICE STREQUAL "X11")
184 add_definitions(-D_IRR_COMPILE_WITH_GLX_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
185 elseif(DEVICE STREQUAL "OSX")
186 add_definitions(-D_IRR_COMPILE_WITH_NSOGL_MANAGER_)
187 elseif(DEVICE STREQUAL "SDL")
188 add_definitions(-D_IRR_OPENGL_USE_EXTPOINTER_)
194 message(FATAL_ERROR "OpenGL 3 driver requires SDL2")
202 message(FATAL_ERROR "OpenGL ES 1 is not supported with SDL2")
204 add_definitions(-D_IRR_COMPILE_WITH_OGLES1_)
205 if(DEVICE MATCHES "^(WINDOWS|X11|ANDROID)$")
206 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES1_USE_EXTPOINTER_)
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 "SDL")
221 add_definitions(-D_IRR_COMPILE_WITH_WEBGL1_)
226 include(TestBigEndian)
227 TEST_BIG_ENDIAN(BIG_ENDIAN)
229 add_definitions(-D__BIG_ENDIAN__)
232 # Configuration report
234 message(STATUS "Device: ${DEVICE}")
235 message(STATUS "OpenGL: ${ENABLE_OPENGL}")
236 message(STATUS "OpenGL 3: ${ENABLE_OPENGL3}")
237 message(STATUS "OpenGL ES: ${ENABLE_GLES1}")
239 message(STATUS "OpenGL ES 2: ON (unified)")
240 elseif (ENABLE_GLES2)
241 message(STATUS "OpenGL ES 2: ON (legacy)")
243 message(STATUS "OpenGL ES 2: OFF")
245 message(STATUS "WebGL: ${ENABLE_WEBGL1}")
249 find_package(ZLIB REQUIRED)
250 find_package(JPEG REQUIRED)
251 find_package(PNG REQUIRED)
255 # only tested on Android, probably works on Linux (is this needed anywhere else?)
256 find_library(OPENGLES_LIBRARY NAMES GLESv1_CM REQUIRED)
257 find_library(EGL_LIBRARY NAMES EGL REQUIRED)
259 message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
262 find_package(OpenGLES2 REQUIRED)
264 if(ENABLE_OPENGL OR ENABLE_OPENGL3)
265 set(OpenGL_GL_PREFERENCE "LEGACY")
266 find_package(OpenGL REQUIRED)
269 find_package(SDL2 CONFIG REQUIRED)
270 message(STATUS "Found SDL2: ${SDL2_LIBRARIES}")
273 # Platform-specific libs
277 add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
279 find_library(COCOA_LIB Cocoa REQUIRED)
280 find_library(IOKIT_LIB IOKit REQUIRED)
282 add_definitions(-DGL_SILENCE_DEPRECATION)
285 find_package(X11 REQUIRED)
286 if(USE_XINPUT2 AND NOT X11_Xi_FOUND)
287 message(FATAL_ERROR "XInput not found")
292 "${PROJECT_SOURCE_DIR}/include"
293 "${CMAKE_CURRENT_SOURCE_DIR}"
295 "${ZLIB_INCLUDE_DIR}"
296 "${JPEG_INCLUDE_DIR}"
298 "$<$<BOOL:${USE_SDL2}>:${SDL2_INCLUDE_DIRS}>"
300 ${OPENGL_INCLUDE_DIR}
301 ${OPENGLES2_INCLUDE_DIR}
304 "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
305 "$<$<BOOL:${USE_X11}>:${X11_INCLUDE_DIR}>"
312 "$<$<BOOL:${USE_SDL2}>:${SDL2_LIBRARIES}>"
316 ${OPENGLES2_LIBRARIES}
319 "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
322 "$<$<PLATFORM_ID:Windows>:gdi32>"
323 "$<$<PLATFORM_ID:Windows>:winmm>"
324 "$<$<BOOL:${USE_X11}>:${X11_X11_LIB}>"
325 "$<$<BOOL:${USE_X11}>:${X11_Xi_LIB}>"
331 CB3DMeshFileLoader.cpp
332 COBJMeshFileLoader.cpp
336 add_library(IRRMESHOBJ OBJECT
340 CAnimatedMeshSceneNode.cpp
344 add_library(IRROBJ OBJECT
345 CBillboardSceneNode.cpp
347 CDummyTransformationSceneNode.cpp
350 CSceneCollisionManager.cpp
354 CShadowVolumeSceneNode.cpp
369 COpenGLCacheHandler.cpp
371 COpenGLShaderMaterialRenderer.cpp
372 COpenGLSLMaterialRenderer.cpp
373 COpenGLExtensionHandler.cpp
381 COGLESExtensionHandler.cpp
396 add_library(IRRVIDEOOBJ OBJECT
403 target_sources(IRRVIDEOOBJ PRIVATE
405 OpenGL/ExtensionHandler.cpp
406 OpenGL/FixedPipelineRenderer.cpp
407 OpenGL/MaterialRenderer.cpp
408 OpenGL/Renderer2D.cpp
413 target_sources(IRRVIDEOOBJ PRIVATE
419 target_sources(IRRVIDEOOBJ PRIVATE
423 target_sources(IRRVIDEOOBJ PRIVATE
425 COGLES2ExtensionHandler.cpp
426 COGLES2FixedPipelineRenderer.cpp
427 COGLES2MaterialRenderer.cpp
428 COGLES2Renderer2D.cpp
433 add_library(IRRIOOBJ OBJECT
444 add_library(IRROTHEROBJ OBJECT
456 target_compile_definitions(IRROTHEROBJ PRIVATE ENABLE_OPENGL3)
460 target_sources(IRROTHEROBJ PRIVATE
461 Android/CIrrDeviceAndroid.cpp
462 Android/CAndroidAssetReader.cpp
463 Android/CAndroidAssetFileArchive.cpp
464 Android/CKeyEventWrapper.cpp
467 # Build all IRROTHEROBJ sources as objc++, including the .cpp's
468 set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
469 target_sources(IRROTHEROBJ PRIVATE
476 target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_COMPILE_WITH_X11_)
480 target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_LINUX_X11_XINPUT2_)
484 target_compile_definitions(IRROTHEROBJ PRIVATE _IRR_LINUX_XCURSOR_)
487 add_library(IRRGUIOBJ OBJECT
493 CGUIFileOpenDialog.cpp
507 add_library(IrrlichtMt)
509 IRRMESHOBJ IRROBJ IRRVIDEOOBJ
510 IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
511 # Set include directories for object library compilation
512 target_include_directories(${object_lib} PRIVATE ${link_includes})
513 # Add objects from object library to main library
514 target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
517 # Alias target provides add_submodule compatibility
518 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
520 target_include_directories(IrrlichtMt
522 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
523 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
524 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
529 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
532 target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_) # used in _IRR_DEBUG_BREAK_IF definition in a public header
534 target_compile_definitions(IrrlichtMt INTERFACE "IRRLICHT_API=${API_IMPORT}")
535 if(APPLE OR ANDROID OR EMSCRIPTEN)
536 target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
539 set_target_properties(IrrlichtMt PROPERTIES
540 VERSION ${PROJECT_VERSION}
544 set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
547 # Installation of library
549 set(INSTALL_TARGETS IrrlichtMt native_app_glue)
551 set(INSTALL_TARGETS IrrlichtMt)
554 install(TARGETS ${INSTALL_TARGETS}
555 EXPORT IrrlichtMt-export
556 DESTINATION "${CMAKE_INSTALL_LIBDIR}"