blob: 44d33729f9938794e13370eebbb5fc81bacf3f50 [file] [log] [blame]
Corentin Wallez0866b292015-12-09 13:49:40 -05001cmake_minimum_required(VERSION 2.8)
2
3project(SwiftShaders CXX)
4
5set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release RelWithDebInfo." )
6
7option(BUILD_EGL "Build the EGL library" 1)
8if(WIN32)
9 option(BUILD_GL32 "Build the OpenGL 32 library" 1)
10endif()
11option(BUILD_GLESv2 "Build the OpenGL ES 2 library" 1)
12option(BUILD_GLES_CM "Build the OpenGL ES 1.1 library" 1)
13
14option(USE_GROUP_SOURCES "Group the source files in a folder tree for visual studio" 1)
15
16# LLVM disallows calling cmake . from the main LLVM dir, the reason is that
17# it builds header files that could overwrite the orignal ones. Here we
18# want to include LLVM as a subdirectory and even though it wouldn't cause
19# the problem, if cmake . is called from the main dir, the condition that
20# LLVM checkes, "CMAKE_SOURCE_DIR == CMAKE_BINARY_DIR" will be true. So we
21# disallow it ourselves too to. In addition if there are remining CMakeFiles
22# and CMakeCache in the directory, cmake .. from a subdirectory will still
23# try to build from the main directory so we instruct users to delete these
24# files when they get the error.
25if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
26 message(FATAL_ERROR "In source builds are not allowed by LLVM, please create a build/ directory and build from there. You may have to delete the CMakeCache.txt file and CMakeFiles directory that are next to the CMakeLists.txt.")
27endif()
28
29set_property(GLOBAL PROPERTY USE_FOLDERS ON)
30
31###########################################################
32# Detect system
33###########################################################
34
35if (CMAKE_SYSTEM_NAME MATCHES "Linux")
36 set(LINUX ON)
37elseif(WIN32)
38elseif(APPLE)
39else()
40 message(FATAL_ERROR "Platform is not supported")
41endif()
42
43if(CMAKE_SIZEOF_VOID_P EQUAL 8)
44 set(ARCH "x86_64")
45else()
46 set(ARCH "x86")
47endif()
48
49###########################################################
50# Convenience macros
51###########################################################
52
53# Recursively calls source_group on the files of the directory
54# so that Visual Studio has the files in a folder tree
55macro(group_all_sources directory)
56 file(GLOB files RELATIVE ${CMAKE_SOURCE_DIR}/${directory} ${CMAKE_SOURCE_DIR}/${directory}/*)
57 foreach(file ${files})
58 if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/${directory}/${file})
59 group_all_sources(${directory}/${file})
60 else()
61 string(REPLACE "/" "\\" groupname ${directory})
62 source_group(${groupname} FILES ${CMAKE_SOURCE_DIR}/${directory}/${file})
63 endif()
64 endforeach()
65endmacro()
66
67# Takes target library and a directory where the export map is
68# and add the linker options so that only the API symbols are
69# exported.
70macro(set_target_export_map TARGET DIR)
71 get_target_property(LINKFLAGS ${TARGET} LINK_FLAGS)
72 if(LINKFLAGS MATCHES "NOTFOUND")
73 set(LINKFLAGS "")
74 endif()
75 if(MSVC)
76 set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/DEF:\"${DIR}/${TARGET}.def\"")
77 else()
78 # Both hash-style are needed, because we want both gold and
79 # GNU ld to be able to read our libraries (maybe?).
80 # The version script only exports the API functions and
81 # hides all the others. Gc sections is used in combination
82 # with each functions being in its section, to reduce the
83 # binary size.
84 set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${LINKFLAGS} -Wl,--hash-style=both,--version-script=${DIR}/exports.map,--gc-sections")
85 endif()
86endmacro()
87
88if(USE_GROUP_SOURCES)
89 group_all_sources(src)
90endif()
91
92###########################################################
93# Directories
94###########################################################
95
96set(SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)
97set(OPENGL_DIR ${SOURCE_DIR}/OpenGL)
98set(OPENGL_COMPILER_DIR ${OPENGL_DIR}/compiler)
99set(LLVM_DIR ${SOURCE_DIR}/LLVM)
100set(TESTS_DIR ${CMAKE_SOURCE_DIR}/tests)
101
102###########################################################
103# Compile flags
104###########################################################
105
106macro( set_cpp_flag FLAG )
107 if( ${ARGC} GREATER 1 )
108 set( CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${FLAG}" )
109 else()
110 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}" )
111 endif()
112endmacro()
113
114if(MSVC)
115 set_cpp_flag("/MP")
116 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
117else()
118 set_cpp_flag("--std=c++11")
119 set_cpp_flag("-Wall")
120 set_cpp_flag("-fexceptions")
121
122 # Remove xor, and, or and friends from the list of keywords, they are used
123 # by Reactor
124 set_cpp_flag("-fno-operator-names")
125
126 # LLVM headers requires these flags to be set
127 set_cpp_flag("-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
128
129 if(ARCH EQUAL "x86")
130 set_cpp_flag("-m32")
131 set_cpp_flag("-msse2")
132 set_cpp_flag("-march=i686")
133 endif()
134 if(ARCH EQUAL "x86_64")
135 set_cpp_flag("-m64")
136 set_cpp_flag("-fPIC")
137 set_cpp_flag("-march=core2")
138 endif()
139
140 # Use -g3 to have even more debug info
141 set_cpp_flag("-g -g3" DEBUG)
142 set_cpp_flag("-g -g3" RELWITHDEBINFO)
143 set_cpp_flag("-s" RELEASE)
144
145 # For distribution it is more important to be slim than super optimized
146 # so even in Release we us only -O2
147 set_cpp_flag("-O2" RELEASE)
148 set_cpp_flag("-O2" RELWITHDEBINFO)
149
150 set_cpp_flag("-DNDEBUG" RELEASE)
151 set_cpp_flag("-DNDEBUG" RELWITHDEBINFO)
152 set_cpp_flag("-DANGLE_DISABLE_TRACE" RELEASE)
153 set_cpp_flag("-DANGLE_DISABLE_TRACE" RELWITHDEBINFO)
154
155 # Put each variable and function in its own section so that when linking
156 # with -gc-sections unused functions and variables are removed.
157 set_cpp_flag("-ffunction-sections" RELEASE)
158 set_cpp_flag("-fdata-sections" RELEASE)
159 set_cpp_flag("-fomit-frame-pointer" RELEASE)
160endif()
161
162if( WIN32 )
163 add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
164 set( CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib" )
165endif()
166
167
168###########################################################
169# LLVM
170###########################################################
171
172# We want the code for all of LLVM except the code for non-X86 targets
173file(GLOB_RECURSE LLVM_LIST ${LLVM_DIR}/lib/*.cpp)
174file(GLOB_RECURSE LLVM_ALL_TARGET_LIST ${LLVM_DIR}/lib/Target/*.cpp)
175file(GLOB_RECURSE LLVM_X86_TARGET_LIST ${LLVM_DIR}/lib/Target/X86/*.cpp)
176
177list(REMOVE_ITEM LLVM_LIST ${LLVM_ALL_TARGET_LIST})
178list(APPEND LLVM_LIST ${LLVM_X86_TARGET_LIST})
179list(REMOVE_ITEM LLVM_LIST "${LLVM_DIR}/lib/Target/X86/X86MCInstLower.cpp")
180list(APPEND LLVM_LIST
181 ${LLVM_DIR}/lib/Target/Mangler.cpp
182 ${LLVM_DIR}/lib/Target/TargetData.cpp
183 ${LLVM_DIR}/lib/Target/TargetELFWriterInfo.cpp
184 ${LLVM_DIR}/lib/Target/TargetFrameLowering.cpp
185 ${LLVM_DIR}/lib/Target/TargetInstrInfo.cpp
186 ${LLVM_DIR}/lib/Target/TargetLibraryInfo.cpp
187 ${LLVM_DIR}/lib/Target/TargetLoweringObjectFile.cpp
188 ${LLVM_DIR}/lib/Target/TargetMachine.cpp
189 ${LLVM_DIR}/lib/Target/TargetRegisterInfo.cpp
190 ${LLVM_DIR}/lib/Target/TargetSubtargetInfo.cpp
191)
192
193if(LINUX)
194 set(LLVM_INCLUDE_DIR ${LLVM_DIR}/include-linux)
Corentin Wallezdd0d3382015-12-09 14:42:19 -0500195elseif(APPLE)
196 set(LLVM_INCLUDE_DIR ${LLVM_DIR}/include-osx)
Corentin Wallez0866b292015-12-09 13:49:40 -0500197endif()
198
199list(APPEND LLVM_INCLUDE_DIR
200 ${LLVM_DIR}/include
201 ${LLVM_DIR}/lib/Target/X86
202)
203add_library(llvm STATIC ${LLVM_LIST})
204set_target_properties(llvm PROPERTIES
205 POSITION_INDEPENDENT_CODE 1
206 INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIR}"
207 FOLDER "LLVM"
208)
209
210###########################################################
211# Include Directories
212###########################################################
213
214set(COMMON_INCLUDE_DIR
215 ${SOURCE_DIR}
216 ${SOURCE_DIR}/Common
217 ${SOURCE_DIR}/Main
218 ${SOURCE_DIR}/Reactor
219 ${SOURCE_DIR}/Renderer
220 ${SOURCE_DIR}/Shader
221 ${LLVM_INCLUDE_DIR}
222)
223set(OPENGL_INCLUDE_DIR
224 ${OPENGL_DIR}
225 ${OPENGL_DIR}/include
226 ${COMMON_INCLUDE_DIR}
227)
228
229###########################################################
230# File Lists
231###########################################################
232
233file(GLOB_RECURSE SWIFTSHADER_LIST
234 ${SOURCE_DIR}/Common/*.cpp
235 ${SOURCE_DIR}/Common/*.h
236 ${SOURCE_DIR}/Common/*.hpp
237 ${SOURCE_DIR}/Renderer/*.cpp
238 ${SOURCE_DIR}/Renderer/*.h
239 ${SOURCE_DIR}/Renderer/*.hpp
240 ${SOURCE_DIR}/Shader/*.cpp
241 ${SOURCE_DIR}/Shader/*.h
242 ${SOURCE_DIR}/Shader/*.hpp
243)
244list(APPEND SWIFTSHADER_LIST
245 ${SOURCE_DIR}/Main/Config.cpp
246 ${SOURCE_DIR}/Main/Config.hpp
247 ${SOURCE_DIR}/Main/crc.cpp
248 ${SOURCE_DIR}/Main/crc.h
249 ${SOURCE_DIR}/Main/FrameBuffer.cpp
250 ${SOURCE_DIR}/Main/FrameBuffer.hpp
251 ${SOURCE_DIR}/Main/Logo.cpp
252 ${SOURCE_DIR}/Main/Register.cpp
253 ${SOURCE_DIR}/Main/Register.hpp
254 ${SOURCE_DIR}/Main/serialvalid.cpp
255 ${SOURCE_DIR}/Main/serialvalid.h
256 ${SOURCE_DIR}/Main/SwiftConfig.cpp
257 ${SOURCE_DIR}/Main/SwiftConfig.hpp
258)
259list(REMOVE_ITEM SWIFTSHADER_LIST
260 ${SOURCE_DIR}/Common/DebugAndroid.cpp
261 ${SOURCE_DIR}/Common/DebugAndroid.hpp
262 ${SOURCE_DIR}/Common/GrallocAndroid.cpp
263 ${SOURCE_DIR}/Common/GrallocAndroid.hpp
264)
265
266set(REACTOR_LIST
267 ${SOURCE_DIR}/Reactor/Nucleus.cpp
268 ${SOURCE_DIR}/Reactor/Nucleus.hpp
269 ${SOURCE_DIR}/Reactor/Routine.cpp
270 ${SOURCE_DIR}/Reactor/Routine.hpp
271 ${SOURCE_DIR}/Reactor/RoutineManager.cpp
272 ${SOURCE_DIR}/Reactor/RoutineManager.hpp
273)
274
275file(GLOB_RECURSE EGL_LIST
276 ${OPENGL_DIR}/libEGL/*.cpp
277 ${OPENGL_DIR}/libEGL/*.h
278 ${OPENGL_DIR}/libEGL/*.hpp
279 ${OPENGL_DIR}/common/Object.cpp
280 ${OPENGL_DIR}/common/Object.hpp
281 ${OPENGL_DIR}/common/debug.cpp
282 ${OPENGL_DIR}/common/debug.h
283 ${OPENGL_DIR}/include/*.h
284)
285
286file(GLOB_RECURSE OPENGL_COMMON_LIST
287 ${OPENGL_DIR}/common/*.cpp
288 ${OPENGL_DIR}/common/*.h
289 ${OPENGL_DIR}/common/*.hpp
290 ${OPENGL_DIR}/include/*.h
291)
292list(REMOVE_ITEM OPENGL_COMMON_LIST
293 ${OPENGL_DIR}/common/AndroidCommon.cpp
294 ${OPENGL_DIR}/common/AndroidCommon.hpp
295)
296
297file(GLOB_RECURSE GL32_LIST
298 ${OPENGL_DIR}/libGL/*.cpp
299 ${OPENGL_DIR}/libGL/*.h
300 ${OPENGL_DIR}/libGL/*.hpp
301)
302
303file(GLOB_RECURSE GLES2_LIST
304 ${OPENGL_DIR}/libGLESv2/*.cpp
305 ${OPENGL_DIR}/libGLESv2/*.h
306 ${OPENGL_DIR}/libGLESv2/*.hpp
307)
308
309file(GLOB_RECURSE GLES_CM_LIST
310 ${OPENGL_DIR}/libGLES_CM/*.cpp
311 ${OPENGL_DIR}/libGLES_CM/*.h
312 ${OPENGL_DIR}/libGLES_CM/*.hpp
313)
314
315file(GLOB_RECURSE OPENGL_COMPILER_LIST
316 ${OPENGL_COMPILER_DIR}/*.cpp
317 ${OPENGL_COMPILER_DIR}/*.h
318 ${OPENGL_COMPILER_DIR}/*.hpp
319)
320file(GLOB_RECURSE OPENGL_COMPILER_OS_SPECIFIC_LIST
321 ${OPENGL_COMPILER_DIR}/ossource*.cpp
322 ${OPENGL_COMPILER_DIR}/ossource*.h
323 ${OPENGL_COMPILER_DIR}/ossource*.hpp
324)
325list(REMOVE_ITEM OPENGL_COMPILER_LIST ${OPENGL_COMPILER_OS_SPECIFIC_LIST})
326
327###########################################################
328# Append OS specific files to lists
329###########################################################
330
331if(WIN32)
332 list(APPEND SWIFTSHADER_LIST
333 ${SOURCE_DIR}/Main/FrameBufferDD.cpp
334 ${SOURCE_DIR}/Main/FrameBufferDD.hpp
335 ${SOURCE_DIR}/Main/FrameBufferGDI.cpp
336 ${SOURCE_DIR}/Main/FrameBufferGDI.hpp
337 ${SOURCE_DIR}/Main/FrameBufferWin.cpp
338 ${SOURCE_DIR}/Main/FrameBufferWin.hpp
339 ${SOURCE_DIR}/Reactor/DLL.cpp
340 ${SOURCE_DIR}/Reactor/DLL.hpp
341 )
342 list(APPEND OPENGL_COMPILER_LIST ${OPENGL_COMPILER_DIR}/ossource_win.cpp)
343 list(APPEND EGL_LIST ${OPENGL_DIR}/libEGL/libEGL.rc)
344 list(APPEND GL32_LIST ${OPENGL_DIR}/libGL/libGL.rc)
345 list(APPEND GLES2_LIST ${OPENGL_DIR}/libGLESv2/libGLESv2.rc)
346 list(APPEND GLES_CM_LIST ${OPENGL_DIR}/libGLES_CM/libGLES_CM.rc)
347elseif(LINUX)
348 list(APPEND SWIFTSHADER_LIST
349 ${SOURCE_DIR}/Main/FrameBufferX11.cpp
350 ${SOURCE_DIR}/Main/FrameBufferX11.hpp
351 ${SOURCE_DIR}/Main/libX11.cpp
352 ${SOURCE_DIR}/Main/libX11.hpp
353 )
354 list(APPEND OPENGL_COMPILER_LIST
355 ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
356 )
357endif()
358
359if(WIN32)
360 set(OS_LIBS odbc32 odbccp32 WS2_32 dxguid)
361elseif(LINUX)
362 set(OS_LIBS dl X11 Xext pthread)
363endif()
364
365###########################################################
366# SwiftShaders Targets
367###########################################################
368
369add_library(SwiftShader STATIC ${SWIFTSHADER_LIST})
370set_target_properties(SwiftShader PROPERTIES
371 INCLUDE_DIRECTORIES "${COMMON_INCLUDE_DIR}"
372 POSITION_INDEPENDENT_CODE 1
373 FOLDER "Core"
374)
375target_link_libraries(SwiftShader ${OS_LIBS})
376
377add_library(Reactor STATIC ${REACTOR_LIST})
378set_target_properties(Reactor PROPERTIES
379 INCLUDE_DIRECTORIES "${COMMON_INCLUDE_DIR}"
380 POSITION_INDEPENDENT_CODE 1
381 FOLDER "Core"
382)
383target_link_libraries(Reactor llvm ${OS_LIBS})
384
385add_library(GLCommon STATIC ${OPENGL_COMMON_LIST})
386set_target_properties(GLCommon PROPERTIES
387 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
388 POSITION_INDEPENDENT_CODE 1
389 FOLDER "OpenGL"
390)
391target_link_libraries(GLCommon ${OS_LIBS})
392
393add_library(GLCompiler STATIC ${OPENGL_COMPILER_LIST})
394set_target_properties(GLCompiler PROPERTIES
395 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
396 POSITION_INDEPENDENT_CODE 1
397 FOLDER "OpenGL"
398)
399target_link_libraries(GLCompiler ${OS_LIBS})
400
401if(BUILD_EGL)
402 add_library(libEGL SHARED ${EGL_LIST})
403 set_target_properties(libEGL PROPERTIES
404 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
405 FOLDER "OpenGL"
406 COMPILE_DEFINITIONS "EGL_EGLEXT_PROTOTYPES"
407 PREFIX ""
408 )
409 set_target_export_map(libEGL ${SOURCE_DIR}/OpenGL/libEGL)
410 target_link_libraries(libEGL ${OS_LIBS})
411endif()
412
413if(BUILD_GL32)
414 add_library(libGL SHARED ${GL32_LIST})
415 set_target_properties(libGL PROPERTIES
416 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
417 FOLDER "OpenGL"
418 COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
419 PREFIX ""
420 )
421 set_target_export_map(libGL ${SOURCE_DIR}/OpenGL/libGL)
422 target_link_libraries(libGL SwiftShader Reactor GLCommon GLCompiler ${OS_LIBS})
423endif()
424
425if(BUILD_GLESv2)
426 add_library(libGLESv2 SHARED ${GLES2_LIST})
427 set_target_properties(libGLESv2 PROPERTIES
428 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
429 FOLDER "OpenGL"
430 COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
431 PREFIX ""
432 )
433 set_target_export_map(libGLESv2 ${SOURCE_DIR}/OpenGL/libGLESv2)
434 target_link_libraries(libGLESv2 SwiftShader Reactor GLCommon GLCompiler ${OS_LIBS})
435endif()
436
437if(BUILD_GLES_CM)
438 add_library(libGLES_CM SHARED ${GLES_CM_LIST})
439 set_target_properties(libGLES_CM PROPERTIES
440 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
441 FOLDER "OpenGL"
442 COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
443 PREFIX ""
444 )
445 set_target_export_map(libGLES_CM ${SOURCE_DIR}/OpenGL/libGLES_CM)
446 target_link_libraries(libGLES_CM SwiftShader Reactor GLCommon GLCompiler ${OS_LIBS})
447endif()
448
449###########################################################
450# Extra programs
451###########################################################
452
453if (LINUX)
454 add_executable(OGLES2HelloAPI tests/third_party/PowerVR/Examples/Beginner/01_HelloAPI/OGLES2/OGLES2HelloAPI_LinuxX11.cpp)
455 target_link_libraries(OGLES2HelloAPI dl X11 EGL GLESv2)
456endif()