1#-------------------------------------------------------------------
2# This file is part of the CMake build system for OGRE
3#     (Object-oriented Graphics Rendering Engine)
4# For the latest info, see http://www.ogre3d.org/
5#
6# The contents of this file are placed in the public domain. Feel
7# free to make use of it in any way you like.
8#-------------------------------------------------------------------
9
10#######################################################################
11# This file takes care of configuring Ogre to build with the settings
12# given in CMake. It creates the necessary config.h file and will
13# also prepare package files for pkg-config and CMake.
14#######################################################################
15
16string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_LOWER)
17if(${BUILD_TYPE_LOWER} STREQUAL "debug")
18  set(OGRE_DEBUG_MODE 1)
19endif()
20
21if (APPLE_IOS)
22  set(OGRE_SET_BUILD_PLATFORM_APPLE_IOS 1)
23  set(OGRE_STATIC TRUE)
24  set(OGRE_STATIC_LIB TRUE)
25  set(OGRE_CONFIG_ENABLE_PVRTC TRUE)
26endif()
27
28# should we build static libs?
29if (OGRE_STATIC)
30  set(OGRE_LIB_TYPE STATIC)
31else ()
32  set(OGRE_LIB_TYPE SHARED)
33endif ()
34
35# configure threading options
36set(OGRE_THREAD_PROVIDER 0)
37if (OGRE_CONFIG_THREADS)
38	if (OGRE_CONFIG_THREAD_PROVIDER STREQUAL "boost")
39		set(OGRE_THREAD_PROVIDER 1)
40		include_directories(${Boost_INCLUDE_DIRS})
41		# On MSVC Boost usually tries to autolink boost libraries. However since
42		# this behaviour is not available on all compilers, we need to find the libraries
43		# ourselves, anyway. Disable auto-linking to avoid mess-ups.
44		add_definitions(-DBOOST_ALL_NO_LIB)
45        if (MINGW AND Boost_USE_STATIC_LIBS)
46            # mingw needs this to link against static thread libraries
47            add_definitions(-DBOOST_THREAD_USE_LIB)
48        endif ()
49		set(OGRE_THREAD_LIBRARIES ${Boost_LIBRARIES})
50	endif ()
51
52	if (OGRE_CONFIG_THREAD_PROVIDER STREQUAL "poco")
53		set(OGRE_THREAD_PROVIDER 2)
54		include_directories(${POCO_INCLUDE_DIRS})
55		set(OGRE_THREAD_LIBRARIES ${POCO_LIBRARIES})
56	endif ()
57
58	if (OGRE_CONFIG_THREAD_PROVIDER STREQUAL "tbb")
59		set(OGRE_THREAD_PROVIDER 3)
60		include_directories(${TBB_INCLUDE_DIRS})
61
62		set(OGRE_THREAD_LIBRARIES ${TBB_LIBRARIES})
63	endif ()
64
65	if (OGRE_CONFIG_THREAD_PROVIDER STREQUAL "std")
66		set(OGRE_THREAD_PROVIDER 4)
67	endif ()
68
69endif()
70
71set(OGRE_ASSERT_MODE 1 CACHE STRING
72	"Enable Ogre asserts and exceptions. Possible values:
73	0 - Standard asserts in debug builds, nothing in release builds.
74	1 - Standard asserts in debug builds, exceptions in release builds.
75	2 - Exceptions in debug builds, exceptions in release builds."
76)
77set_property(CACHE OGRE_ASSERT_MODE PROPERTY STRINGS 0 1 2)
78
79# determine config values depending on build options
80set(OGRE_STATIC_LIB ${OGRE_STATIC})
81set(OGRE_DOUBLE_PRECISION ${OGRE_CONFIG_DOUBLE})
82set(OGRE_NODE_INHERIT_TRANSFORM ${OGRE_SET_NODE_INHERIT_TRANSFORM})
83set(OGRE_SET_ASSERT_MODE ${OGRE_ASSERT_MODE})
84set(OGRE_SET_THREADS ${OGRE_CONFIG_THREADS})
85set(OGRE_SET_THREAD_PROVIDER ${OGRE_THREAD_PROVIDER})
86if (NOT OGRE_CONFIG_ENABLE_MESHLOD)
87  set(OGRE_NO_MESHLOD 1)
88endif()
89if (NOT OGRE_CONFIG_ENABLE_DDS)
90  set(OGRE_NO_DDS_CODEC 1)
91endif()
92if (NOT OGRE_CONFIG_ENABLE_PVRTC)
93  set(OGRE_NO_PVRTC_CODEC 1)
94endif()
95if (NOT OGRE_CONFIG_ENABLE_ETC)
96  set(OGRE_NO_ETC_CODEC 1)
97endif()
98if (NOT OGRE_CONFIG_ENABLE_ASTC)
99  set(OGRE_NO_ASTC_CODEC 1)
100endif()
101if (NOT OGRE_CONFIG_ENABLE_ZIP)
102  set(OGRE_NO_ZIP_ARCHIVE 1)
103endif()
104if (NOT OGRE_CONFIG_ENABLE_VIEWPORT_ORIENTATIONMODE)
105  set(OGRE_NO_VIEWPORT_ORIENTATIONMODE 1)
106endif()
107if (NOT OGRE_CONFIG_ENABLE_GLES2_CG_SUPPORT)
108  set(OGRE_NO_GLES2_CG_SUPPORT 1)
109endif()
110if (NOT OGRE_CONFIG_ENABLE_GLES2_GLSL_OPTIMISER)
111  set(OGRE_NO_GLES2_GLSL_OPTIMISER 1)
112endif()
113if (NOT OGRE_CONFIG_ENABLE_GL_STATE_CACHE_SUPPORT)
114  set(OGRE_NO_GL_STATE_CACHE_SUPPORT 1)
115endif()
116if (NOT OGRE_CONFIG_ENABLE_GLES3_SUPPORT)
117  set(OGRE_NO_GLES3_SUPPORT 1)
118endif()
119if (NOT OGRE_CONFIG_ENABLE_TBB_SCHEDULER)
120  set(OGRE_NO_TBB_SCHEDULER 1)
121endif()
122if (OGRE_TEST_BIG_ENDIAN)
123  set(OGRE_CONFIG_BIG_ENDIAN 1)
124else ()
125  set(OGRE_CONFIG_LITTLE_ENDIAN 1)
126endif ()
127set(RTSHADER_SYSTEM_BUILD_CORE_SHADERS ${OGRE_BUILD_RTSHADERSYSTEM_CORE_SHADERS})
128set(RTSHADER_SYSTEM_BUILD_EXT_SHADERS ${OGRE_BUILD_RTSHADERSYSTEM_EXT_SHADERS})
129if (NOT OGRE_CONFIG_ENABLE_QUAD_BUFFER_STEREO)
130  set(OGRE_NO_QUAD_BUFFER_STEREO 1)
131endif()
132if(SDL2_FOUND OR EMSCRIPTEN)
133    set(OGRE_BITES_HAVE_SDL 1)
134endif()
135
136# generate OgreBuildSettings.h
137configure_file(${OGRE_TEMPLATES_DIR}/OgreBuildSettings.h.in ${PROJECT_BINARY_DIR}/include/OgreBuildSettings.h @ONLY)
138configure_file(${OGRE_TEMPLATES_DIR}/OgreRTShaderConfig.h.in ${PROJECT_BINARY_DIR}/include/OgreRTShaderConfig.h @ONLY)
139configure_file(${OGRE_TEMPLATES_DIR}/OgreGLES2Config.h.in ${PROJECT_BINARY_DIR}/include/OgreGLES2Config.h @ONLY)
140
141set(OGRE_LIB_SUFFIX "")
142
143if (OGRE_STATIC)
144  set(OGRE_LIB_SUFFIX "${OGRE_LIB_SUFFIX}Static")
145endif ()
146if (BUILD_TYPE_LOWER STREQUAL "debug" AND WIN32)
147  set(OGRE_LIB_SUFFIX "${OGRE_LIB_SUFFIX}_d")
148endif ()
149
150# Create the pkg-config package files on Unix systems
151if (UNIX)
152  set(OGRE_PLUGIN_PREFIX "")
153  set(OGRE_PLUGIN_EXT ".so")
154  set(OGRE_PAGING_ADDITIONAL_PACKAGES "")
155  if (OGRE_STATIC)
156    set(OGRE_PLUGIN_PREFIX "lib")
157    set(OGRE_PLUGIN_EXT ".a")
158  endif ()
159
160  set(OGRE_ADDITIONAL_LIBS "")
161  set(OGRE_ADDITIONAL_INCLUDE_DIRS "")
162  if (APPLE AND NOT APPLE_IOS)
163    set(OGRE_ADDITIONAL_INCLUDE_DIRS "-I\${includedir}/OGRE/OSX")
164  endif ()
165  set(OGRE_CFLAGS "")
166  set(OGRE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
167  if (OGRE_CONFIG_THREADS GREATER 0)
168    set(OGRE_CFLAGS "-pthread")
169    set(OGRE_ADDITIONAL_LIBS "${OGRE_ADDITIONAL_LIBS} -lpthread")
170  endif ()
171  if (OGRE_STATIC)
172    if (OGRE_CONFIG_THREADS)
173      set(OGRE_ADDITIONAL_LIBS "${OGRE_ADDITIONAL_LIBS} -lboost-thread-mt")
174    endif ()
175    # there is no pkgconfig file for freeimage, so we need to add that lib manually
176    set(OGRE_ADDITIONAL_LIBS "${OGRE_ADDITIONAL_LIBS} -lfreeimage")
177    configure_file(${OGRE_TEMPLATES_DIR}/OGREStatic.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE.pc @ONLY)
178  else ()
179    configure_file(${OGRE_TEMPLATES_DIR}/OGRE.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE.pc @ONLY)
180  endif ()
181  install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
182
183  # configure additional packages
184
185  if (OGRE_BUILD_PLUGIN_PCZ)
186    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-PCZ.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-PCZ.pc @ONLY)
187    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-PCZ.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
188  endif ()
189
190  if (OGRE_BUILD_COMPONENT_PAGING)
191    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-Paging.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Paging.pc @ONLY)
192    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Paging.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
193  endif ()
194
195  if (OGRE_BUILD_COMPONENT_MESHLODGENERATOR)
196    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-MeshLodGenerator.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-MeshLodGenerator.pc @ONLY)
197    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-MeshLodGenerator.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
198  endif ()
199
200  if (OGRE_BUILD_COMPONENT_TERRAIN)
201    if (OGRE_BUILD_COMPONENT_PAGING)
202      set(OGRE_PAGING_ADDITIONAL_PACKAGES ", OGRE-Paging = ${OGRE_VERSION}")
203    endif ()
204    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-Terrain.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Terrain.pc @ONLY)
205    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Terrain.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
206  endif ()
207
208  if (OGRE_BUILD_COMPONENT_RTSHADERSYSTEM)
209    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-RTShaderSystem.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-RTShaderSystem.pc @ONLY)
210    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-RTShaderSystem.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
211  endif ()
212
213  if (OGRE_BUILD_COMPONENT_PROPERTY)
214    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-Property.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Property.pc @ONLY)
215    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Property.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
216  endif ()
217
218  if (OGRE_BUILD_COMPONENT_OVERLAY)
219    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-Overlay.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Overlay.pc @ONLY)
220    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Overlay.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
221  endif ()
222
223  if (OGRE_BUILD_COMPONENT_VOLUME)
224    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-Volume.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Volume.pc @ONLY)
225    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Volume.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
226  endif ()
227
228  if (OGRE_BUILD_COMPONENT_BITES)
229    if (SDL2_FOUND)
230      set(OGRE_BITES_ADDITIONAL_PACKAGES ", sdl2")
231    endif ()
232    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-Bites.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Bites.pc @ONLY)
233    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-Bites.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
234  endif ()
235
236  if (OGRE_BUILD_COMPONENT_HLMS)
237    configure_file(${OGRE_TEMPLATES_DIR}/OGRE-HLMS.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-HLMS.pc @ONLY)
238    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/OGRE-HLMS.pc DESTINATION ${OGRE_LIB_DIRECTORY}/pkgconfig)
239  endif ()
240endif ()
241
242if(OGRE_CONFIG_STATIC_LINK_CRT)
243#We statically link to reduce dependencies
244foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
245    if(${flag_var} MATCHES "/MD")
246        string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
247    endif(${flag_var} MATCHES "/MD")
248    if(${flag_var} MATCHES "/MDd")
249        string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
250    endif(${flag_var} MATCHES "/MDd")
251endforeach(flag_var)
252endif(OGRE_CONFIG_STATIC_LINK_CRT)
253