]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMakeLists.txt
122bd586e31e4e0247d63d2583ec7af4aa80fe33
[irrlicht.git] / source / Irrlicht / CMakeLists.txt
1 option(BUILD_SHARED_LIBS "Build shared library" TRUE)
2
3 # Compiler flags
4
5 add_definitions(-DIRRLICHT_EXPORTS)
6 if(NOT BUILD_SHARED_LIBS)
7         add_definitions(-D_IRR_STATIC_LIB_)
8 endif()
9 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
10         add_definitions(-D_DEBUG)
11 endif()
12 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
13 set(CMAKE_CXX_STANDARD 11)
14 set(CMAKE_CXX_STANDARD_REQUIRED ON)
15
16 if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
17         set(CMAKE_CXX_FLAGS_RELEASE "-O3")
18         set(CMAKE_CXX_FLAGS_DEBUG "-g")
19
20         add_compile_options(-Wall -pipe -fno-exceptions -fno-rtti)
21 elseif(MSVC)
22         string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " msvcrt.lib") # ???? fuck off
23
24         add_compile_options(/GR- /Zl)
25 endif()
26
27 # Required libs
28
29 find_package(ZLIB REQUIRED)
30 find_package(JPEG REQUIRED)
31 find_package(PNG REQUIRED)
32
33 # To configure the features available in this Irrlicht build please edit
34 # include/IrrCompileConfig.h and re-run CMake from a clean state
35 include(CheckSymbolExists)
36 set(CMAKE_REQUIRED_INCLUDES ${PROJECT_SOURCE_DIR}/include)
37 unset(OGLES1_ENABLED CACHE)
38 unset(OGLES2_ENABLED CACHE)
39 unset(OGL_ENABLED CACHE)
40
41 check_symbol_exists(_IRR_COMPILE_WITH_OGLES1_ "IrrCompileConfig.h" OGLES1_ENABLED)
42 if(OGLES1_ENABLED)
43         # only tested on Android, probably works on Linux (is this needed anywhere else?)
44         find_library(OPENGLES_LIBRARY NAMES GLESv1_CM REQUIRED)
45         find_library(EGL_LIBRARY NAMES EGL REQUIRED)
46
47         message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
48 endif()
49 check_symbol_exists(_IRR_COMPILE_WITH_OGLES2_ "IrrCompileConfig.h" OGLES2_ENABLED)
50 if(OGLES2_ENABLED)
51         find_package(OpenGLES2 REQUIRED)
52 endif()
53 check_symbol_exists(_IRR_COMPILE_WITH_OPENGL_ "IrrCompileConfig.h" OGL_ENABLED)
54 if(OGL_ENABLED)
55         set(OpenGL_GL_PREFERENCE "LEGACY")
56         find_package(OpenGL REQUIRED)
57 endif()
58
59 # Platform-specific libs
60
61 if(ANDROID)
62         enable_language(C)
63         add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
64 elseif(APPLE)
65         find_library(COCOA_LIB Cocoa REQUIRED)
66         find_library(IOKIT_LIB IOKit REQUIRED)
67
68         add_definitions(-DGL_SILENCE_DEPRECATION)
69 else()
70         # Unix probably
71         find_package(X11 REQUIRED)
72 endif()
73
74 set(link_includes
75         "${PROJECT_SOURCE_DIR}/include"
76         "${CMAKE_CURRENT_SOURCE_DIR}"
77
78         "${ZLIB_INCLUDE_DIR}"
79         "${JPEG_INCLUDE_DIR}"
80         "${PNG_INCLUDE_DIR}"
81
82         ${OPENGL_INCLUDE_DIR}
83         ${OPENGLES2_INCLUDE_DIR}
84         ${EGL_INCLUDE_DIR}
85
86         "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
87         ${X11_INCLUDE_DIR}
88 )
89
90 set(link_libs
91         "${ZLIB_LIBRARY}"
92         "${JPEG_LIBRARY}"
93         "${PNG_LIBRARY}"
94
95         ${OPENGL_LIBRARIES}
96         ${OPENGLES_LIBRARY}
97         ${OPENGLES2_LIBRARIES}
98         ${EGL_LIBRARY}
99
100         "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
101         ${COCOA_LIB}
102         ${IOKIT_LIB}
103         "$<$<PLATFORM_ID:Windows>:gdi32>"
104         "$<$<PLATFORM_ID:Windows>:winmm>"
105         ${X11_X11_LIB}
106         ${X11_Xxf86vm_LIB}
107 )
108
109 # Source files
110
111 set(IRRMESHLOADER
112         CB3DMeshFileLoader.cpp
113         COBJMeshFileLoader.cpp
114         CXMeshFileLoader.cpp
115 )
116
117 add_library(IRRMESHOBJ OBJECT
118         CSkinnedMesh.cpp
119         CBoneSceneNode.cpp
120         CMeshSceneNode.cpp
121         CAnimatedMeshSceneNode.cpp
122         ${IRRMESHLOADER}
123 )
124
125 add_library(IRROBJ OBJECT
126         CBillboardSceneNode.cpp
127         CCameraSceneNode.cpp
128         CDummyTransformationSceneNode.cpp
129         CEmptySceneNode.cpp
130         CMeshManipulator.cpp
131         CSceneCollisionManager.cpp
132         CSceneManager.cpp
133         CMeshCache.cpp
134         CDefaultSceneNodeFactory.cpp
135 )
136
137 set(IRRDRVROBJ
138         CNullDriver.cpp
139         COpenGLCacheHandler.cpp
140         COpenGLDriver.cpp
141         COpenGLNormalMapRenderer.cpp
142         COpenGLParallaxMapRenderer.cpp
143         COpenGLShaderMaterialRenderer.cpp
144         COpenGLSLMaterialRenderer.cpp
145         COpenGLExtensionHandler.cpp
146         COGLESDriver.cpp
147         COGLESExtensionHandler.cpp
148         COGLES2Driver.cpp
149         COGLES2ExtensionHandler.cpp
150         COGLES2FixedPipelineRenderer.cpp
151         COGLES2MaterialRenderer.cpp
152         COGLES2NormalMapRenderer.cpp
153         COGLES2ParallaxMapRenderer.cpp
154         COGLES2Renderer2D.cpp
155         CWebGL1Driver.cpp
156         CGLXManager.cpp
157         CWGLManager.cpp
158         CEGLManager.cpp
159         mt_opengl_loader.cpp
160 )
161
162 set(IRRIMAGEOBJ
163         CColorConverter.cpp
164         CImage.cpp
165         CImageLoaderBMP.cpp
166         CImageLoaderJPG.cpp
167         CImageLoaderPNG.cpp
168         CImageWriterJPG.cpp
169         CImageWriterPNG.cpp
170 )
171
172 add_library(IRRVIDEOOBJ OBJECT
173         CVideoModeList.cpp
174         CFPSCounter.cpp
175         ${IRRDRVROBJ}
176         ${IRRIMAGEOBJ}
177 )
178
179 add_library(IRRIOOBJ OBJECT
180         CFileList.cpp
181         CFileSystem.cpp
182         CLimitReadFile.cpp
183         CMemoryFile.cpp
184         CReadFile.cpp
185         CWriteFile.cpp
186         CZipReader.cpp
187         CMountPointReader.cpp
188         CAttributes.cpp
189 )
190
191 add_library(IRROTHEROBJ OBJECT
192         CIrrDeviceSDL.cpp
193         CIrrDeviceLinux.cpp
194         CIrrDeviceConsole.cpp
195         CIrrDeviceStub.cpp
196         CIrrDeviceWin32.cpp
197         CIrrDeviceFB.cpp
198         CLogger.cpp
199         COSOperator.cpp
200         Irrlicht.cpp
201         os.cpp
202         leakHunter.cpp
203         CProfiler.cpp
204         utf8.cpp
205 )
206
207 if(ANDROID)
208         target_sources(IRROTHEROBJ PRIVATE
209                 Android/CIrrDeviceAndroid.cpp
210                 Android/CAndroidAssetReader.cpp
211                 Android/CAndroidAssetFileArchive.cpp
212                 Android/CKeyEventWrapper.cpp
213         )
214 elseif(APPLE)
215         # Build all IRROTHEROBJ sources as objc++, including the .cpp's
216         set_target_properties(IRROTHEROBJ PROPERTIES COMPILE_OPTIONS "-xobjective-c++")
217         target_sources(IRROTHEROBJ PRIVATE
218                 CIrrDeviceOSX.mm
219                 CNSOGLManager.mm
220         )
221 endif()
222
223 add_library(IRRGUIOBJ OBJECT
224         CGUIButton.cpp
225         CGUICheckBox.cpp
226         CGUIComboBox.cpp
227         CGUIContextMenu.cpp
228         CGUIEditBox.cpp
229         CGUIEnvironment.cpp
230         CGUIFileOpenDialog.cpp
231         CGUIFont.cpp
232         CGUIImage.cpp
233         CGUIInOutFader.cpp
234         CGUIListBox.cpp
235         CGUIMenu.cpp
236         CGUIMeshViewer.cpp
237         CGUIMessageBox.cpp
238         CGUIModalScreen.cpp
239         CGUIScrollBar.cpp
240         CGUISpinBox.cpp
241         CGUISkin.cpp
242         CGUIStaticText.cpp
243         CGUITabControl.cpp
244         CGUITable.cpp
245         CGUIToolBar.cpp
246         CGUIWindow.cpp
247         CGUIColorSelectDialog.cpp
248         CDefaultGUIElementFactory.cpp
249         CGUISpriteBank.cpp
250         CGUIImageList.cpp
251         CGUITreeView.cpp
252         CGUIProfiler.cpp
253 )
254
255 # Library
256
257 add_library(IrrlichtMt)
258 foreach(object_lib
259         IRRMESHOBJ IRROBJ IRRVIDEOOBJ
260         IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
261         # Set include directories for object library compilation
262         target_include_directories(${object_lib} PRIVATE ${link_includes})
263         # Add objects from object library to main library
264         target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
265 endforeach()
266
267 # Alias target provides add_submodule compatibility
268 add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
269
270 target_include_directories(IrrlichtMt
271         PUBLIC
272                 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
273                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
274                 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
275         PRIVATE
276                 ${link_includes}
277 )
278
279 target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
280
281 # Propagate static library flag to lib users, only needed for Windows
282 if(NOT BUILD_SHARED_LIBS)
283         target_compile_definitions(IrrlichtMt INTERFACE _IRR_STATIC_LIB_)
284 endif()
285
286 set_target_properties(IrrlichtMt PROPERTIES
287         VERSION ${PROJECT_VERSION}
288         SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
289 )
290
291 if(WIN32)
292         set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
293 endif()
294
295 # Installation of library
296 if(ANDROID)
297         set(INSTALL_TARGETS IrrlichtMt native_app_glue)
298 else()
299         set(INSTALL_TARGETS IrrlichtMt)
300 endif()
301
302 install(TARGETS ${INSTALL_TARGETS}
303         EXPORT IrrlichtMt-export
304         DESTINATION "${CMAKE_INSTALL_LIBDIR}"
305 )