1 option(BUILD_SHARED_LIBS "Build shared library" TRUE)
2 option(USE_SDL2 "Use the SDL2 backend" FALSE)
6 add_definitions(-DIRRLICHT_EXPORTS)
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\")))")
14 add_definitions(-D_IRR_STATIC_LIB_)
16 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
17 add_definitions(-D_DEBUG)
19 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
20 set(CMAKE_CXX_STANDARD 11)
21 set(CMAKE_CXX_STANDARD_REQUIRED ON)
23 if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
24 set(CMAKE_CXX_FLAGS_RELEASE "-O3")
25 set(CMAKE_CXX_FLAGS_DEBUG "-g")
27 add_compile_options(-Wall -pipe -fno-exceptions -fno-rtti)
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)
35 message(STATUS "Detected Intel x86: using SSE instead of x87 FPU")
36 add_compile_options(-mfpmath=sse -msse)
41 string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " msvcrt.lib") # ???? fuck off
43 add_compile_options(/GR- /Zl)
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)
52 # Sanity-check version
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\
61 int main() {}" REVISION_SANITY_CHECK)
62 if(NOT REVISION_SANITY_CHECK)
63 message(FATAL_ERROR "IrrlichtMt revision number mismatches between CMake and headers.")
66 # Platform-independent configuration (hard-coded currently)
68 -DIRR_ENABLE_BUILTIN_FONT
69 -D_IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
72 # Platform-specific configuration
74 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
84 add_definitions(-D_IRR_WINDOWS_ -D_IRR_WINDOWS_API_)
87 add_definitions(-D_IRR_IOS_PLATFORM_ -D_IRR_COMPILE_WITH_IOS_BUILTIN_MAIN_)
89 message(WARNING "SDL2 backend is not supported on iOS")
94 add_definitions(-D_IRR_OSX_PLATFORM_)
97 add_definitions(-D_IRR_ANDROID_PLATFORM_ -D_IRR_COMPILE_ANDROID_ASSET_READER_)
99 message(WARNING "SDL2 backend is not supported on Android")
102 set(DEVICE "Android")
104 add_definitions(-D_IRR_EMSCRIPTEN_PLATFORM_ -D_IRR_COMPILE_WITH_EGL_MANAGER_)
105 set(LINUX_PLATFORM TRUE)
108 add_definitions(-D_IRR_SOLARIS_PLATFORM_ -D_IRR_POSIX_API_)
111 add_definitions(-D_IRR_POSIX_API_)
112 set(LINUX_PLATFORM TRUE)
120 option(USE_X11 "Use X11" TRUE)
122 add_definitions(-D_IRR_COMPILE_WITH_X11_)
126 add_definitions(-D_IRR_LINUX_PLATFORM_)
129 if(LINUX_PLATFORM AND USE_X11)
130 add_definitions(-D_IRR_COMPILE_WITH_X11_)
132 option(USE_XINPUT2 "Use XInput2" TRUE)
134 add_definitions(-D_IRR_LINUX_X11_XINPUT2_)
137 option(USE_XCURSOR "Use XCursor" FALSE)
139 add_definitions(-D_IRR_LINUX_XCURSOR_)
142 set(USE_XINPUT2 FALSE)
143 set(USE_XCURSOR FALSE)
146 add_definitions("-D_IRR_COMPILE_WITH_${DEVICE}_DEVICE_")
150 if(NOT (BSD OR SOLARIS OR EMSCRIPTEN))
151 add_definitions(-D_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
156 option(ENABLE_OPENGL3 "Enable OpenGL 3+" FALSE)
158 if(IOS OR ANDROID OR EMSCRIPTEN)
159 set(ENABLE_OPENGL FALSE)
161 option(ENABLE_OPENGL "Enable OpenGL" TRUE)
164 if(EMSCRIPTEN OR OSX)
165 set(ENABLE_GLES1 FALSE)
168 set(DEFAULT_GLES1 TRUE)
170 option(ENABLE_GLES1 "Enable OpenGL ES" ${DEFAULT_GLES1})
174 set(ENABLE_GLES2 FALSE)
175 set(ENABLE_WEBGL1 FALSE)
177 if(ANDROID OR IOS OR EMSCRIPTEN)
178 set(DEFAULT_GLES2 TRUE)
181 set(DEFAULT_WEBGL1 TRUE)
183 option(ENABLE_GLES2 "Enable OpenGL ES 2+" ${DEFAULT_GLES2})
184 option(ENABLE_WEBGL1 "Enable WebGL (requires GLES2)" ${DEFAULT_WEBGL1})
186 set(ENABLE_GLES2 TRUE)
191 add_definitions(-D_IRR_COMPILE_WITH_OPENGL_)
192 if(DEVICE STREQUAL "WINDOWS")
193 add_definitions(-D_IRR_COMPILE_WITH_WGL_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
194 elseif(DEVICE STREQUAL "X11")
195 add_definitions(-D_IRR_COMPILE_WITH_GLX_MANAGER_ -D_IRR_OPENGL_USE_EXTPOINTER_)
196 elseif(DEVICE STREQUAL "OSX")
197 add_definitions(-D_IRR_COMPILE_WITH_NSOGL_MANAGER_)
198 elseif(DEVICE STREQUAL "SDL")
199 add_definitions(-D_IRR_OPENGL_USE_EXTPOINTER_)
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_)
207 elseif(DEVICE STREQUAL "IOS")
208 add_definitions(-D_IRR_COMPILE_WITH_EAGL_MANAGER_)
213 add_definitions(-D_IRR_COMPILE_WITH_OGLES2_)
214 if(DEVICE MATCHES "^WINDOWS|X11|ANDROID$" OR EMSCRIPTEN)
215 add_definitions(-D_IRR_COMPILE_WITH_EGL_MANAGER_ -D_IRR_OGLES2_USE_EXTPOINTER_)
216 elseif(DEVICE STREQUAL "IOS")
217 add_definitions(-D_IRR_COMPILE_WITH_EAGL_MANAGER_)
222 add_definitions(-D_IRR_COMPILE_WITH_WEBGL1_)
227 include(TestBigEndian)
228 TEST_BIG_ENDIAN(BIG_ENDIAN)
230 add_definitions(-D__BIG_ENDIAN__)
233 # Configuration report
235 message(STATUS "Device: ${DEVICE}")
236 message(STATUS "OpenGL: ${ENABLE_OPENGL}")
237 message(STATUS "OpenGL ES: ${ENABLE_GLES1}")
238 message(STATUS "OpenGL ES 2: ${ENABLE_GLES2}")
239 message(STATUS "WebGL: ${ENABLE_WEBGL1}")
243 find_package(ZLIB REQUIRED)
244 find_package(JPEG REQUIRED)
245 find_package(PNG REQUIRED)
249 # only tested on Android, probably works on Linux (is this needed anywhere else?)
250 find_library(OPENGLES_LIBRARY NAMES GLESv1_CM REQUIRED)
251 find_library(EGL_LIBRARY NAMES EGL REQUIRED)
253 message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
256 find_package(OpenGLES2 REQUIRED)
259 set(OpenGL_GL_PREFERENCE "LEGACY")
260 find_package(OpenGL REQUIRED)
263 find_package(SDL2 CONFIG REQUIRED)
264 message(STATUS "Found SDL2: ${SDL2_LIBRARIES}")
267 # Platform-specific libs
271 add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
273 find_library(COCOA_LIB Cocoa REQUIRED)
274 find_library(IOKIT_LIB IOKit REQUIRED)
276 add_definitions(-DGL_SILENCE_DEPRECATION)
279 find_package(X11 REQUIRED)
280 if(${USE_XINPUT2} AND NOT X11_Xi_FOUND)
281 message(FATAL_ERROR "XInput not found")
286 "${PROJECT_SOURCE_DIR}/include"
287 "${CMAKE_CURRENT_SOURCE_DIR}"
289 "${ZLIB_INCLUDE_DIR}"
290 "${JPEG_INCLUDE_DIR}"
292 "${SDL2_INCLUDE_DIRS}"
294 ${OPENGL_INCLUDE_DIR}
295 ${OPENGLES2_INCLUDE_DIR}
298 "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
310 ${OPENGLES2_LIBRARIES}
313 "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
316 "$<$<PLATFORM_ID:Windows>:gdi32>"
317 "$<$<PLATFORM_ID:Windows>:winmm>"
325 CB3DMeshFileLoader.cpp
326 COBJMeshFileLoader.cpp
330 add_library(IRRMESHOBJ OBJECT
334 CAnimatedMeshSceneNode.cpp
338 add_library(IRROBJ OBJECT
339 CBillboardSceneNode.cpp
341 CDummyTransformationSceneNode.cpp
344 CSceneCollisionManager.cpp
351 COpenGLCacheHandler.cpp
353 COpenGLShaderMaterialRenderer.cpp
354 COpenGLSLMaterialRenderer.cpp
355 COpenGLExtensionHandler.cpp
357 COGLESExtensionHandler.cpp
359 COGLES2ExtensionHandler.cpp
360 COGLES2FixedPipelineRenderer.cpp
361 COGLES2MaterialRenderer.cpp
362 COGLES2Renderer2D.cpp
382 add_library(IRRVIDEOOBJ OBJECT
390 message(SEND_ERROR "OpenGL3 support requires SDL2")
392 target_sources(IRRVIDEOOBJ PUBLIC
394 OpenGL/ExtensionHandler.cpp
395 OpenGL/FixedPipelineRenderer.cpp
396 OpenGL/MaterialRenderer.cpp
397 OpenGL/Renderer2D.cpp
401 add_library(IRRIOOBJ OBJECT
412 add_library(IRROTHEROBJ OBJECT
424 target_compile_definitions(IRROTHEROBJ PRIVATE ENABLE_OPENGL3)
428 target_sources(IRROTHEROBJ PRIVATE
429 Android/CIrrDeviceAndroid.cpp
430 Android/CAndroidAssetReader.cpp
431 Android/CAndroidAssetFileArchive.cpp
432 Android/CKeyEventWrapper.cpp
435 # Build all IRROTHEROBJ sources as objc++, including the .cpp's
436 set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
437 target_sources(IRROTHEROBJ PRIVATE
443 add_library(IRRGUIOBJ OBJECT
449 CGUIFileOpenDialog.cpp
463 add_library(IrrlichtMt)
465 IRRMESHOBJ IRROBJ IRRVIDEOOBJ
466 IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
467 # Set include directories for object library compilation
468 target_include_directories(${object_lib} PRIVATE ${link_includes})
469 # Add objects from object library to main library
470 target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
473 # Alias target provides add_submodule compatibility
474 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
476 target_include_directories(IrrlichtMt
478 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
479 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
480 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
485 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
488 target_compile_definitions(IrrlichtMt INTERFACE _IRR_WINDOWS_API_)
490 if(WIN32 AND BUILD_SHARED_LIBS)
491 target_compile_definitions(IrrlichtMt INTERFACE IRRLICHT_API=__declspec(dllimport))
493 if(APPLE OR ANDROID OR EMSCRIPTEN)
494 target_compile_definitions(IrrlichtMt PUBLIC IRR_MOBILE_PATHS)
497 set_target_properties(IrrlichtMt PROPERTIES
498 VERSION ${PROJECT_VERSION}
502 set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
505 # Installation of library
507 set(INSTALL_TARGETS IrrlichtMt native_app_glue)
509 set(INSTALL_TARGETS IrrlichtMt)
512 install(TARGETS ${INSTALL_TARGETS}
513 EXPORT IrrlichtMt-export
514 DESTINATION "${CMAKE_INSTALL_LIBDIR}"