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