/
CMakeLists.txt
323 lines (237 loc) · 8.17 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
cmake_minimum_required(VERSION 2.8.12)
project( MGL )
# Set the build flags
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED on)
set(CMAKE_BUILD_TYPE Release)
# Fast Math
if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
add_compile_options(-fomit-frame-pointer -freciprocal-math -ffast-math)
# add_compile_options(--param max-inline-insns-auto=100)
# add_compile_options(--param early-inlining-insns=200)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
add_compile_options(/fp:fast)
endif()
function( make_program ex )
# Add new example and set output directory
add_executable( ${ex} ${ex}.cpp )
set_target_properties( ${ex} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "../../bin" )
# Add threading support
if( UNIX )
target_link_libraries( ${ex} pthread )
endif()
endfunction ( make_program )
# Add OpenAL support to executable
function( add_openal ex )
# Find OpenAL on the system
find_package(OpenAL)
if(OPENAL_FOUND)
target_include_directories( ${ex} PUBLIC ${OPENAL_INCLUDE_DIR} )
target_link_libraries( ${ex} ${OPENAL_LIBRARY} )
endif()
if (NOT OPENAL_FOUND)
# Fallback to legacy OPENAL detection
message( STATUS "Falling back to legacy OPENAL detection" )
# Specify CYGWIN
if ( CYGWIN )
# 64 bits
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
# Find OPENAL on CYGWIN
find_library(openal
NAMES libOpenAL32.dll.a
HINTS "/usr/x86_64-w64-mingw32/sys-root/mingw/lib" )
# Include headers directory
target_include_directories( ${ex} PUBLIC "/usr/x86_64-w64-mingw32/sys-root/mingw/include" )
# 32 bits
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
# Find OPENAL on CYGWIN
find_library(openal
NAMES libOpenAL32.dll.a
HINTS "/usr/i686-w64-mingw32/sys-root/mingw/lib" )
# Include headers directory
target_include_directories( ${ex} PUBLIC "/usr/i686-w64-mingw32/sys-root/mingw/include" )
endif()
elseif( WIN32 )
# Find OPENAL on MSVC
find_library(openal
NAMES OpenAL32.lib)
elseif( UNIX )
# Find OPENAL on UNIX
find_library(openal
NAMES openal)
endif()
# Link with openal
target_link_libraries( ${ex} ${openal} )
message( STATUS "vorbisfile=${openal}" )
endif()
endfunction ( add_openal )
# Add OpenGL support to executable
function( add_opengl ex )
# Find X11 on the system
if( UNIX )
find_package(X11 REQUIRED)
target_link_libraries( ${ex} ${X11_LIBRARIES} )
endif()
# Find OpenGL on the system
find_package(OpenGL)
if(OPENGL_FOUND)
target_include_directories( ${ex} PUBLIC ${OPENGL_INCLUDE_DIR} )
target_link_libraries( ${ex} ${OPENGL_LIBRARIES} )
endif()
# Find GLEW on WINDOWS
find_package(GLEW)
if (GLEW_FOUND AND OPENGL_FOUND)
target_include_directories( ${ex} PUBLIC ${GLEW_INCLUDE_DIRS} )
target_link_libraries( ${ex} ${GLEW_LIBRARIES} )
endif()
if (NOT GLEW_FOUND OR NOT OPENGL_FOUND)
# Fallback to legacy OPENGL detection
message( STATUS "Falling back to legacy OPENGL and GLEW detection" )
# Specify CYGWIN
if ( CYGWIN )
# 64 bits
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
# Find GLEW on CYGWIN
find_library(glew
NAMES libglew32.dll.a
HINTS "/usr/x86_64-w64-mingw32/sys-root/mingw/lib" )
# Include headers directory
target_include_directories( ${ex} PUBLIC "/usr/x86_64-w64-mingw32/sys-root/mingw/include" )
# 32 bits
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
# Find GLEW on CYGWIN
find_library(glew
NAMES libglew32.dll.a
HINTS "/usr/i686-w64-mingw32/sys-root/mingw/lib" )
# Include headers directory
target_include_directories( ${ex} PUBLIC "/usr/i686-w64-mingw32/sys-root/mingw/include" )
endif()
# Link with opengl
target_link_libraries( ${ex} gdi32.dll )
target_link_libraries( ${ex} opengl32.dll )
elseif( WIN32 )
# Find GLEW on MSVC
find_library(glew
NAMES glew32.lib)
# Link with opengl
target_link_libraries( ${ex} gdi32.dll )
target_link_libraries( ${ex} opengl32.dll )
elseif( UNIX )
# Find GLEW on UNIX
find_library(glew
NAMES GLEW)
# Link with opengl
target_link_libraries( ${ex} GL )
endif()
# Link with GLEW
target_link_libraries( ${ex} ${glew} )
message( STATUS "glew=${glew}" )
endif()
endfunction ( add_opengl )
# Add FREETYPE2 support to executable
function( add_freetype ex )
# Find FREETYPE
find_package(Freetype REQUIRED)
if (FREETYPE_FOUND)
target_include_directories( ${ex} PUBLIC ${FREETYPE_INCLUDE_DIRS} )
target_link_libraries( ${ex} ${FREETYPE_LIBRARIES} )
endif()
if (NOT FREETYPE_FOUND)
# Specify CYGWIN
if ( CYGWIN )
# 64 bits
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
# Find FREETYPE on CYGWIN
find_library(freetype
NAMES libfreetype.dll.a
HINTS "/usr/x86_64-w64-mingw32/sys-root/mingw/lib" )
# 32 bits
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
# Find FREETYPE on CYGWIN
find_library(freetype
NAMES libfreetype.dll.a
HINTS "/usr/i686-w64-mingw32/sys-root/mingw/lib" )
endif()
elseif( WIN32 )
# Find FREETYPE on MSVC
find_library(freetype
NAMES freetype.lib)
elseif( UNIX )
# Find FREETYPE on UNIX
find_library(freetype
NAMES freetype)
endif()
# Get FREETYPE include path
set(MAKE_CMD "pkg-config")
execute_process(COMMAND ${MAKE_CMD} "freetype2" "--cflags"
RESULT_VARIABLE CMD_ERROR
OUTPUT_VARIABLE CMD_OUTPUT )
# Include FREETYPE path
string(REPLACE "-I" "" CMD_OUTPUT ${CMD_OUTPUT})
separate_arguments(CMD_OUTPUT UNIX_COMMAND "${CMD_OUTPUT}")
target_include_directories( ${ex} PUBLIC ${CMD_OUTPUT} )
# Link with freetype
target_link_libraries( ${ex} ${freetype} )
message( STATUS "freetype=${freetype}" )
endif()
endfunction ( add_freetype )
# Add LIBVORVIS support to executable
function( add_vorbis ex )
# Specify CYGWIN
if ( CYGWIN )
# 64 bits
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
# Find LIBVORBIS on CYGWIN
find_library(libvorbis
NAMES libvorbisfile.dll.a
HINTS "/usr/x86_64-w64-mingw32/sys-root/mingw/lib" )
# Include LIBVORBIS path
target_include_directories( ${ex} PUBLIC "/usr/x86_64-w64-mingw32/sys-root/mingw/include" )
# 32 bits
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
# Find LIBVORBIS on CYGWIN
find_library(libvorbis
NAMES libvorbisfile.dll.a
HINTS "/usr/i686-w64-mingw32/sys-root/mingw/lib" )
# Include LIBVORBIS path
target_include_directories( ${ex} PUBLIC "/usr/i686-w64-mingw32/sys-root/mingw/include" )
endif()
elseif( WIN32 )
# Find LIBVORBIS on MSVC
find_library(libvorbis
NAMES vorbisfile.lib)
elseif( UNIX )
# Find LIBVORBIS on UNIX
find_library(libvorbis
NAMES vorbisfile)
endif()
# Link with libvorbis
target_link_libraries( ${ex} ${libvorbis} )
message( STATUS "vorbisfile=${libvorbis}" )
endfunction ( add_vorbis )
# Source files
include_directories( source/file )
include_directories( source/geom )
include_directories( source/math )
include_directories( source/opt )
include_directories( source/platform )
include_directories( source/renderer )
include_directories( source/scene )
include_directories( source/sound )
include_directories( source/util )
# Test files
include_directories( test/file )
include_directories( test/geom )
include_directories( test/math )
include_directories( test/opt )
include_directories( test/platform )
include_directories( test/renderer )
include_directories( test/scene )
include_directories( test/sound )
include_directories( test/util )
# Bench files
include_directories( bench/scene )
# CPP folders
add_subdirectory( bench )
add_subdirectory( examples )
add_subdirectory( test )