OSDN Git Service

Memory leak fix
[android-x86/external-swiftshader.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8)
2
3 project(SwiftShader C CXX)
4
5 ###########################################################
6 # Detect system
7 ###########################################################
8
9 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
10     set(LINUX ON)
11 elseif(WIN32)
12 elseif(APPLE)
13 else()
14     message(FATAL_ERROR "Platform is not supported")
15 endif()
16
17 if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch")
18     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
19         set(ARCH "aarch64")
20     else()
21         set(ARCH "arm")
22     endif()
23 else()
24     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
25         set(ARCH "x86_64")
26     else()
27         set(ARCH "x86")
28     endif()
29 endif()
30
31 set(CMAKE_MACOSX_RPATH ON)
32
33 ###########################################################
34 # Options
35 ###########################################################
36
37 if(NOT CMAKE_BUILD_TYPE)
38     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release MinSizeRel RelWithDebInfo." FORCE)
39 endif()
40 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)
41
42 option(BUILD_EGL "Build the EGL library" 1)
43 if(WIN32)
44     option(BUILD_GL32 "Build the OpenGL32 library" 1)
45 endif()
46 option(BUILD_GLESv2 "Build the OpenGL ES 2 library" 1)
47 option(BUILD_GLES_CM "Build the OpenGL ES 1.1 library" 1)
48
49 option(USE_GROUP_SOURCES "Group the source files in a folder tree for Visual Studio" 1)
50
51 option(BUILD_SAMPLES "Build sample programs" 1)
52 option(BUILD_TESTS "Build test programs" 1)
53
54 option (MSAN "Build with memory sanitizer" 0)
55 option (ASAN "Build with address sanitizer" 0)
56 option (TSAN "Build with thread sanitizer" 0)
57 option (UBSAN "Build with undefined behavior sanitizer" 0)
58
59 if(ARCH STREQUAL "arm")
60     set(DEFAULT_REACTOR_BACKEND "Subzero")
61 else()
62     set(DEFAULT_REACTOR_BACKEND "LLVM")
63 endif()
64
65 set(REACTOR_BACKEND DEFAULT_REACTOR_BACKEND CACHE STRING "JIT compiler back-end used by Reactor")
66 set_property(CACHE REACTOR_BACKEND PROPERTY STRINGS LLVM Subzero)
67
68 # LLVM disallows calling cmake . from the main LLVM dir, the reason is that
69 # it builds header files that could overwrite the orignal ones. Here we
70 # want to include LLVM as a subdirectory and even though it wouldn't cause
71 # the problem, if cmake . is called from the main dir, the condition that
72 # LLVM checkes, "CMAKE_SOURCE_DIR == CMAKE_BINARY_DIR" will be true. So we
73 # disallow it ourselves too to. In addition if there are remining CMakeFiles
74 # and CMakeCache in the directory, cmake .. from a subdirectory will still
75 # try to build from the main directory so we instruct users to delete these
76 # files when they get the error.
77 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
78     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.")
79 endif()
80
81 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
82
83 ###########################################################
84 # Convenience macros
85 ###########################################################
86
87 # Recursively calls source_group on the files of the directory
88 # so that Visual Studio has the files in a folder tree
89 macro(group_all_sources directory)
90     file(GLOB files RELATIVE ${CMAKE_SOURCE_DIR}/${directory} ${CMAKE_SOURCE_DIR}/${directory}/*)
91     foreach(file ${files})
92         if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/${directory}/${file})
93             group_all_sources(${directory}/${file})
94         else()
95             string(REPLACE "/" "\\" groupname ${directory})
96             source_group(${groupname} FILES ${CMAKE_SOURCE_DIR}/${directory}/${file})
97         endif()
98     endforeach()
99 endmacro()
100
101 # Takes target library and a directory where the export map is
102 # and add the linker options so that only the API symbols are
103 # exported.
104 macro(set_target_export_map TARGET DIR)
105     get_target_property(LINKFLAGS ${TARGET} LINK_FLAGS)
106     if(LINKFLAGS MATCHES "NOTFOUND")
107         set(LINKFLAGS "")
108     endif()
109     if(MSVC)
110         set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/DEF:\"${DIR}/${TARGET}.def\"")
111     elseif(LINUX)
112         # Both hash-style are needed, because we want both gold and
113         # GNU ld to be able to read our libraries (maybe?).
114         # The version script only exports the API functions and
115         # hides all the others. Gc sections is used in combination
116         # with each functions being in its section, to reduce the
117         # binary size.
118         set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${LINKFLAGS} -Wl,--hash-style=both,--version-script=${DIR}/${TARGET}.lds,--gc-sections")
119         set_target_properties(${TARGET} PROPERTIES LINK_DEPENDS "${DIR}/${TARGET}.lds")
120
121         if(NOT MSAN AND NOT ASAN AND NOT TSAN AND NOT UBSAN)
122             set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--no-undefined")
123         endif()
124     endif()
125 endmacro()
126
127 if(USE_GROUP_SOURCES)
128     group_all_sources(src)
129 endif()
130
131 ###########################################################
132 # Directories
133 ###########################################################
134
135 set(SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)
136 set(OPENGL_DIR ${SOURCE_DIR}/OpenGL)
137 set(OPENGL_COMPILER_DIR ${OPENGL_DIR}/compiler)
138 set(LLVM_DIR ${CMAKE_SOURCE_DIR}/third_party/LLVM)
139 set(SUBZERO_DIR ${CMAKE_SOURCE_DIR}/third_party/subzero)
140 set(SUBZERO_LLVM_DIR ${CMAKE_SOURCE_DIR}/third_party/llvm-subzero)
141 set(TESTS_DIR ${CMAKE_SOURCE_DIR}/tests)
142 set(HELLO2_DIR ${CMAKE_SOURCE_DIR}/third_party/PowerVR_SDK/Examples/Beginner/01_HelloAPI/OGLES2)
143
144 ###########################################################
145 # Compile flags
146 ###########################################################
147
148 macro(set_cpp_flag FLAG)
149     if(${ARGC} GREATER 1)
150         set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${FLAG}")
151     else()
152         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
153     endif()
154 endmacro()
155
156 if(MSVC)
157     set_cpp_flag("/MP")
158     add_definitions(-D_CRT_SECURE_NO_WARNINGS)
159 else()
160     set_cpp_flag("--std=c++11")
161     set_cpp_flag("-Wall")
162     set_cpp_flag("-Werror=reorder")
163     set_cpp_flag("-Werror=sign-compare")
164     set_cpp_flag("-fno-exceptions")
165
166     # Remove xor, and, or and friends from the list of keywords, they are used
167     # by Reactor
168     set_cpp_flag("-fno-operator-names")
169
170     # LLVM headers requires these flags to be set
171     set_cpp_flag("-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
172
173     if(ARCH EQUAL "x86")
174         set_cpp_flag("-m32")
175         set_cpp_flag("-msse2")
176         set_cpp_flag("-mfpmath=sse")
177         set_cpp_flag("-march=pentium4")
178         set_cpp_flag("-mtune=generic")
179     endif()
180     if(ARCH EQUAL "x86_64")
181         set_cpp_flag("-m64")
182         set_cpp_flag("-fPIC")
183         set_cpp_flag("-march=x86-64")
184         set_cpp_flag("-mtune=generic")
185     endif()
186     if(LINUX)
187         set_cpp_flag("-DUSE_X11=1")
188     endif()
189
190     # Use -g3 to have even more debug info
191     set_cpp_flag("-g -g3" DEBUG)
192     set_cpp_flag("-g -g3" RELWITHDEBINFO)
193     set_cpp_flag("-s" RELEASE)
194
195     # For distribution it is more important to be slim than super optimized
196     set_cpp_flag("-Os" RELEASE)
197     set_cpp_flag("-Os" RELWITHDEBINFO)
198
199     set_cpp_flag("-DNDEBUG" RELEASE)
200     set_cpp_flag("-DNDEBUG" RELWITHDEBINFO)
201     set_cpp_flag("-DANGLE_DISABLE_TRACE" RELEASE)
202     set_cpp_flag("-DANGLE_DISABLE_TRACE" RELWITHDEBINFO)
203
204     # Put each variable and function in its own section so that when linking
205     # with -gc-sections unused functions and variables are removed.
206     set_cpp_flag("-ffunction-sections" RELEASE)
207     set_cpp_flag("-fdata-sections" RELEASE)
208     set_cpp_flag("-fomit-frame-pointer" RELEASE)
209
210     if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
211         if(MSAN)
212             set_cpp_flag("-fsanitize=memory")
213         elseif(ASAN)
214             set_cpp_flag("-fsanitize=address")
215         elseif(TSAN)
216             set_cpp_flag("-fsanitize=thread")
217         elseif(UBSAN)
218             set_cpp_flag("-fsanitize=undefined -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/third_party/LLVM/ubsan_blacklist.txt")
219         endif()
220     endif()
221 endif()
222
223 if(WIN32)
224     add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
225     set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
226 endif()
227
228
229 ###########################################################
230 # LLVM
231 ###########################################################
232
233 set(LLVM_LIST
234     ${LLVM_DIR}/lib/Analysis/AliasAnalysis.cpp
235     ${LLVM_DIR}/lib/Analysis/AliasSetTracker.cpp
236     ${LLVM_DIR}/lib/Analysis/BasicAliasAnalysis.cpp
237     ${LLVM_DIR}/lib/Analysis/BranchProbabilityInfo.cpp
238     ${LLVM_DIR}/lib/Analysis/CaptureTracking.cpp
239     ${LLVM_DIR}/lib/Analysis/ConstantFolding.cpp
240     ${LLVM_DIR}/lib/Analysis/DIBuilder.cpp
241     ${LLVM_DIR}/lib/Analysis/DebugInfo.cpp
242     ${LLVM_DIR}/lib/Analysis/IVUsers.cpp
243     ${LLVM_DIR}/lib/Analysis/InstructionSimplify.cpp
244     ${LLVM_DIR}/lib/Analysis/Loads.cpp
245     ${LLVM_DIR}/lib/Analysis/LoopInfo.cpp
246     ${LLVM_DIR}/lib/Analysis/LoopPass.cpp
247     ${LLVM_DIR}/lib/Analysis/MemoryBuiltins.cpp
248     ${LLVM_DIR}/lib/Analysis/MemoryDependenceAnalysis.cpp
249     ${LLVM_DIR}/lib/Analysis/NoAliasAnalysis.cpp
250     ${LLVM_DIR}/lib/Analysis/PHITransAddr.cpp
251     ${LLVM_DIR}/lib/Analysis/PathNumbering.cpp
252     ${LLVM_DIR}/lib/Analysis/ProfileInfo.cpp
253     ${LLVM_DIR}/lib/Analysis/ScalarEvolution.cpp
254     ${LLVM_DIR}/lib/Analysis/ScalarEvolutionExpander.cpp
255     ${LLVM_DIR}/lib/Analysis/ScalarEvolutionNormalization.cpp
256     ${LLVM_DIR}/lib/Analysis/TypeBasedAliasAnalysis.cpp
257     ${LLVM_DIR}/lib/Analysis/ValueTracking.cpp
258     ${LLVM_DIR}/lib/CodeGen/AggressiveAntiDepBreaker.cpp
259     ${LLVM_DIR}/lib/CodeGen/AllocationOrder.cpp
260     ${LLVM_DIR}/lib/CodeGen/Analysis.cpp
261     ${LLVM_DIR}/lib/CodeGen/BranchFolding.cpp
262     ${LLVM_DIR}/lib/CodeGen/CalcSpillWeights.cpp
263     ${LLVM_DIR}/lib/CodeGen/CallingConvLower.cpp
264     ${LLVM_DIR}/lib/CodeGen/CodePlacementOpt.cpp
265     ${LLVM_DIR}/lib/CodeGen/CriticalAntiDepBreaker.cpp
266     ${LLVM_DIR}/lib/CodeGen/DeadMachineInstructionElim.cpp
267     ${LLVM_DIR}/lib/CodeGen/DwarfEHPrepare.cpp
268     ${LLVM_DIR}/lib/CodeGen/ELFCodeEmitter.cpp
269     ${LLVM_DIR}/lib/CodeGen/ELFWriter.cpp
270     ${LLVM_DIR}/lib/CodeGen/EdgeBundles.cpp
271     ${LLVM_DIR}/lib/CodeGen/ExecutionDepsFix.cpp
272     ${LLVM_DIR}/lib/CodeGen/ExpandISelPseudos.cpp
273     ${LLVM_DIR}/lib/CodeGen/ExpandPostRAPseudos.cpp
274     ${LLVM_DIR}/lib/CodeGen/GCMetadata.cpp
275     ${LLVM_DIR}/lib/CodeGen/GCStrategy.cpp
276     ${LLVM_DIR}/lib/CodeGen/InlineSpiller.cpp
277     ${LLVM_DIR}/lib/CodeGen/InterferenceCache.cpp
278     ${LLVM_DIR}/lib/CodeGen/IntrinsicLowering.cpp
279     ${LLVM_DIR}/lib/CodeGen/LLVMTargetMachine.cpp
280     ${LLVM_DIR}/lib/CodeGen/LatencyPriorityQueue.cpp
281     ${LLVM_DIR}/lib/CodeGen/LexicalScopes.cpp
282     ${LLVM_DIR}/lib/CodeGen/LiveDebugVariables.cpp
283     ${LLVM_DIR}/lib/CodeGen/LiveInterval.cpp
284     ${LLVM_DIR}/lib/CodeGen/LiveIntervalAnalysis.cpp
285     ${LLVM_DIR}/lib/CodeGen/LiveIntervalUnion.cpp
286     ${LLVM_DIR}/lib/CodeGen/LiveRangeCalc.cpp
287     ${LLVM_DIR}/lib/CodeGen/LiveRangeEdit.cpp
288     ${LLVM_DIR}/lib/CodeGen/LiveStackAnalysis.cpp
289     ${LLVM_DIR}/lib/CodeGen/LiveVariables.cpp
290     ${LLVM_DIR}/lib/CodeGen/LocalStackSlotAllocation.cpp
291     ${LLVM_DIR}/lib/CodeGen/MachineBasicBlock.cpp
292     ${LLVM_DIR}/lib/CodeGen/MachineCSE.cpp
293     ${LLVM_DIR}/lib/CodeGen/MachineDominators.cpp
294     ${LLVM_DIR}/lib/CodeGen/MachineFunction.cpp
295     ${LLVM_DIR}/lib/CodeGen/MachineFunctionAnalysis.cpp
296     ${LLVM_DIR}/lib/CodeGen/MachineFunctionPass.cpp
297     ${LLVM_DIR}/lib/CodeGen/MachineFunctionPrinterPass.cpp
298     ${LLVM_DIR}/lib/CodeGen/MachineInstr.cpp
299     ${LLVM_DIR}/lib/CodeGen/MachineLICM.cpp
300     ${LLVM_DIR}/lib/CodeGen/MachineLoopInfo.cpp
301     ${LLVM_DIR}/lib/CodeGen/MachineModuleInfo.cpp
302     ${LLVM_DIR}/lib/CodeGen/MachineModuleInfoImpls.cpp
303     ${LLVM_DIR}/lib/CodeGen/MachinePassRegistry.cpp
304     ${LLVM_DIR}/lib/CodeGen/MachineRegisterInfo.cpp
305     ${LLVM_DIR}/lib/CodeGen/MachineSSAUpdater.cpp
306     ${LLVM_DIR}/lib/CodeGen/MachineSink.cpp
307     ${LLVM_DIR}/lib/CodeGen/MachineVerifier.cpp
308     ${LLVM_DIR}/lib/CodeGen/ObjectCodeEmitter.cpp
309     ${LLVM_DIR}/lib/CodeGen/OptimizePHIs.cpp
310     ${LLVM_DIR}/lib/CodeGen/PHIElimination.cpp
311     ${LLVM_DIR}/lib/CodeGen/PHIEliminationUtils.cpp
312     ${LLVM_DIR}/lib/CodeGen/Passes.cpp
313     ${LLVM_DIR}/lib/CodeGen/PeepholeOptimizer.cpp
314     ${LLVM_DIR}/lib/CodeGen/PostRASchedulerList.cpp
315     ${LLVM_DIR}/lib/CodeGen/ProcessImplicitDefs.cpp
316     ${LLVM_DIR}/lib/CodeGen/PrologEpilogInserter.cpp
317     ${LLVM_DIR}/lib/CodeGen/PseudoSourceValue.cpp
318     ${LLVM_DIR}/lib/CodeGen/RegAllocBasic.cpp
319     ${LLVM_DIR}/lib/CodeGen/RegAllocFast.cpp
320     ${LLVM_DIR}/lib/CodeGen/RegAllocGreedy.cpp
321     ${LLVM_DIR}/lib/CodeGen/RegAllocLinearScan.cpp
322     ${LLVM_DIR}/lib/CodeGen/RegisterClassInfo.cpp
323     ${LLVM_DIR}/lib/CodeGen/RegisterCoalescer.cpp
324     ${LLVM_DIR}/lib/CodeGen/RegisterScavenging.cpp
325     ${LLVM_DIR}/lib/CodeGen/RenderMachineFunction.cpp
326     ${LLVM_DIR}/lib/CodeGen/ScheduleDAG.cpp
327     ${LLVM_DIR}/lib/CodeGen/ScheduleDAGEmit.cpp
328     ${LLVM_DIR}/lib/CodeGen/ScheduleDAGInstrs.cpp
329     ${LLVM_DIR}/lib/CodeGen/ScheduleDAGPrinter.cpp
330     ${LLVM_DIR}/lib/CodeGen/ScoreboardHazardRecognizer.cpp
331     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
332     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/FastISel.cpp
333     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
334     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
335     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
336     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
337     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
338     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
339     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
340     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
341     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
342     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp
343     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
344     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
345     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
346     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
347     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
348     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
349     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
350     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/TargetLowering.cpp
351     ${LLVM_DIR}/lib/CodeGen/SelectionDAG/TargetSelectionDAGInfo.cpp
352     ${LLVM_DIR}/lib/CodeGen/ShrinkWrapping.cpp
353     ${LLVM_DIR}/lib/CodeGen/SjLjEHPrepare.cpp
354     ${LLVM_DIR}/lib/CodeGen/SlotIndexes.cpp
355     ${LLVM_DIR}/lib/CodeGen/SpillPlacement.cpp
356     ${LLVM_DIR}/lib/CodeGen/Spiller.cpp
357     ${LLVM_DIR}/lib/CodeGen/SplitKit.cpp
358     ${LLVM_DIR}/lib/CodeGen/StackProtector.cpp
359     ${LLVM_DIR}/lib/CodeGen/StackSlotColoring.cpp
360     ${LLVM_DIR}/lib/CodeGen/StrongPHIElimination.cpp
361     ${LLVM_DIR}/lib/CodeGen/TailDuplication.cpp
362     ${LLVM_DIR}/lib/CodeGen/TargetInstrInfoImpl.cpp
363     ${LLVM_DIR}/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
364     ${LLVM_DIR}/lib/CodeGen/TwoAddressInstructionPass.cpp
365     ${LLVM_DIR}/lib/CodeGen/UnreachableBlockElim.cpp
366     ${LLVM_DIR}/lib/CodeGen/VirtRegMap.cpp
367     ${LLVM_DIR}/lib/CodeGen/VirtRegRewriter.cpp
368     ${LLVM_DIR}/lib/ExecutionEngine/ExecutionEngine.cpp
369     ${LLVM_DIR}/lib/ExecutionEngine/JIT/Intercept.cpp
370     ${LLVM_DIR}/lib/ExecutionEngine/JIT/JIT.cpp
371     ${LLVM_DIR}/lib/ExecutionEngine/JIT/JITDebugRegisterer.cpp
372     ${LLVM_DIR}/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
373     ${LLVM_DIR}/lib/ExecutionEngine/JIT/JITEmitter.cpp
374     ${LLVM_DIR}/lib/ExecutionEngine/JIT/JITMemoryManager.cpp
375     ${LLVM_DIR}/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp
376     ${LLVM_DIR}/lib/ExecutionEngine/TargetSelect.cpp
377     ${LLVM_DIR}/lib/MC/ELFObjectWriter.cpp
378     ${LLVM_DIR}/lib/MC/MCAsmBackend.cpp
379     ${LLVM_DIR}/lib/MC/MCAsmInfo.cpp
380     ${LLVM_DIR}/lib/MC/MCAsmInfoCOFF.cpp
381     ${LLVM_DIR}/lib/MC/MCAsmInfoDarwin.cpp
382     ${LLVM_DIR}/lib/MC/MCAsmStreamer.cpp
383     ${LLVM_DIR}/lib/MC/MCAssembler.cpp
384     ${LLVM_DIR}/lib/MC/MCCodeEmitter.cpp
385     ${LLVM_DIR}/lib/MC/MCCodeGenInfo.cpp
386     ${LLVM_DIR}/lib/MC/MCContext.cpp
387     ${LLVM_DIR}/lib/MC/MCDwarf.cpp
388     ${LLVM_DIR}/lib/MC/MCELF.cpp
389     ${LLVM_DIR}/lib/MC/MCELFObjectTargetWriter.cpp
390     ${LLVM_DIR}/lib/MC/MCELFStreamer.cpp
391     ${LLVM_DIR}/lib/MC/MCExpr.cpp
392     ${LLVM_DIR}/lib/MC/MCInst.cpp
393     ${LLVM_DIR}/lib/MC/MCInstPrinter.cpp
394     ${LLVM_DIR}/lib/MC/MCInstrAnalysis.cpp
395     ${LLVM_DIR}/lib/MC/MCLoggingStreamer.cpp
396     ${LLVM_DIR}/lib/MC/MCMachOStreamer.cpp
397     ${LLVM_DIR}/lib/MC/MCMachObjectTargetWriter.cpp
398     ${LLVM_DIR}/lib/MC/MCNullStreamer.cpp
399     ${LLVM_DIR}/lib/MC/MCObjectFileInfo.cpp
400     ${LLVM_DIR}/lib/MC/MCObjectStreamer.cpp
401     ${LLVM_DIR}/lib/MC/MCObjectWriter.cpp
402     ${LLVM_DIR}/lib/MC/MCSection.cpp
403     ${LLVM_DIR}/lib/MC/MCSectionCOFF.cpp
404     ${LLVM_DIR}/lib/MC/MCSectionELF.cpp
405     ${LLVM_DIR}/lib/MC/MCSectionMachO.cpp
406     ${LLVM_DIR}/lib/MC/MCStreamer.cpp
407     ${LLVM_DIR}/lib/MC/MCSubtargetInfo.cpp
408     ${LLVM_DIR}/lib/MC/MCSymbol.cpp
409     ${LLVM_DIR}/lib/MC/MCWin64EH.cpp
410     ${LLVM_DIR}/lib/MC/MachObjectWriter.cpp
411     ${LLVM_DIR}/lib/MC/SubtargetFeature.cpp
412     ${LLVM_DIR}/lib/MC/WinCOFFObjectWriter.cpp
413     ${LLVM_DIR}/lib/MC/WinCOFFStreamer.cpp
414     ${LLVM_DIR}/lib/Support/APFloat.cpp
415     ${LLVM_DIR}/lib/Support/APInt.cpp
416     ${LLVM_DIR}/lib/Support/Allocator.cpp
417     ${LLVM_DIR}/lib/Support/Atomic.cpp
418     ${LLVM_DIR}/lib/Support/BlockFrequency.cpp
419     ${LLVM_DIR}/lib/Support/BranchProbability.cpp
420     ${LLVM_DIR}/lib/Support/CommandLine.cpp
421     ${LLVM_DIR}/lib/Support/ConstantRange.cpp
422     ${LLVM_DIR}/lib/Support/CrashRecoveryContext.cpp
423     ${LLVM_DIR}/lib/Support/DAGDeltaAlgorithm.cpp
424     ${LLVM_DIR}/lib/Support/DataExtractor.cpp
425     ${LLVM_DIR}/lib/Support/Debug.cpp
426     ${LLVM_DIR}/lib/Support/DeltaAlgorithm.cpp
427     ${LLVM_DIR}/lib/Support/Disassembler.cpp
428     ${LLVM_DIR}/lib/Support/Dwarf.cpp
429     ${LLVM_DIR}/lib/Support/DynamicLibrary.cpp
430     ${LLVM_DIR}/lib/Support/Errno.cpp
431     ${LLVM_DIR}/lib/Support/ErrorHandling.cpp
432     ${LLVM_DIR}/lib/Support/FileUtilities.cpp
433     ${LLVM_DIR}/lib/Support/FoldingSet.cpp
434     ${LLVM_DIR}/lib/Support/FormattedStream.cpp
435     ${LLVM_DIR}/lib/Support/GraphWriter.cpp
436     ${LLVM_DIR}/lib/Support/Host.cpp
437     ${LLVM_DIR}/lib/Support/IncludeFile.cpp
438     ${LLVM_DIR}/lib/Support/IntEqClasses.cpp
439     ${LLVM_DIR}/lib/Support/IntervalMap.cpp
440     ${LLVM_DIR}/lib/Support/IsInf.cpp
441     ${LLVM_DIR}/lib/Support/IsNAN.cpp
442     ${LLVM_DIR}/lib/Support/ManagedStatic.cpp
443     ${LLVM_DIR}/lib/Support/Memory.cpp
444     ${LLVM_DIR}/lib/Support/MemoryBuffer.cpp
445     ${LLVM_DIR}/lib/Support/MemoryObject.cpp
446     ${LLVM_DIR}/lib/Support/Mutex.cpp
447     ${LLVM_DIR}/lib/Support/Path.cpp
448     ${LLVM_DIR}/lib/Support/PathV2.cpp
449     ${LLVM_DIR}/lib/Support/PrettyStackTrace.cpp
450     ${LLVM_DIR}/lib/Support/Process.cpp
451     ${LLVM_DIR}/lib/Support/Program.cpp
452     ${LLVM_DIR}/lib/Support/RWMutex.cpp
453     ${LLVM_DIR}/lib/Support/SearchForAddressOfSpecialSymbol.cpp
454     ${LLVM_DIR}/lib/Support/Signals.cpp
455     ${LLVM_DIR}/lib/Support/SmallPtrSet.cpp
456     ${LLVM_DIR}/lib/Support/SmallVector.cpp
457     ${LLVM_DIR}/lib/Support/SourceMgr.cpp
458     ${LLVM_DIR}/lib/Support/Statistic.cpp
459     ${LLVM_DIR}/lib/Support/StringExtras.cpp
460     ${LLVM_DIR}/lib/Support/StringMap.cpp
461     ${LLVM_DIR}/lib/Support/StringPool.cpp
462     ${LLVM_DIR}/lib/Support/StringRef.cpp
463     ${LLVM_DIR}/lib/Support/SystemUtils.cpp
464     ${LLVM_DIR}/lib/Support/TargetRegistry.cpp
465     ${LLVM_DIR}/lib/Support/ThreadLocal.cpp
466     ${LLVM_DIR}/lib/Support/Threading.cpp
467     ${LLVM_DIR}/lib/Support/TimeValue.cpp
468     ${LLVM_DIR}/lib/Support/Timer.cpp
469     ${LLVM_DIR}/lib/Support/ToolOutputFile.cpp
470     ${LLVM_DIR}/lib/Support/Triple.cpp
471     ${LLVM_DIR}/lib/Support/Twine.cpp
472     ${LLVM_DIR}/lib/Support/Valgrind.cpp
473     ${LLVM_DIR}/lib/Support/circular_raw_ostream.cpp
474     ${LLVM_DIR}/lib/Support/raw_os_ostream.cpp
475     ${LLVM_DIR}/lib/Support/raw_ostream.cpp
476     ${LLVM_DIR}/lib/Support/system_error.cpp
477     ${LLVM_DIR}/lib/Target/Mangler.cpp
478     ${LLVM_DIR}/lib/Target/TargetData.cpp
479     ${LLVM_DIR}/lib/Target/TargetELFWriterInfo.cpp
480     ${LLVM_DIR}/lib/Target/TargetFrameLowering.cpp
481     ${LLVM_DIR}/lib/Target/TargetInstrInfo.cpp
482     ${LLVM_DIR}/lib/Target/TargetLibraryInfo.cpp
483     ${LLVM_DIR}/lib/Target/TargetLoweringObjectFile.cpp
484     ${LLVM_DIR}/lib/Target/TargetMachine.cpp
485     ${LLVM_DIR}/lib/Target/TargetRegisterInfo.cpp
486     ${LLVM_DIR}/lib/Target/TargetSubtargetInfo.cpp
487     ${LLVM_DIR}/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
488     ${LLVM_DIR}/lib/Target/X86/InstPrinter/X86InstComments.cpp
489     ${LLVM_DIR}/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
490     ${LLVM_DIR}/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
491     ${LLVM_DIR}/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp
492     ${LLVM_DIR}/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
493     ${LLVM_DIR}/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
494     ${LLVM_DIR}/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
495     ${LLVM_DIR}/lib/Target/X86/TargetInfo/X86TargetInfo.cpp
496     ${LLVM_DIR}/lib/Target/X86/Utils/X86ShuffleDecode.cpp
497     ${LLVM_DIR}/lib/Target/X86/X86CodeEmitter.cpp
498     ${LLVM_DIR}/lib/Target/X86/X86ELFWriterInfo.cpp
499     ${LLVM_DIR}/lib/Target/X86/X86FastISel.cpp
500     ${LLVM_DIR}/lib/Target/X86/X86FloatingPoint.cpp
501     ${LLVM_DIR}/lib/Target/X86/X86FrameLowering.cpp
502     ${LLVM_DIR}/lib/Target/X86/X86ISelDAGToDAG.cpp
503     ${LLVM_DIR}/lib/Target/X86/X86ISelLowering.cpp
504     ${LLVM_DIR}/lib/Target/X86/X86InstrInfo.cpp
505     ${LLVM_DIR}/lib/Target/X86/X86JITInfo.cpp
506     ${LLVM_DIR}/lib/Target/X86/X86RegisterInfo.cpp
507     ${LLVM_DIR}/lib/Target/X86/X86SelectionDAGInfo.cpp
508     ${LLVM_DIR}/lib/Target/X86/X86Subtarget.cpp
509     ${LLVM_DIR}/lib/Target/X86/X86TargetMachine.cpp
510     ${LLVM_DIR}/lib/Target/X86/X86TargetObjectFile.cpp
511     ${LLVM_DIR}/lib/Target/X86/X86VZeroUpper.cpp
512     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineAddSub.cpp
513     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
514     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineCalls.cpp
515     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineCasts.cpp
516     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineCompares.cpp
517     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
518     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
519     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombinePHI.cpp
520     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineSelect.cpp
521     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineShifts.cpp
522     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
523     ${LLVM_DIR}/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
524     ${LLVM_DIR}/lib/Transforms/InstCombine/InstructionCombining.cpp
525     ${LLVM_DIR}/lib/Transforms/Scalar/ADCE.cpp
526     ${LLVM_DIR}/lib/Transforms/Scalar/CodeGenPrepare.cpp
527     ${LLVM_DIR}/lib/Transforms/Scalar/DeadStoreElimination.cpp
528     ${LLVM_DIR}/lib/Transforms/Scalar/GVN.cpp
529     ${LLVM_DIR}/lib/Transforms/Scalar/LICM.cpp
530     ${LLVM_DIR}/lib/Transforms/Scalar/LoopStrengthReduce.cpp
531     ${LLVM_DIR}/lib/Transforms/Scalar/Reassociate.cpp
532     ${LLVM_DIR}/lib/Transforms/Scalar/Reg2Mem.cpp
533     ${LLVM_DIR}/lib/Transforms/Scalar/SCCP.cpp
534     ${LLVM_DIR}/lib/Transforms/Scalar/ScalarReplAggregates.cpp
535     ${LLVM_DIR}/lib/Transforms/Scalar/SimplifyCFGPass.cpp
536     ${LLVM_DIR}/lib/Transforms/Utils/AddrModeMatcher.cpp
537     ${LLVM_DIR}/lib/Transforms/Utils/BasicBlockUtils.cpp
538     ${LLVM_DIR}/lib/Transforms/Utils/BreakCriticalEdges.cpp
539     ${LLVM_DIR}/lib/Transforms/Utils/BuildLibCalls.cpp
540     ${LLVM_DIR}/lib/Transforms/Utils/DemoteRegToStack.cpp
541     ${LLVM_DIR}/lib/Transforms/Utils/InstructionNamer.cpp
542     ${LLVM_DIR}/lib/Transforms/Utils/LCSSA.cpp
543     ${LLVM_DIR}/lib/Transforms/Utils/Local.cpp
544     ${LLVM_DIR}/lib/Transforms/Utils/LoopSimplify.cpp
545     ${LLVM_DIR}/lib/Transforms/Utils/LowerInvoke.cpp
546     ${LLVM_DIR}/lib/Transforms/Utils/LowerSwitch.cpp
547     ${LLVM_DIR}/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
548     ${LLVM_DIR}/lib/Transforms/Utils/SSAUpdater.cpp
549     ${LLVM_DIR}/lib/Transforms/Utils/SimplifyCFG.cpp
550     ${LLVM_DIR}/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp
551     ${LLVM_DIR}/lib/VMCore/AsmWriter.cpp
552     ${LLVM_DIR}/lib/VMCore/Attributes.cpp
553     ${LLVM_DIR}/lib/VMCore/BasicBlock.cpp
554     ${LLVM_DIR}/lib/VMCore/ConstantFold.cpp
555     ${LLVM_DIR}/lib/VMCore/Constants.cpp
556     ${LLVM_DIR}/lib/VMCore/DebugInfoProbe.cpp
557     ${LLVM_DIR}/lib/VMCore/DebugLoc.cpp
558     ${LLVM_DIR}/lib/VMCore/Dominators.cpp
559     ${LLVM_DIR}/lib/VMCore/Function.cpp
560     ${LLVM_DIR}/lib/VMCore/Globals.cpp
561     ${LLVM_DIR}/lib/VMCore/IRBuilder.cpp
562     ${LLVM_DIR}/lib/VMCore/InlineAsm.cpp
563     ${LLVM_DIR}/lib/VMCore/Instruction.cpp
564     ${LLVM_DIR}/lib/VMCore/Instructions.cpp
565     ${LLVM_DIR}/lib/VMCore/IntrinsicInst.cpp
566     ${LLVM_DIR}/lib/VMCore/LLVMContext.cpp
567     ${LLVM_DIR}/lib/VMCore/LLVMContextImpl.cpp
568     ${LLVM_DIR}/lib/VMCore/LeakDetector.cpp
569     ${LLVM_DIR}/lib/VMCore/Metadata.cpp
570     ${LLVM_DIR}/lib/VMCore/Module.cpp
571     ${LLVM_DIR}/lib/VMCore/Pass.cpp
572     ${LLVM_DIR}/lib/VMCore/PassManager.cpp
573     ${LLVM_DIR}/lib/VMCore/PassRegistry.cpp
574     ${LLVM_DIR}/lib/VMCore/PrintModulePass.cpp
575     ${LLVM_DIR}/lib/VMCore/Type.cpp
576     ${LLVM_DIR}/lib/VMCore/Use.cpp
577     ${LLVM_DIR}/lib/VMCore/User.cpp
578     ${LLVM_DIR}/lib/VMCore/Value.cpp
579     ${LLVM_DIR}/lib/VMCore/ValueSymbolTable.cpp
580     ${LLVM_DIR}/lib/VMCore/ValueTypes.cpp
581     ${LLVM_DIR}/lib/VMCore/Verifier.cpp
582 )
583
584 if(WIN32)
585     set(LLVM_INCLUDE_DIR ${LLVM_DIR}/include)
586 elseif(LINUX)
587     set(LLVM_INCLUDE_DIR ${LLVM_DIR}/include-linux)
588 elseif(APPLE)
589     set(LLVM_INCLUDE_DIR ${LLVM_DIR}/include-osx)
590 endif()
591
592 list(APPEND LLVM_INCLUDE_DIR
593     ${LLVM_DIR}/include
594     ${LLVM_DIR}/lib/Target/X86
595 )
596 add_library(llvm STATIC ${LLVM_LIST})
597 set_target_properties(llvm PROPERTIES
598     POSITION_INDEPENDENT_CODE 1
599     INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIR}"
600     COMPILE_DEFINITIONS "__STDC_CONSTANT_MACROS; __STDC_LIMIT_MACROS;"
601     FOLDER "LLVM"
602 )
603
604 ###########################################################
605 # Subzero
606 ###########################################################
607
608 if(${REACTOR_BACKEND} STREQUAL "Subzero")
609     set(SUBZERO_LIST
610         ${SUBZERO_DIR}/src/IceAssembler.cpp
611         ${SUBZERO_DIR}/src/IceCfg.cpp
612         ${SUBZERO_DIR}/src/IceCfgNode.cpp
613         ${SUBZERO_DIR}/src/IceClFlags.cpp
614         ${SUBZERO_DIR}/src/IceELFObjectWriter.cpp
615         ${SUBZERO_DIR}/src/IceELFSection.cpp
616         ${SUBZERO_DIR}/src/IceFixups.cpp
617         ${SUBZERO_DIR}/src/IceGlobalContext.cpp
618         ${SUBZERO_DIR}/src/IceGlobalInits.cpp
619         ${SUBZERO_DIR}/src/IceInst.cpp
620         ${SUBZERO_DIR}/src/IceInstrumentation.cpp
621         ${SUBZERO_DIR}/src/IceIntrinsics.cpp
622         ${SUBZERO_DIR}/src/IceLiveness.cpp
623         ${SUBZERO_DIR}/src/IceLoopAnalyzer.cpp
624         ${SUBZERO_DIR}/src/IceMangling.cpp
625         ${SUBZERO_DIR}/src/IceMemory.cpp
626         ${SUBZERO_DIR}/src/IceOperand.cpp
627         ${SUBZERO_DIR}/src/IceRangeSpec.cpp
628         ${SUBZERO_DIR}/src/IceRegAlloc.cpp
629         ${SUBZERO_DIR}/src/IceRevision.cpp
630         ${SUBZERO_DIR}/src/IceRNG.cpp
631         ${SUBZERO_DIR}/src/IceSwitchLowering.cpp
632         ${SUBZERO_DIR}/src/IceTargetLowering.cpp
633         ${SUBZERO_DIR}/src/IceThreading.cpp
634         ${SUBZERO_DIR}/src/IceTimerTree.cpp
635         ${SUBZERO_DIR}/src/IceTypes.cpp
636         ${SUBZERO_DIR}/src/IceVariableSplitting.cpp
637     )
638
639     if(ARCH STREQUAL "x86_64")
640         list(APPEND SUBZERO_LIST
641             ${SUBZERO_DIR}/src/IceTargetLoweringX86.cpp
642             ${SUBZERO_DIR}/src/IceInstX8664.cpp
643             ${SUBZERO_DIR}/src/IceTargetLoweringX8664.cpp
644         )
645         set(SUBZERO_TARGET X8664)
646     elseif(ARCH STREQUAL "x86")
647         list(APPEND SUBZERO_LIST
648             ${SUBZERO_DIR}/src/IceTargetLoweringX86.cpp
649             ${SUBZERO_DIR}/src/IceInstX8632.cpp
650             ${SUBZERO_DIR}/src/IceTargetLoweringX8632.cpp
651         )
652         set(SUBZERO_TARGET X8632)
653     elseif(ARCH STREQUAL "arm")
654         list(APPEND SUBZERO_LIST
655             ${SUBZERO_DIR}/src/IceAssemblerARM32.cpp
656             ${SUBZERO_DIR}/src/IceInstARM32.cpp
657             ${SUBZERO_DIR}/src/IceTargetLoweringARM32.cpp
658         )
659         set(SUBZERO_TARGET ARM32)
660     else()
661         message(FATAL_ERROR "Architecture '${ARCH}' not supported by Subzero")
662     endif()
663
664     file(GLOB_RECURSE SUBZERO_DEPENDENCIES_LIST
665         ${SUBZERO_LLVM_DIR}/*.cpp
666         ${SUBZERO_LLVM_DIR}/*.c
667         ${SUBZERO_LLVM_DIR}/*.h
668     )
669
670     set(SUBZERO_REACTOR_LIST
671         ${SOURCE_DIR}/Reactor/SubzeroReactor.cpp
672         ${SOURCE_DIR}/Reactor/Routine.cpp
673         ${SOURCE_DIR}/Reactor/Optimizer.cpp
674         ${SOURCE_DIR}/Reactor/Nucleus.hpp
675         ${SOURCE_DIR}/Reactor/Routine.hpp
676     )
677
678     set(SUBZERO_INCLUDE_DIR
679         ${SUBZERO_DIR}/
680         ${SUBZERO_LLVM_DIR}/include/
681         ${SUBZERO_DIR}/pnacl-llvm/include/
682      )
683
684     if(WIN32)
685         list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/Windows/include/)
686     elseif(LINUX)
687         list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/Linux/include/)
688     elseif(APPLE)
689         list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/MacOS/include/)
690     endif()
691
692     add_library(ReactorSubzero STATIC
693         ${SUBZERO_LIST}
694         ${SUBZERO_DEPENDENCIES_LIST}
695         ${SUBZERO_REACTOR_LIST}
696     )
697
698     set_target_properties(ReactorSubzero PROPERTIES
699         POSITION_INDEPENDENT_CODE 1
700         INCLUDE_DIRECTORIES "${SUBZERO_INCLUDE_DIR}"
701         COMPILE_DEFINITIONS "SZTARGET=${SUBZERO_TARGET}; ALLOW_DUMP=0; ALLOW_TIMERS=0; ALLOW_LLVM_CL=0; ALLOW_LLVM_IR=0; ALLOW_LLVM_IR_AS_INPUT=0; ALLOW_MINIMAL_BUILD=0; ALLOW_WASM=0; ICE_THREAD_LOCAL_HACK=0;"
702         FOLDER "Subzero"
703     )
704
705     if(WIN32)
706         target_compile_definitions(ReactorSubzero PRIVATE SUBZERO_USE_MICROSOFT_ABI)
707     endif()
708 endif()
709
710 ###########################################################
711 # Include Directories
712 ###########################################################
713
714 set(COMMON_INCLUDE_DIR
715     ${SOURCE_DIR}
716     ${CMAKE_SOURCE_DIR}/include
717     ${LLVM_INCLUDE_DIR}
718 )
719 set(OPENGL_INCLUDE_DIR
720     ${OPENGL_DIR}
721     ${COMMON_INCLUDE_DIR}
722 )
723
724 ###########################################################
725 # File Lists
726 ###########################################################
727
728 file(GLOB_RECURSE SWIFTSHADER_LIST
729     ${SOURCE_DIR}/Common/*.cpp
730     ${SOURCE_DIR}/Common/*.h
731     ${SOURCE_DIR}/Common/*.hpp
732     ${SOURCE_DIR}/Renderer/*.cpp
733     ${SOURCE_DIR}/Renderer/*.h
734     ${SOURCE_DIR}/Renderer/*.hpp
735     ${SOURCE_DIR}/Shader/*.cpp
736     ${SOURCE_DIR}/Shader/*.h
737     ${SOURCE_DIR}/Shader/*.hpp
738 )
739 list(APPEND SWIFTSHADER_LIST
740     ${SOURCE_DIR}/Main/Config.cpp
741     ${SOURCE_DIR}/Main/Config.hpp
742     ${SOURCE_DIR}/Main/FrameBuffer.cpp
743     ${SOURCE_DIR}/Main/FrameBuffer.hpp
744     ${SOURCE_DIR}/Main/SwiftConfig.cpp
745     ${SOURCE_DIR}/Main/SwiftConfig.hpp
746 )
747 list(REMOVE_ITEM SWIFTSHADER_LIST
748     ${SOURCE_DIR}/Common/DebugAndroid.cpp
749     ${SOURCE_DIR}/Common/DebugAndroid.hpp
750     ${SOURCE_DIR}/Common/GrallocAndroid.cpp
751     ${SOURCE_DIR}/Common/GrallocAndroid.hpp
752 )
753
754 set(REACTOR_LLVM_LIST
755     ${SOURCE_DIR}/Reactor/LLVMReactor.cpp
756     ${SOURCE_DIR}/Reactor/Nucleus.hpp
757     ${SOURCE_DIR}/Reactor/Routine.cpp
758     ${SOURCE_DIR}/Reactor/Routine.hpp
759     ${SOURCE_DIR}/Reactor/LLVMRoutine.cpp
760     ${SOURCE_DIR}/Reactor/LLVMRoutine.hpp
761     ${SOURCE_DIR}/Reactor/LLVMRoutineManager.cpp
762     ${SOURCE_DIR}/Reactor/LLVMRoutineManager.hpp
763 )
764
765 file(GLOB_RECURSE EGL_LIST
766     ${OPENGL_DIR}/libEGL/*.cpp
767     ${OPENGL_DIR}/libEGL/*.h
768     ${OPENGL_DIR}/libEGL/*.hpp
769     ${OPENGL_DIR}/common/Object.cpp
770     ${OPENGL_DIR}/common/Object.hpp
771     ${OPENGL_DIR}/common/debug.cpp
772     ${OPENGL_DIR}/common/debug.h
773     ${CMAKE_SOURCE_DIR}/include/*.h
774 )
775
776 file(GLOB_RECURSE GL32_LIST
777     ${OPENGL_DIR}/libGL/*.cpp
778     ${OPENGL_DIR}/libGL/*.h
779     ${OPENGL_DIR}/libGL/*.hpp
780     ${OPENGL_DIR}/common/*.cpp
781     ${OPENGL_DIR}/common/*.h
782     ${OPENGL_DIR}/common/*.hpp
783     ${CMAKE_SOURCE_DIR}/include/GL/*.h
784 )
785
786 file(GLOB_RECURSE GLES2_LIST
787     ${OPENGL_DIR}/libGLESv2/*.cpp
788     ${OPENGL_DIR}/libGLESv2/*.h
789     ${OPENGL_DIR}/libGLESv2/*.hpp
790     ${OPENGL_DIR}/common/*.cpp
791     ${OPENGL_DIR}/common/*.h
792     ${OPENGL_DIR}/common/*.hpp
793     ${CMAKE_SOURCE_DIR}/include/KHR/*.h
794     ${CMAKE_SOURCE_DIR}/include/GLES2/*.h
795     ${CMAKE_SOURCE_DIR}/include/GLES3/*.h
796 )
797
798 file(GLOB_RECURSE GLES_CM_LIST
799     ${OPENGL_DIR}/libGLES_CM/*.cpp
800     ${OPENGL_DIR}/libGLES_CM/*.h
801     ${OPENGL_DIR}/libGLES_CM/*.hpp
802     ${OPENGL_DIR}/common/*.cpp
803     ${OPENGL_DIR}/common/*.h
804     ${OPENGL_DIR}/common/*.hpp
805     ${CMAKE_SOURCE_DIR}/include/KHR/*.h
806     ${CMAKE_SOURCE_DIR}/include/GLES/*.h
807 )
808
809 file(GLOB_RECURSE OPENGL_COMPILER_LIST
810     ${OPENGL_COMPILER_DIR}/*.cpp
811     ${OPENGL_COMPILER_DIR}/*.h
812     ${OPENGL_COMPILER_DIR}/*.hpp
813 )
814 file(GLOB_RECURSE OPENGL_COMPILER_OS_SPECIFIC_LIST
815     ${OPENGL_COMPILER_DIR}/ossource*.cpp
816     ${OPENGL_COMPILER_DIR}/ossource*.h
817     ${OPENGL_COMPILER_DIR}/ossource*.hpp
818 )
819 list(REMOVE_ITEM OPENGL_COMPILER_LIST ${OPENGL_COMPILER_OS_SPECIFIC_LIST})
820
821 ###########################################################
822 # Append OS specific files to lists
823 ###########################################################
824
825 if(WIN32)
826     list(APPEND SWIFTSHADER_LIST
827         ${SOURCE_DIR}/Main/FrameBufferDD.cpp
828         ${SOURCE_DIR}/Main/FrameBufferDD.hpp
829         ${SOURCE_DIR}/Main/FrameBufferGDI.cpp
830         ${SOURCE_DIR}/Main/FrameBufferGDI.hpp
831         ${SOURCE_DIR}/Main/FrameBufferWin.cpp
832         ${SOURCE_DIR}/Main/FrameBufferWin.hpp
833     )
834     list(APPEND OPENGL_COMPILER_LIST ${OPENGL_COMPILER_DIR}/ossource_win.cpp)
835     list(APPEND EGL_LIST ${OPENGL_DIR}/libEGL/libEGL.rc)
836     list(APPEND GL32_LIST ${OPENGL_DIR}/libGL/libGL.rc)
837     list(APPEND GLES2_LIST ${OPENGL_DIR}/libGLESv2/libGLESv2.rc)
838     list(APPEND GLES_CM_LIST ${OPENGL_DIR}/libGLES_CM/libGLES_CM.rc)
839 elseif(LINUX)
840     list(APPEND SWIFTSHADER_LIST
841         ${SOURCE_DIR}/Main/FrameBufferX11.cpp
842         ${SOURCE_DIR}/Main/FrameBufferX11.hpp
843         ${SOURCE_DIR}/Common/SharedLibrary.hpp
844         ${SOURCE_DIR}/Main/libX11.cpp
845         ${SOURCE_DIR}/Main/libX11.hpp
846     )
847     list(APPEND EGL_LIST
848         ${SOURCE_DIR}/Common/SharedLibrary.hpp
849         ${SOURCE_DIR}/Main/libX11.cpp
850         ${SOURCE_DIR}/Main/libX11.hpp
851     )
852     list(APPEND OPENGL_COMPILER_LIST
853         ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
854     )
855 elseif(APPLE)
856     list(APPEND SWIFTSHADER_LIST
857         ${SOURCE_DIR}/Main/FrameBufferOSX.mm
858         ${SOURCE_DIR}/Main/FrameBufferOSX.hpp
859     )
860     list(APPEND EGL_LIST
861         ${OPENGL_DIR}/libEGL/OSXUtils.mm
862         ${OPENGL_DIR}/libEGL/OSXUtils.hpp
863     )
864     list(APPEND OPENGL_COMPILER_LIST
865         ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
866     )
867 endif()
868
869 if(WIN32)
870     set(OS_LIBS odbc32 odbccp32 WS2_32 dxguid)
871 elseif(LINUX)
872     set(OS_LIBS dl pthread)
873 elseif(APPLE)
874     find_library(COCOA_FRAMEWORK Cocoa)
875     find_library(QUARTZ_FRAMEWORK Quartz)
876     find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
877     find_library(IOSURFACE_FRAMEWORK IOSurface)
878     set(OS_LIBS "${COCOA_FRAMEWORK}" "${QUARTZ_FRAMEWORK}" "${CORE_FOUNDATION_FRAMEWORK}" "${IOSURFACE_FRAMEWORK}")
879 endif()
880
881 ###########################################################
882 # SwiftShader Targets
883 ###########################################################
884
885 add_library(SwiftShader STATIC ${SWIFTSHADER_LIST})
886 set_target_properties(SwiftShader PROPERTIES
887     INCLUDE_DIRECTORIES "${COMMON_INCLUDE_DIR}"
888     POSITION_INDEPENDENT_CODE 1
889     FOLDER "Core"
890     COMPILE_DEFINITIONS "NO_SANITIZE_FUNCTION=;"
891 )
892 target_link_libraries(SwiftShader ${OS_LIBS})
893
894 add_library(ReactorLLVM STATIC ${REACTOR_LLVM_LIST})
895 set_target_properties(ReactorLLVM PROPERTIES
896     INCLUDE_DIRECTORIES "${COMMON_INCLUDE_DIR}"
897     POSITION_INDEPENDENT_CODE 1
898     FOLDER "Core"
899 )
900 target_link_libraries(ReactorLLVM llvm ${OS_LIBS})
901
902 if(${REACTOR_BACKEND} STREQUAL "LLVM")
903     set(Reactor ReactorLLVM)
904 elseif(${REACTOR_BACKEND} STREQUAL "Subzero")
905     set(Reactor ReactorSubzero)
906 else()
907     message(FATAL_ERROR "REACTOR_BACKEND must be 'LLVM' or 'Subzero'")
908 endif()
909
910 add_library(GLCompiler STATIC ${OPENGL_COMPILER_LIST})
911 set_target_properties(GLCompiler PROPERTIES
912     INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
913     POSITION_INDEPENDENT_CODE 1
914     FOLDER "OpenGL"
915 )
916 target_link_libraries(GLCompiler ${OS_LIBS})
917
918 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
919     set(LIB_PREFIX "lib64")
920 else()
921     set(LIB_PREFIX "lib")
922 endif()
923
924 if(BUILD_EGL)
925     add_library(libEGL SHARED ${EGL_LIST})
926     set_target_properties(libEGL PROPERTIES
927         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
928         FOLDER "OpenGL"
929         COMPILE_DEFINITIONS "EGL_EGLEXT_PROTOTYPES; EGLAPI=; NO_SANITIZE_FUNCTION=;"
930         PREFIX ""
931     )
932     set_target_export_map(libEGL ${SOURCE_DIR}/OpenGL/libEGL)
933     target_link_libraries(libEGL ${OS_LIBS})
934     add_custom_command(
935         TARGET libEGL
936         POST_BUILD
937         COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libEGL>/translator
938         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libEGL> $<TARGET_FILE_DIR:libEGL>/translator/${LIB_PREFIX}EGL_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
939         COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/out/${CMAKE_SYSTEM_NAME}/
940         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libEGL> ${CMAKE_SOURCE_DIR}/out/${CMAKE_SYSTEM_NAME}/
941     )
942 endif()
943
944 if(BUILD_GL32)
945     add_library(libGL SHARED ${GL32_LIST})
946     set_target_properties(libGL PROPERTIES
947         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
948         FOLDER "OpenGL"
949         COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
950         PREFIX ""
951     )
952     set_target_export_map(libGL ${SOURCE_DIR}/OpenGL/libGL)
953     target_link_libraries(libGL SwiftShader ${Reactor} GLCompiler ${OS_LIBS})
954 endif()
955
956 if(BUILD_GLESv2)
957     add_library(libGLESv2 SHARED ${GLES2_LIST})
958     set_target_properties(libGLESv2 PROPERTIES
959         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
960         FOLDER "OpenGL"
961         COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES; GL_API=; GL_APICALL=; GLAPI=; NO_SANITIZE_FUNCTION=;"
962         PREFIX ""
963     )
964     set_target_export_map(libGLESv2 ${SOURCE_DIR}/OpenGL/libGLESv2)
965     target_link_libraries(libGLESv2 SwiftShader ${Reactor} GLCompiler ${OS_LIBS})
966     add_custom_command(
967         TARGET libGLESv2
968         POST_BUILD
969         COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libGLESv2>/translator
970         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLESv2> $<TARGET_FILE_DIR:libGLESv2>/translator/${LIB_PREFIX}GLES_V2_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
971         COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/out/${CMAKE_SYSTEM_NAME}/
972         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLESv2> ${CMAKE_SOURCE_DIR}/out/${CMAKE_SYSTEM_NAME}/
973     )
974 endif()
975
976 if(BUILD_GLES_CM)
977     add_library(libGLES_CM SHARED ${GLES_CM_LIST})
978     set_target_properties(libGLES_CM PROPERTIES
979         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
980         FOLDER "OpenGL"
981         COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES; EGLAPI=; GL_API=; GL_APICALL=; GLAPI=;"
982         PREFIX ""
983     )
984     set_target_export_map(libGLES_CM ${SOURCE_DIR}/OpenGL/libGLES_CM)
985     target_link_libraries(libGLES_CM SwiftShader ${Reactor} GLCompiler ${OS_LIBS})
986     add_custom_command(
987         TARGET libGLES_CM
988         POST_BUILD
989         COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libGLES_CM>/translator
990         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLES_CM> $<TARGET_FILE_DIR:libGLES_CM>/translator/${LIB_PREFIX}GLES_CM_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
991     )
992 endif()
993
994 ###########################################################
995 # Sample programs
996 ###########################################################
997
998 if(BUILD_SAMPLES)
999     if(WIN32)
1000         add_executable(OGLES2HelloAPI ${HELLO2_DIR}/OGLES2HelloAPI_Windows.cpp)
1001         set_target_properties(OGLES2HelloAPI PROPERTIES
1002             INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include"
1003             COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
1004             FOLDER "Samples"
1005         )
1006         target_link_libraries(OGLES2HelloAPI libEGL libGLESv2)
1007         set_property(TARGET OGLES2HelloAPI APPEND_STRING PROPERTY LINK_FLAGS "/SUBSYSTEM:WINDOWS")
1008         set(CMAKE_DEFAULT_STARTUP_PROJECT OGLES2HelloAPI)
1009     elseif(LINUX)
1010         add_executable(OGLES2HelloAPI ${HELLO2_DIR}/OGLES2HelloAPI_LinuxX11.cpp)
1011         set_target_properties(OGLES2HelloAPI PROPERTIES
1012             INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include"
1013             COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
1014         )
1015         target_link_libraries(OGLES2HelloAPI dl X11 libEGL libGLESv2)   # Explicitly link our "lib*" targets, not the platform provided "EGL" and "GLESv2"
1016     elseif(APPLE)
1017         add_executable(OGLES2HelloAPI MACOSX_BUNDLE
1018             ${HELLO2_DIR}/OGLES2HelloAPI_OSX.mm
1019             ${HELLO2_DIR}/Build/OSX/en.lproj/MainMenu.xib
1020         )
1021         set_target_properties(OGLES2HelloAPI PROPERTIES
1022             INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include"
1023             COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
1024             MACOSX_BUNDLE_INFO_PLIST "${HELLO2_DIR}/Build/OSX/Info.plist"
1025         )
1026         target_link_libraries(OGLES2HelloAPI libEGL libGLESv2 ${OS_LIBS})
1027         set_source_files_properties(${HELLO2_DIR}/Build/OSX/en.lproj/MainMenu.xib PROPERTIES
1028             MACOSX_PACKAGE_LOCATION "Resources"
1029         )
1030     endif()
1031 endif()
1032
1033 if(BUILD_TESTS AND ${REACTOR_BACKEND} STREQUAL "Subzero")
1034     set(SUBZERO_TEST_LIST
1035         ${SOURCE_DIR}/Reactor/Main.cpp
1036         ${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/src/gtest-all.cc
1037     )
1038
1039     set(SUBZERO_TEST_INCLUDE_DIR
1040         ${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/include
1041         ${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/
1042     )
1043
1044     add_executable(SubzeroTest ${SUBZERO_TEST_LIST})
1045     set_target_properties(SubzeroTest PROPERTIES
1046         INCLUDE_DIRECTORIES "${SUBZERO_TEST_INCLUDE_DIR}"
1047         FOLDER "Tests"
1048     )
1049     if(WIN32)
1050         target_link_libraries(SubzeroTest ReactorSubzero)
1051     else()
1052         target_link_libraries(SubzeroTest ReactorSubzero pthread dl)
1053     endif()
1054 endif()
1055
1056 if(BUILD_TESTS)
1057     set(UNITTESTS_LIST
1058         ${CMAKE_SOURCE_DIR}/tests/unittests/main.cpp
1059         ${CMAKE_SOURCE_DIR}/tests/unittests/unittests.cpp
1060         ${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/src/gtest-all.cc
1061     )
1062
1063     set(UNITTESTS_INCLUDE_DIR
1064         ${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/include/
1065         ${CMAKE_SOURCE_DIR}/third_party/googletest/googlemock/include/
1066         ${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/
1067         ${CMAKE_SOURCE_DIR}/include/
1068     )
1069
1070     add_executable(unittests ${UNITTESTS_LIST})
1071     set_target_properties(unittests PROPERTIES
1072         INCLUDE_DIRECTORIES "${UNITTESTS_INCLUDE_DIR}"
1073         FOLDER "Tests"
1074         COMPILE_DEFINITIONS "STANDALONE"
1075     )
1076
1077     target_link_libraries(unittests libEGL libGLESv2 ${OS_LIBS})
1078 endif()