blob: ce4a1f07bef428a4795f9f44f9cda47e96c43817 [file] [log] [blame]
Ben Clayton3c690342020-03-24 22:38:59 +00001# Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Antonio Maioranobccfe712020-04-20 17:48:53 -040015cmake_minimum_required(VERSION 3.13)
Corentin Wallez0866b292015-12-09 13:49:40 -050016
Ben Clayton3cc0aea2020-01-08 19:09:25 +000017set(CMAKE_CXX_STANDARD 14)
18
Ben Clayton30b6b592019-08-07 15:04:11 +010019project(SwiftShader C CXX ASM)
Corentin Wallez0866b292015-12-09 13:49:40 -050020
Corentin Wallez0866b292015-12-09 13:49:40 -050021###########################################################
22# Detect system
23###########################################################
24
Nicolas Capens6f422092015-12-23 15:12:45 -050025if(CMAKE_SYSTEM_NAME MATCHES "Linux")
Nicolas Capens1dfcdb02020-03-12 21:12:52 +000026 set(LINUX TRUE)
Stephen Whitee6ab01f2019-04-04 14:31:25 -040027elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
Nicolas Capens1dfcdb02020-03-12 21:12:52 +000028 set(ANDROID TRUE)
Stephen Whitee6ab01f2019-04-04 14:31:25 -040029 set(CMAKE_CXX_FLAGS "-DANDROID_NDK_BUILD")
Corentin Wallez0866b292015-12-09 13:49:40 -050030elseif(WIN32)
31elseif(APPLE)
David 'Digit' Turnerd3717932019-11-19 17:54:00 +010032elseif(FUCHSIA)
33 # NOTE: Building for Fuchsia requires a Fuchsia CMake-based SDK.
34 # See https://fuchsia-review.googlesource.com/c/fuchsia/+/379673
David 'Digit' Turner08090462020-04-17 15:53:21 +020035 find_package(FuchsiaLibraries)
Corentin Wallez0866b292015-12-09 13:49:40 -050036else()
37 message(FATAL_ERROR "Platform is not supported")
38endif()
39
Nicolas Capens30cd7d42017-04-25 15:17:25 -040040if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch")
41 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
42 set(ARCH "aarch64")
43 else()
44 set(ARCH "arm")
45 endif()
Gordana Cmiljanovic082dfec2018-10-19 11:36:15 +020046elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips*")
47 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
48 set(ARCH "mips64el")
49 else()
50 set(ARCH "mipsel")
51 endif()
Colin Samplesf63a3ab2019-06-13 12:53:09 -040052elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc*")
53 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
54 set(ARCH "ppc64le")
55 else()
56 message(FATAL_ERROR "Architecture is not supported")
57 endif()
Corentin Wallez0866b292015-12-09 13:49:40 -050058else()
Nicolas Capens30cd7d42017-04-25 15:17:25 -040059 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
60 set(ARCH "x86_64")
61 else()
62 set(ARCH "x86")
63 endif()
Corentin Wallez0866b292015-12-09 13:49:40 -050064endif()
65
Nicolas Capens1dfcdb02020-03-12 21:12:52 +000066set(CMAKE_MACOSX_RPATH TRUE)
Nicolas Capens007c6c52017-06-09 11:21:48 -040067
Nicolas Capensd7a21cc2018-09-11 13:09:28 -040068if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQUAL ""))
69 message(WARNING "Visual Studio generators use the x86 host compiler by "
70 "default, even for 64-bit targets. This can result in linker "
71 "instability and out of memory errors. To use the 64-bit "
72 "host compiler, pass -Thost=x64 on the CMake command line.")
73endif()
74
Ben Clayton4901ffd2019-06-27 10:39:07 +010075# Use CCache if available
76find_program(CCACHE_FOUND ccache)
77if(CCACHE_FOUND)
78 message(STATUS "Using ccache")
79 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
80 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
Ben Clayton1e8486b2020-01-22 17:01:52 +000081endif()
Ben Clayton4901ffd2019-06-27 10:39:07 +010082
Corentin Wallez0866b292015-12-09 13:49:40 -050083###########################################################
Ben Claytona9af8832019-08-14 13:09:43 +010084# Host libraries
85###########################################################
86
87find_library(X11 X11)
88find_library(XCB xcb)
89
90###########################################################
Nicolas Capens18b8d682017-07-25 15:31:45 -040091# Options
92###########################################################
93
94if(NOT CMAKE_BUILD_TYPE)
95 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release MinSizeRel RelWithDebInfo." FORCE)
Antonio Maiorano31038ea2020-04-15 16:47:00 -040096 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)
Nicolas Capens18b8d682017-07-25 15:31:45 -040097endif()
Nicolas Capens18b8d682017-07-25 15:31:45 -040098
Ben Clayton5837d872020-01-20 16:23:36 +000099function (option_if_not_defined name description default)
100 if(NOT DEFINED ${name})
101 option(${name} ${description} ${default})
102 endif()
103endfunction()
Nicolas Capens18b8d682017-07-25 15:31:45 -0400104
Ben Clayton9cc163c2020-01-20 16:26:36 +0000105function (set_if_not_defined name value)
106 if(NOT DEFINED ${name})
107 set(${name} ${value} PARENT_SCOPE)
108 endif()
109endfunction()
110
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000111option_if_not_defined(SWIFTSHADER_BUILD_EGL "Build the EGL library" TRUE)
112option_if_not_defined(SWIFTSHADER_BUILD_GLESv2 "Build the OpenGL ES 2 library" TRUE)
113option_if_not_defined(SWIFTSHADER_BUILD_GLES_CM "Build the OpenGL ES 1.1 library" TRUE)
114option_if_not_defined(SWIFTSHADER_BUILD_VULKAN "Build the Vulkan library" TRUE)
Nicolas Capens13943ba2020-03-17 22:36:24 -0400115option_if_not_defined(SWIFTSHADER_BUILD_PVR "Build the PowerVR examples" TRUE)
116option_if_not_defined(SWIFTSHADER_GET_PVR "Check out the PowerVR submodule" FALSE)
Nicolas Capens18b8d682017-07-25 15:31:45 -0400117
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000118option_if_not_defined(SWIFTSHADER_USE_GROUP_SOURCES "Group the source files in a folder tree for Visual Studio" TRUE)
Nicolas Capens18b8d682017-07-25 15:31:45 -0400119
Nicolas Capens45755df2020-03-30 12:42:40 -0400120option_if_not_defined(SWIFTSHADER_BUILD_TESTS "Build unit tests" TRUE)
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000121option_if_not_defined(SWIFTSHADER_BUILD_BENCHMARKS "Build benchmarks" FALSE)
Ben Clayton5837d872020-01-20 16:23:36 +0000122
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000123option_if_not_defined(SWIFTSHADER_MSAN "Build with memory sanitizer" FALSE)
124option_if_not_defined(SWIFTSHADER_ASAN "Build with address sanitizer" FALSE)
125option_if_not_defined(SWIFTSHADER_TSAN "Build with thread sanitizer" FALSE)
126option_if_not_defined(SWIFTSHADER_UBSAN "Build with undefined behavior sanitizer" FALSE)
Ben Clayton063fc022020-03-23 13:18:09 +0000127option_if_not_defined(SWIFTSHADER_EMIT_COVERAGE "Emit code coverage information" FALSE)
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000128option_if_not_defined(SWIFTSHADER_WARNINGS_AS_ERRORS "Treat all warnings as errors" TRUE)
129option_if_not_defined(SWIFTSHADER_DCHECK_ALWAYS_ON "Check validation macros even in release builds" FALSE)
130option_if_not_defined(REACTOR_EMIT_DEBUG_INFO "Emit debug info for JIT functions" FALSE)
131option_if_not_defined(REACTOR_EMIT_PRINT_LOCATION "Emit printing of location info for JIT functions" FALSE)
132option_if_not_defined(REACTOR_ENABLE_PRINT "Enable RR_PRINT macros" FALSE)
133option_if_not_defined(REACTOR_VERIFY_LLVM_IR "Check reactor-generated LLVM IR is valid even in release builds" FALSE)
134option_if_not_defined(SWIFTSHADER_LESS_DEBUG_INFO "Generate less debug info to reduce file size" FALSE)
135option_if_not_defined(SWIFTSHADER_ENABLE_VULKAN_DEBUGGER "Enable Vulkan debugger support" FALSE)
136option_if_not_defined(SWIFTSHADER_ENABLE_ASTC "Enable ASTC compressed textures support" TRUE) # TODO(b/150130101)
Nicolas Capensbf8fd5b2018-06-21 00:42:00 -0400137
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500138set(BUILD_MARL ${SWIFTSHADER_BUILD_VULKAN})
Ben Clayton5e4d55f2019-12-10 19:40:58 +0000139
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500140if(${SWIFTSHADER_BUILD_VULKAN} AND ${SWIFTSHADER_ENABLE_VULKAN_DEBUGGER})
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000141 set_if_not_defined(SWIFTSHADER_BUILD_CPPDAP TRUE)
Ben Clayton5e4d55f2019-12-10 19:40:58 +0000142else()
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000143 set_if_not_defined(SWIFTSHADER_BUILD_CPPDAP FALSE)
Ben Clayton5e4d55f2019-12-10 19:40:58 +0000144endif()
Ben Claytone693b622019-09-05 12:48:37 +0100145
Nicolas Capens5f8a16a2019-08-15 10:36:13 -0400146set(DEFAULT_REACTOR_BACKEND "LLVM")
Nicolas Capens3957b7f2018-10-15 12:54:41 -0400147set(REACTOR_BACKEND ${DEFAULT_REACTOR_BACKEND} CACHE STRING "JIT compiler back-end used by Reactor")
Nicolas Capens18b8d682017-07-25 15:31:45 -0400148set_property(CACHE REACTOR_BACKEND PROPERTY STRINGS LLVM Subzero)
149
Ben Claytoncafff782020-03-26 11:18:05 +0000150set(DEFAULT_SWIFTSHADER_LLVM_VERSION "7.0")
151set(SWIFTSHADER_LLVM_VERSION ${DEFAULT_SWIFTSHADER_LLVM_VERSION} CACHE STRING "LLVM version to use")
152set_property(CACHE SWIFTSHADER_LLVM_VERSION PROPERTY STRINGS "7.0" "10.0")
153
Antonio Maiorano062dc182019-12-09 11:52:31 -0500154# If defined, overrides the default optimization level of the current reactor backend.
155# Set to one of the rr::Optimization::Level enum values.
156set(REACTOR_DEFAULT_OPT_LEVEL "Default" CACHE STRING "Reactor default optimization level")
157set_property(CACHE REACTOR_DEFAULT_OPT_LEVEL PROPERTY STRINGS "None" "Less" "Default" "Aggressive")
158
Nicolas Capens18b8d682017-07-25 15:31:45 -0400159# LLVM disallows calling cmake . from the main LLVM dir, the reason is that
160# it builds header files that could overwrite the orignal ones. Here we
161# want to include LLVM as a subdirectory and even though it wouldn't cause
162# the problem, if cmake . is called from the main dir, the condition that
Erwin Jansend46faeb2018-11-19 16:01:37 -0800163# LLVM checkes, "CMAKE_CURRENT_SOURCE_DIR == CMAKE_CURRENT_BINARY_DIR" will be true. So we
Nicolas Capens18b8d682017-07-25 15:31:45 -0400164# disallow it ourselves too to. In addition if there are remining CMakeFiles
165# and CMakeCache in the directory, cmake .. from a subdirectory will still
166# try to build from the main directory so we instruct users to delete these
167# files when they get the error.
Erwin Jansend46faeb2018-11-19 16:01:37 -0800168if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
Nicolas Capens18b8d682017-07-25 15:31:45 -0400169 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.")
170endif()
171
Nicolas Capens1dfcdb02020-03-12 21:12:52 +0000172set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)
Nicolas Capens18b8d682017-07-25 15:31:45 -0400173
174###########################################################
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400175# Directories
176###########################################################
177
Antonio Maiorano8772b422020-04-15 15:00:36 -0400178set(SWIFTSHADER_DIR ${CMAKE_CURRENT_SOURCE_DIR})
179set(SOURCE_DIR ${SWIFTSHADER_DIR}/src)
180set(THIRD_PARTY_DIR ${SWIFTSHADER_DIR}/third_party)
181set(TESTS_DIR ${SWIFTSHADER_DIR}/tests)
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400182
183###########################################################
Nicolas Capensfe5861b2018-08-03 16:01:48 -0400184# Initialize submodules
185###########################################################
186
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400187function(InitSubmodule target submodule_dir)
188 if (NOT TARGET ${target})
189 if(NOT EXISTS ${submodule_dir}/.git)
Ben Clayton55890e12020-01-31 14:07:21 +0000190 message(WARNING "
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400191 Target ${target} from submodule ${submodule_dir} missing.
Ben Clayton55890e12020-01-31 14:07:21 +0000192 Running 'git submodule update --init' to download it:
193 ")
Nicolas Capensfe5861b2018-08-03 16:01:48 -0400194
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400195 execute_process(COMMAND git -C ${SWIFTSHADER_DIR} submodule update --init ${submodule_dir})
Ben Clayton55890e12020-01-31 14:07:21 +0000196 endif()
Dan Sinclair6480d4e2019-03-11 10:48:19 -0400197 endif()
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400198endfunction()
199
200if (SWIFTSHADER_BUILD_TESTS)
201 InitSubmodule(gtest ${THIRD_PARTY_DIR}/googletest)
Nicolas Capensfe5861b2018-08-03 16:01:48 -0400202endif()
203
Ben Clayton55890e12020-01-31 14:07:21 +0000204if(SWIFTSHADER_BUILD_BENCHMARKS)
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400205 InitSubmodule(benchmark::benchmark ${THIRD_PARTY_DIR}/benchmark)
Nicolas Capensaca9fb22020-06-10 12:53:31 -0400206 InitSubmodule(glslang ${THIRD_PARTY_DIR}/glslang)
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400207endif()
Ben Clayton55890e12020-01-31 14:07:21 +0000208
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400209if(REACTOR_EMIT_DEBUG_INFO)
210 InitSubmodule(libbacktrace ${THIRD_PARTY_DIR}/libbacktrace/src)
Ben Clayton755467c2019-03-23 11:57:02 +0000211endif()
212
Nicolas Capens13943ba2020-03-17 22:36:24 -0400213if(SWIFTSHADER_GET_PVR)
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400214 InitSubmodule(PVRCore ${THIRD_PARTY_DIR}/PowerVR_Examples)
Nicolas Capens13943ba2020-03-17 22:36:24 -0400215 set(SWIFTSHADER_GET_PVR FALSE CACHE BOOL "Check out the PowerVR submodule" FORCE)
216endif()
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400217if(EXISTS ${THIRD_PARTY_DIR}/PowerVR_Examples/.git)
Nicolas Capens13943ba2020-03-17 22:36:24 -0400218 set(HAVE_PVR_SUBMODULE TRUE)
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500219endif()
220
Antonio Maiorano1e2fba32020-04-15 16:02:58 -0400221if(SWIFTSHADER_BUILD_CPPDAP)
222 InitSubmodule(json ${THIRD_PARTY_DIR}/json)
223 InitSubmodule(cppdap ${THIRD_PARTY_DIR}/cppdap)
224endif()
225
226
Nicolas Capensfe5861b2018-08-03 16:01:48 -0400227###########################################################
Corentin Wallez0866b292015-12-09 13:49:40 -0500228# Convenience macros
229###########################################################
230
231# Recursively calls source_group on the files of the directory
232# so that Visual Studio has the files in a folder tree
233macro(group_all_sources directory)
Antonio Maiorano8772b422020-04-15 15:00:36 -0400234 file(GLOB files RELATIVE ${SWIFTSHADER_DIR}/${directory} ${SWIFTSHADER_DIR}/${directory}/*)
Corentin Wallez0866b292015-12-09 13:49:40 -0500235 foreach(file ${files})
Antonio Maiorano8772b422020-04-15 15:00:36 -0400236 if(IS_DIRECTORY ${SWIFTSHADER_DIR}/${directory}/${file})
Corentin Wallez0866b292015-12-09 13:49:40 -0500237 group_all_sources(${directory}/${file})
238 else()
239 string(REPLACE "/" "\\" groupname ${directory})
Antonio Maiorano8772b422020-04-15 15:00:36 -0400240 source_group(${groupname} FILES ${SWIFTSHADER_DIR}/${directory}/${file})
Corentin Wallez0866b292015-12-09 13:49:40 -0500241 endif()
242 endforeach()
243endmacro()
244
245# Takes target library and a directory where the export map is
246# and add the linker options so that only the API symbols are
247# exported.
Nicolas Capens499bb762018-06-29 13:30:57 -0400248macro(set_shared_library_export_map TARGET DIR)
Corentin Wallez0866b292015-12-09 13:49:40 -0500249 if(MSVC)
Nicolas Capens499bb762018-06-29 13:30:57 -0400250 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " /DEF:\"${DIR}/${TARGET}.def\"")
Ben Clayton8565e772019-06-10 11:58:37 +0100251 elseif(APPLE)
252 # The exported symbols list only exports the API functions and
253 # hides all the others.
254 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS "-exported_symbols_list ${DIR}/${TARGET}.exports")
255 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_DEPENDS "${DIR}/${TARGET}.exports;")
256 # Don't allow undefined symbols, unless it's a Sanitizer build.
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500257 if(NOT SWIFTSHADER_MSAN AND NOT SWIFTSHADER_ASAN AND NOT SWIFTSHADER_TSAN AND NOT SWIFTSHADER_UBSAN)
Ben Clayton8565e772019-06-10 11:58:37 +0100258 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-undefined,error")
259 endif()
David 'Digit' Turnerd3717932019-11-19 17:54:00 +0100260 elseif(LINUX OR FUCHSIA)
David 'Digit' Turner6e445042020-04-17 16:27:56 +0200261 # NOTE: The Fuchsia linker script is needed to export the vk_icdInitializeConnectToServiceCallback
262 # entry point (a private implementation detail betwen the Fuchsia Vulkan loader and the ICD).
263 if ((FUCHSIA) AND ("${TARGET}" STREQUAL "vk_swiftshader"))
264 set(LINKER_VERSION_SCRIPT "fuchsia_vk_swiftshader.lds")
265 else()
266 set(LINKER_VERSION_SCRIPT "${TARGET}.lds")
267 endif()
268
Corentin Wallez0866b292015-12-09 13:49:40 -0500269 # The version script only exports the API functions and
Nicolas Capens499bb762018-06-29 13:30:57 -0400270 # hides all the others.
David 'Digit' Turner6e445042020-04-17 16:27:56 +0200271 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--version-script=${DIR}/${LINKER_VERSION_SCRIPT}")
272 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_DEPENDS "${DIR}/${LINKER_VERSION_SCRIPT};")
Nicolas Capensbf8fd5b2018-06-21 00:42:00 -0400273
Nicolas Capense3621dc2020-02-25 22:45:42 -0500274 # -Bsymbolic binds symbol references to their global definitions within
275 # a shared object, thereby preventing symbol preemption.
James Price126720b2020-03-03 10:20:00 -0500276 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bsymbolic")
Nicolas Capens517a57f2018-06-29 13:30:57 -0400277
Gordana Cmiljanovic20622c02018-11-05 15:00:11 +0100278 if(ARCH STREQUAL "mipsel" OR ARCH STREQUAL "mips64el")
Gordana Cmiljanovic082dfec2018-10-19 11:36:15 +0200279 # MIPS supports sysv hash-style only.
280 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--hash-style=sysv")
David 'Digit' Turnerd3717932019-11-19 17:54:00 +0100281 elseif(LINUX)
Gordana Cmiljanovic082dfec2018-10-19 11:36:15 +0200282 # Both hash-style are needed, because we want both gold and
283 # GNU ld to be able to read our libraries.
284 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--hash-style=both")
285 endif()
Nicolas Capens499bb762018-06-29 13:30:57 -0400286
Ben Clayton063fc022020-03-23 13:18:09 +0000287 if(NOT ${SWIFTSHADER_EMIT_COVERAGE})
288 # Gc sections is used in combination with each functions being
289 # in its own section, to reduce the binary size.
290 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--gc-sections")
291 endif()
Nicolas Capens499bb762018-06-29 13:30:57 -0400292
293 # Don't allow undefined symbols, unless it's a Sanitizer build.
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500294 if(NOT SWIFTSHADER_MSAN AND NOT SWIFTSHADER_ASAN AND NOT SWIFTSHADER_TSAN AND NOT SWIFTSHADER_UBSAN)
Nicolas Capensbf8fd5b2018-06-21 00:42:00 -0400295 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--no-undefined")
296 endif()
Corentin Wallez0866b292015-12-09 13:49:40 -0500297 endif()
298endmacro()
299
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500300if(SWIFTSHADER_USE_GROUP_SOURCES)
Corentin Wallez0866b292015-12-09 13:49:40 -0500301 group_all_sources(src)
302endif()
303
304###########################################################
Corentin Wallez0866b292015-12-09 13:49:40 -0500305# Compile flags
306###########################################################
307
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100308# Flags for project code (non 3rd party)
309set(SWIFTSHADER_COMPILE_OPTIONS "")
Ben Clayton063fc022020-03-23 13:18:09 +0000310set(SWIFTSHADER_LINK_FLAGS "")
311set(SWIFTSHADER_LIBS "")
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100312
Nicolas Capens6f422092015-12-23 15:12:45 -0500313macro(set_cpp_flag FLAG)
314 if(${ARGC} GREATER 1)
315 set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${FLAG}")
Corentin Wallez0866b292015-12-09 13:49:40 -0500316 else()
Nicolas Capens6f422092015-12-23 15:12:45 -0500317 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
Corentin Wallez0866b292015-12-09 13:49:40 -0500318 endif()
319endmacro()
320
Ben Clayton48c8a182019-05-21 20:00:20 +0100321macro(set_linker_flag FLAG)
322 if(${ARGC} GREATER 1)
Nicolas Capens5d4c9812020-07-02 10:06:25 -0400323 set(CMAKE_EXE_LINKER_FLAGS_${ARGV1} "${CMAKE_EXE_LINKER_FLAGS_${ARGV1}} ${FLAG}")
Ben Clayton48c8a182019-05-21 20:00:20 +0100324 else()
325 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}")
326 endif()
327endmacro()
328
Corentin Wallez0866b292015-12-09 13:49:40 -0500329if(MSVC)
330 set_cpp_flag("/MP")
331 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
Antonio Maiorano5bce1f42019-05-10 16:03:49 -0400332 add_definitions(-D_SCL_SECURE_NO_WARNINGS)
Nicolas Capens4c9f04b2019-01-31 22:09:03 -0500333 add_definitions(-D_SBCS) # Single Byte Character Set (ASCII)
Ben Clayton30b6b592019-08-07 15:04:11 +0100334 add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE) # Disable MSVC warnings about std::aligned_storage being broken before VS 2017 15.8
Antonio Maiorano5bce1f42019-05-10 16:03:49 -0400335
Nicolas Capens5d4c9812020-07-02 10:06:25 -0400336 set_linker_flag("/DEBUG:FASTLINK" DEBUG)
337 set_linker_flag("/DEBUG:FASTLINK" RELWITHDEBINFO)
Nicolas Capensf554c542020-01-09 17:19:35 +0000338
Antonio Maiorano5bce1f42019-05-10 16:03:49 -0400339 # Disable specific warnings
340 # TODO: Not all of these should be disabled, but for now, we want a warning-free msvc build. Remove these one by one
341 # and fix the actual warnings in code.
342 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
343 "/wd4005" # 'identifier' : macro redefinition
344 "/wd4018" # 'expression' : signed/unsigned mismatch
Ben Clayton4d4a1902019-05-15 11:15:42 +0100345 "/wd4065" # switch statement contains 'default' but no 'case' labels
Antonio Maiorano5bce1f42019-05-10 16:03:49 -0400346 "/wd4141" # 'modifier' : used more than once
Antonio Maiorano5bce1f42019-05-10 16:03:49 -0400347 "/wd4244" # 'conversion' conversion from 'type1' to 'type2', possible loss of data
348 "/wd4267" # 'var' : conversion from 'size_t' to 'type', possible loss of data
349 "/wd4291" # 'void X new(size_t,unsigned int,unsigned int)': no matching operator delete found; memory will not be freed if initialization throws an exception
350 "/wd4309" # 'conversion' : truncation of constant value
351 "/wd4624" # 'derived class' : destructor was implicitly defined as deleted because a base class destructor is inaccessible or deleted
352 "/wd4800" # 'type' : forcing value to bool 'true' or 'false' (performance warning)
353 "/wd4838" # conversion from 'type_1' to 'type_2' requires a narrowing conversion
354 "/wd5030" # attribute 'attribute' is not recognized
355 "/wd5038" # data member 'member1' will be initialized after data member 'member2' data member 'member' will be initialized after base class 'base_class'
356 )
357
358 # Treat specific warnings as errors
359 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
360 "/we4018" # 'expression' : signed/unsigned mismatch
Antonio Maiorano23da0732019-05-14 22:32:16 -0400361 "/we4471" # 'enumeration': a forward declaration of an unscoped enumeration must have an underlying type (int assumed)
Antonio Maiorano5bce1f42019-05-10 16:03:49 -0400362 "/we4838" # conversion from 'type_1' to 'type_2' requires a narrowing conversion
363 "/we5038" # data member 'member1' will be initialized after data member 'member2' data member 'member' will be initialized after base class 'base_class'
364 )
Corentin Wallez0866b292015-12-09 13:49:40 -0500365else()
Ben Claytona5f07632020-02-04 11:43:25 +0000366 # Explicitly enable these warnings.
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100367 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100368 "-Wall"
Ben Clayton8a983f72019-06-18 17:56:36 +0100369 "-Wreorder"
370 "-Wsign-compare"
371 "-Wmissing-braces"
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100372 )
Corentin Wallez0866b292015-12-09 13:49:40 -0500373
Ben Clayton5e828762019-04-24 19:16:52 +0100374 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100375 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
Ben Clayton54709882020-04-16 10:40:08 +0100376 "-Wextra"
377 "-Wunreachable-code-loop-increment"
Ben Clayton8a983f72019-06-18 17:56:36 +0100378 "-Wunused-lambda-capture"
379 "-Wstring-conversion"
380 "-Wextra-semi"
381 "-Wignored-qualifiers"
Ben Claytona5f07632020-02-04 11:43:25 +0000382 )
383 endif()
384
Ben Clayton063fc022020-03-23 13:18:09 +0000385 if (SWIFTSHADER_EMIT_COVERAGE)
386 if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
387 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "--coverage")
388 list(APPEND SWIFTSHADER_LIBS "gcov")
389 elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
390 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-fprofile-instr-generate" "-fcoverage-mapping")
391 list(APPEND SWIFTSHADER_LINK_FLAGS "-fprofile-instr-generate" "-fcoverage-mapping")
392 else()
393 message(FATAL_ERROR "Coverage generation not supported for the ${CMAKE_CXX_COMPILER_ID} toolchain")
394 endif()
395 endif()
396
Ben Claytona5f07632020-02-04 11:43:25 +0000397 # Disable pedanitc warnings
398 if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
399 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
400 "-Wno-ignored-attributes" # ignoring attributes on template argument 'X'
401 "-Wno-attributes" # 'X' attribute ignored
402 "-Wno-strict-aliasing" # dereferencing type-punned pointer will break strict-aliasing rules
403 "-Wno-comment" # multi-line comment
404 )
405 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 9)
406 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
407 "-Wno-init-list-lifetime" # assignment from temporary initializer_list does not extend the lifetime of the underlying array
408 )
409 endif()
410 elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
411 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
412 "-Wno-unneeded-internal-declaration" # function 'X' is not needed and will not be emitted
413 "-Wno-unused-private-field" # private field 'offset' is not used - TODO: Consider enabling this once Vulkan is further implemented.
414 "-Wno-comment" # multi-line comment
415 "-Wno-undefined-var-template" # instantiation of variable 'X' required here, but no definition is available
Ben Claytona7bc2b92020-03-26 11:24:49 +0000416 "-Wno-extra-semi" # extra ';' after member function definition
Ben Clayton54709882020-04-16 10:40:08 +0100417 "-Wno-unused-parameter" # unused parameter 'X'
David 'Digit' Turner08090462020-04-17 15:53:21 +0200418 "-Wno-deprecated-copy" # implicit copy constructor for 'X' is deprecated because of user-declared copy assignment operator.
Ben Claytona5f07632020-02-04 11:43:25 +0000419
Nicolas Capens67180a02019-06-17 15:27:03 -0400420 # Silence errors caused by unknown warnings when building with older
421 # versions of Clang. This demands checking that warnings added above
422 # are spelled correctly and work as intended!
423 "-Wno-unknown-warning-option"
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100424 )
Nicolas Capens825d3442018-11-06 23:50:05 -0500425 endif()
426
Corentin Wallez0866b292015-12-09 13:49:40 -0500427 # Remove xor, and, or and friends from the list of keywords, they are used
428 # by Reactor
Ben Clayton4ceb77d2019-04-24 12:09:59 +0100429 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
430 "-fno-operator-names"
431 )
Corentin Wallez0866b292015-12-09 13:49:40 -0500432
Nicolas Capens499bb762018-06-29 13:30:57 -0400433 if(ARCH STREQUAL "x86")
Corentin Wallez0866b292015-12-09 13:49:40 -0500434 set_cpp_flag("-m32")
435 set_cpp_flag("-msse2")
Nicolas Capens0424edc2018-01-03 14:06:30 -0500436 set_cpp_flag("-mfpmath=sse")
437 set_cpp_flag("-march=pentium4")
438 set_cpp_flag("-mtune=generic")
Corentin Wallez0866b292015-12-09 13:49:40 -0500439 endif()
Nicolas Capens499bb762018-06-29 13:30:57 -0400440 if(ARCH STREQUAL "x86_64")
Corentin Wallez0866b292015-12-09 13:49:40 -0500441 set_cpp_flag("-m64")
442 set_cpp_flag("-fPIC")
Nicolas Capens0424edc2018-01-03 14:06:30 -0500443 set_cpp_flag("-march=x86-64")
444 set_cpp_flag("-mtune=generic")
Corentin Wallez0866b292015-12-09 13:49:40 -0500445 endif()
Gordana Cmiljanovic082dfec2018-10-19 11:36:15 +0200446 if(ARCH STREQUAL "mipsel")
Jiaxun Yang55275c32020-02-09 14:52:42 +0800447 set_cpp_flag("-EL")
Gordana Cmiljanovic082dfec2018-10-19 11:36:15 +0200448 set_cpp_flag("-march=mips32r2")
449 set_cpp_flag("-fPIC")
450 set_cpp_flag("-mhard-float")
451 set_cpp_flag("-mfp32")
Jiaxun Yang55275c32020-02-09 14:52:42 +0800452 set_cpp_flag("-mxgot")
Gordana Cmiljanovic082dfec2018-10-19 11:36:15 +0200453 endif()
Gordana Cmiljanovic20622c02018-11-05 15:00:11 +0100454 if(ARCH STREQUAL "mips64el")
Jiaxun Yang55275c32020-02-09 14:52:42 +0800455 set_cpp_flag("-EL")
Gordana Cmiljanovic20622c02018-11-05 15:00:11 +0100456 set_cpp_flag("-march=mips64r2")
457 set_cpp_flag("-mabi=64")
458 set_cpp_flag("-fPIC")
Jiaxun Yang55275c32020-02-09 14:52:42 +0800459 set_cpp_flag("-mxgot")
Gordana Cmiljanovic20622c02018-11-05 15:00:11 +0100460 endif()
Nicolas Capens499bb762018-06-29 13:30:57 -0400461
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500462 if(SWIFTSHADER_LESS_DEBUG_INFO)
Paul Thomson09b50792019-10-17 12:55:56 +0100463 # Use -g1 to be able to get stack traces
464 set_cpp_flag("-g -g1" DEBUG)
465 set_cpp_flag("-g -g1" RELWITHDEBINFO)
466 else()
467 # Use -g3 to have even more debug info
468 set_cpp_flag("-g -g3" DEBUG)
469 set_cpp_flag("-g -g3" RELWITHDEBINFO)
470 endif()
471
Ben Clayton09a91e42019-02-05 17:58:38 +0000472 if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
473 # Treated as an unused argument with clang
474 set_cpp_flag("-s" RELEASE)
475 endif()
Corentin Wallez0866b292015-12-09 13:49:40 -0500476
477 # For distribution it is more important to be slim than super optimized
Alexis Hetu2c0546d2017-05-24 11:16:26 -0400478 set_cpp_flag("-Os" RELEASE)
479 set_cpp_flag("-Os" RELWITHDEBINFO)
Corentin Wallez0866b292015-12-09 13:49:40 -0500480
481 set_cpp_flag("-DNDEBUG" RELEASE)
482 set_cpp_flag("-DNDEBUG" RELWITHDEBINFO)
483 set_cpp_flag("-DANGLE_DISABLE_TRACE" RELEASE)
484 set_cpp_flag("-DANGLE_DISABLE_TRACE" RELWITHDEBINFO)
485
486 # Put each variable and function in its own section so that when linking
487 # with -gc-sections unused functions and variables are removed.
488 set_cpp_flag("-ffunction-sections" RELEASE)
489 set_cpp_flag("-fdata-sections" RELEASE)
490 set_cpp_flag("-fomit-frame-pointer" RELEASE)
Nicolas Capensbf8fd5b2018-06-21 00:42:00 -0400491
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500492 if(SWIFTSHADER_MSAN)
Ben Claytondae97922019-05-17 12:09:31 +0100493 set_cpp_flag("-fsanitize=memory")
Ben Clayton48c8a182019-05-21 20:00:20 +0100494 set_linker_flag("-fsanitize=memory")
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500495 elseif(SWIFTSHADER_ASAN)
Ben Claytondae97922019-05-17 12:09:31 +0100496 set_cpp_flag("-fsanitize=address")
Ben Clayton48c8a182019-05-21 20:00:20 +0100497 set_linker_flag("-fsanitize=address")
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500498 elseif(SWIFTSHADER_TSAN)
Ben Claytondae97922019-05-17 12:09:31 +0100499 set_cpp_flag("-fsanitize=thread")
Ben Clayton48c8a182019-05-21 20:00:20 +0100500 set_linker_flag("-fsanitize=thread")
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500501 elseif(SWIFTSHADER_UBSAN)
Ben Claytondae97922019-05-17 12:09:31 +0100502 set_cpp_flag("-fsanitize=undefined")
Ben Clayton48c8a182019-05-21 20:00:20 +0100503 set_linker_flag("-fsanitize=undefined")
Nicolas Capensbf8fd5b2018-06-21 00:42:00 -0400504 endif()
Corentin Wallez0866b292015-12-09 13:49:40 -0500505endif()
506
Antonio Maiorano4b8b0782020-03-23 14:11:01 -0400507if(SWIFTSHADER_DCHECK_ALWAYS_ON)
508 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DDCHECK_ALWAYS_ON")
509endif()
510
Nicolas Capens8c13b2f2020-03-06 01:12:01 -0500511if(SWIFTSHADER_WARNINGS_AS_ERRORS)
512 if(MSVC)
513 set(WARNINGS_AS_ERRORS "/WX") # Treat all warnings as errors
514 else()
515 set(WARNINGS_AS_ERRORS "-Werror") # Treat all warnings as errors
516 endif()
517endif()
518
Antonio Maioranof448d8e2019-04-26 16:19:16 -0400519if(REACTOR_EMIT_PRINT_LOCATION)
Antonio Maiorano415d1812020-02-11 16:22:55 -0500520 # This feature depends on REACTOR_EMIT_DEBUG_INFO and REACTOR_ENABLE_PRINT
Antonio Maioranof448d8e2019-04-26 16:19:16 -0400521 set(REACTOR_EMIT_DEBUG_INFO "On")
Antonio Maiorano415d1812020-02-11 16:22:55 -0500522 set(REACTOR_ENABLE_PRINT "On")
Antonio Maioranof448d8e2019-04-26 16:19:16 -0400523 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_EMIT_PRINT_LOCATION")
524endif()
525
526if(REACTOR_EMIT_DEBUG_INFO)
527 message(WARNING "REACTOR_EMIT_DEBUG_INFO is enabled. This will likely affect performance.")
528 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_DEBUG_INFO")
529endif()
530
Antonio Maiorano415d1812020-02-11 16:22:55 -0500531if(REACTOR_ENABLE_PRINT)
532 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_PRINT")
533endif()
534
Ben Clayton5375f472019-06-24 13:33:11 +0100535if(REACTOR_VERIFY_LLVM_IR)
536 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_LLVM_IR_VERIFICATION")
537endif()
538
Antonio Maiorano062dc182019-12-09 11:52:31 -0500539if(REACTOR_DEFAULT_OPT_LEVEL)
540 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DREACTOR_DEFAULT_OPT_LEVEL=${REACTOR_DEFAULT_OPT_LEVEL}")
541endif()
542
Nicolas Capensbf8fd5b2018-06-21 00:42:00 -0400543if(WIN32)
Corentin Wallez0866b292015-12-09 13:49:40 -0500544 add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
Nicolas Capens6f422092015-12-23 15:12:45 -0500545 set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
Corentin Wallez0866b292015-12-09 13:49:40 -0500546endif()
547
Antonio Maiorano61022762020-03-30 11:11:16 -0400548set(USE_EXCEPTIONS
549 ${REACTOR_EMIT_DEBUG_INFO} # boost::stacktrace uses exceptions
550)
551if(NOT MSVC)
552 if (${USE_EXCEPTIONS})
553 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-fexceptions")
554 else()
555 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-fno-exceptions")
556 endif()
557endif()
Antonio Maiorano9418b512020-04-08 23:18:13 -0400558unset(USE_EXCEPTIONS)
Antonio Maiorano61022762020-03-30 11:11:16 -0400559
Corentin Wallez0866b292015-12-09 13:49:40 -0500560###########################################################
Antonio Maioranofa8f48d2020-03-30 16:41:48 -0400561# libbacktrace and boost
562###########################################################
563if(REACTOR_EMIT_DEBUG_INFO)
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400564 add_subdirectory(${THIRD_PARTY_DIR}/libbacktrace EXCLUDE_FROM_ALL)
565 add_subdirectory(${THIRD_PARTY_DIR}/boost EXCLUDE_FROM_ALL)
Antonio Maioranofa8f48d2020-03-30 16:41:48 -0400566endif()
567
568###########################################################
Corentin Wallez0866b292015-12-09 13:49:40 -0500569# LLVM
570###########################################################
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400571add_subdirectory(${THIRD_PARTY_DIR}/llvm-${SWIFTSHADER_LLVM_VERSION} EXCLUDE_FROM_ALL)
Ben Clayton8f71f732019-02-01 09:38:45 +0000572
Antonio Maiorano4bde1c32020-03-27 15:01:53 -0400573###########################################################
574# Subzero
575###########################################################
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400576add_subdirectory(${THIRD_PARTY_DIR}/llvm-subzero EXCLUDE_FROM_ALL)
577add_subdirectory(${THIRD_PARTY_DIR}/subzero EXCLUDE_FROM_ALL)
Antonio Maiorano8bce0672020-02-28 13:13:45 -0500578
579###########################################################
580# marl
581###########################################################
582if(BUILD_MARL)
583 set(MARL_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400584 add_subdirectory(${THIRD_PARTY_DIR}/marl)
Antonio Maiorano8bce0672020-02-28 13:13:45 -0500585endif()
586
Ben Clayton377573c2020-04-03 20:36:40 +0100587if(MARL_THREAD_SAFETY_ANALYSIS_SUPPORTED)
588 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-Wthread-safety")
589endif()
590
Antonio Maiorano8bce0672020-02-28 13:13:45 -0500591###########################################################
592# cppdap
593###########################################################
594if(SWIFTSHADER_BUILD_CPPDAP)
595 set(CPPDAP_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400596 add_subdirectory(${THIRD_PARTY_DIR}/cppdap)
Antonio Maiorano8bce0672020-02-28 13:13:45 -0500597endif()
598
Antonio Maioranob02a7082020-03-30 21:55:20 -0400599###########################################################
600# astc-encoder
601###########################################################
602if(SWIFTSHADER_ENABLE_ASTC)
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400603 add_subdirectory(${THIRD_PARTY_DIR}/astc-encoder)
Antonio Maioranob02a7082020-03-30 21:55:20 -0400604endif()
Nicolas Capens19291ef2017-01-09 13:35:14 -0500605
Nicolas Capensf53adbd2017-01-06 12:47:46 -0500606###########################################################
Antonio Maiorano8f02f582020-03-31 11:01:43 -0400607# gtest and gmock
608###########################################################
609if(SWIFTSHADER_BUILD_TESTS)
610 # For Win32, force gtest to match our CRT (shared)
611 set(gtest_force_shared_crt TRUE CACHE BOOL "" FORCE)
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400612 add_subdirectory(${THIRD_PARTY_DIR}/googletest EXCLUDE_FROM_ALL)
Antonio Maiorano8f02f582020-03-31 11:01:43 -0400613 # gtest finds python, which picks python 2 first, if present.
614 # We need to undo this so that SPIR-V can later find python3.
615 unset(PYTHON_EXECUTABLE CACHE)
616endif()
617
618###########################################################
Corentin Wallez0866b292015-12-09 13:49:40 -0500619# File Lists
620###########################################################
621
Corentin Wallez0866b292015-12-09 13:49:40 -0500622###########################################################
623# Append OS specific files to lists
624###########################################################
625
626if(WIN32)
Corentin Wallez0866b292015-12-09 13:49:40 -0500627 set(OS_LIBS odbc32 odbccp32 WS2_32 dxguid)
628elseif(LINUX)
Nicolas Capens681d97b2016-05-17 16:02:32 -0400629 set(OS_LIBS dl pthread)
David 'Digit' Turnerd3717932019-11-19 17:54:00 +0100630elseif(FUCHSIA)
631 set(OS_LIBS zircon)
Corentin Wallezcd0a4572015-12-10 15:59:28 -0500632elseif(APPLE)
633 find_library(COCOA_FRAMEWORK Cocoa)
634 find_library(QUARTZ_FRAMEWORK Quartz)
Alexis Hetud23cf632018-04-10 10:48:42 -0400635 find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
636 find_library(IOSURFACE_FRAMEWORK IOSurface)
Corentin Wallezcb586622020-03-27 17:38:29 +0100637 find_library(METAL_FRAMEWORK Metal)
638 set(OS_LIBS "${COCOA_FRAMEWORK}" "${QUARTZ_FRAMEWORK}" "${CORE_FOUNDATION_FRAMEWORK}" "${IOSURFACE_FRAMEWORK}" "${METAL_FRAMEWORK}")
Corentin Wallez0866b292015-12-09 13:49:40 -0500639endif()
640
641###########################################################
Nicolas Capens5a105bc2015-12-22 22:04:28 -0500642# SwiftShader Targets
Corentin Wallez0866b292015-12-09 13:49:40 -0500643###########################################################
644
Antonio Maioranofa8f48d2020-03-30 16:41:48 -0400645add_subdirectory(src/Reactor) # Add ReactorSubzero and ReactorLLVM targets
Nicolas Capense329f012020-03-13 14:54:21 +0000646
Ben Claytonb99bc1f2019-04-15 13:56:08 -0400647if(${REACTOR_BACKEND} STREQUAL "LLVM")
Nicolas Capensf53adbd2017-01-06 12:47:46 -0500648 set(Reactor ReactorLLVM)
649elseif(${REACTOR_BACKEND} STREQUAL "Subzero")
650 set(Reactor ReactorSubzero)
651else()
652 message(FATAL_ERROR "REACTOR_BACKEND must be 'LLVM' or 'Subzero'")
653endif()
Corentin Wallez0866b292015-12-09 13:49:40 -0500654
Antonio Maiorano4ce6a882020-04-06 16:16:21 -0400655add_subdirectory(src/Common) # Add gl_common target
656add_subdirectory(src/Main) # Add gl_main target
657add_subdirectory(src/Shader) # Add gl_shader target
658add_subdirectory(src/Renderer) # Add gl_renderer target
659
660# Combine all gl_* targets into an interface target
661# along with other dependencies
662add_library(gl_swiftshader_core INTERFACE)
663target_link_libraries(gl_swiftshader_core INTERFACE
664 # Transitively depends on shader, main, core, Reactor,
665 # OS_LIBS and SWIFTSHADER_LIBS
666 gl_renderer
667)
668
Antonio Maioranoa71aff22020-04-07 10:09:41 -0400669add_subdirectory(src/OpenGL/common EXCLUDE_FROM_ALL) # Add libGLESCommon target
670add_subdirectory(src/OpenGL/compiler EXCLUDE_FROM_ALL) # Add GLCompiler target
Nicolas Capens6f422092015-12-23 15:12:45 -0500671
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500672if(SWIFTSHADER_BUILD_EGL)
Antonio Maioranoa71aff22020-04-07 10:09:41 -0400673 add_subdirectory(src/OpenGL/libEGL) # Add libEGL target
Corentin Wallez0866b292015-12-09 13:49:40 -0500674endif()
675
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500676if(SWIFTSHADER_BUILD_GLESv2)
Antonio Maioranoa71aff22020-04-07 10:09:41 -0400677 add_subdirectory(src/OpenGL/libGLESv2) # Add libGLESv2 target
Corentin Wallez0866b292015-12-09 13:49:40 -0500678endif()
679
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500680if(SWIFTSHADER_BUILD_GLES_CM)
Antonio Maioranoa71aff22020-04-07 10:09:41 -0400681 add_subdirectory(src/OpenGL/libGLES_CM) # Add libGLES_CM target
Ben Clayton1e8486b2020-01-22 17:01:52 +0000682endif(SWIFTSHADER_BUILD_GLES_CM)
Corentin Wallez0866b292015-12-09 13:49:40 -0500683
Sean Risserf6d3cbb2020-01-08 14:44:53 -0500684if(SWIFTSHADER_BUILD_VULKAN)
Dan Sinclair6480d4e2019-03-11 10:48:19 -0400685 if (NOT TARGET SPIRV-Tools)
686 # This variable is also used by SPIRV-Tools to locate SPIRV-Headers
Ben Claytonafb4ebd2019-12-02 19:33:17 +0000687 set(SPIRV-Headers_SOURCE_DIR "${THIRD_PARTY_DIR}/SPIRV-Headers")
Antonio Maiorano8f02f582020-03-31 11:01:43 -0400688 set(SPIRV_SKIP_TESTS TRUE CACHE BOOL "" FORCE)
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400689 add_subdirectory(${THIRD_PARTY_DIR}/SPIRV-Tools) # Add SPIRV-Tools target
Ben Clayton1e8486b2020-01-22 17:01:52 +0000690 endif()
Nicolas Capens4c9f04b2019-01-31 22:09:03 -0500691
Antonio Maiorano9418b512020-04-08 23:18:13 -0400692 # Add a vk_base interface library for shared vulkan build options.
693 # TODO: Create src/Base and make this a lib target, and move stuff from
694 # src/Vulkan into it that is needed by vk_pipeline, vk_device, and vk_wsi.
695 add_library(vk_base INTERFACE)
Ben Clayton4cdbb542020-04-14 22:51:50 +0100696
Antonio Maiorano9418b512020-04-08 23:18:13 -0400697 if(SWIFTSHADER_ENABLE_VULKAN_DEBUGGER)
698 target_compile_definitions(vk_base INTERFACE "ENABLE_VK_DEBUGGER")
David 'Digit' Turnerd3717932019-11-19 17:54:00 +0100699 endif()
Antonio Maiorano9418b512020-04-08 23:18:13 -0400700
Nicolas Capensd3545372019-08-09 13:59:18 -0400701 if(WIN32)
Antonio Maiorano9418b512020-04-08 23:18:13 -0400702 target_compile_definitions(vk_base INTERFACE "VK_USE_PLATFORM_WIN32_KHR")
Nicolas Capensd3545372019-08-09 13:59:18 -0400703 elseif(LINUX)
Ben Claytona9af8832019-08-14 13:09:43 +0100704 if(X11)
Antonio Maiorano9418b512020-04-08 23:18:13 -0400705 target_compile_definitions(vk_base INTERFACE "VK_USE_PLATFORM_XLIB_KHR")
Ben Clayton1e8486b2020-01-22 17:01:52 +0000706 endif()
Ben Claytona9af8832019-08-14 13:09:43 +0100707 if(XCB)
Antonio Maiorano9418b512020-04-08 23:18:13 -0400708 target_compile_definitions(vk_base INTERFACE "VK_USE_PLATFORM_XCB_KHR")
Ben Clayton1e8486b2020-01-22 17:01:52 +0000709 endif()
Nicolas Capensd3545372019-08-09 13:59:18 -0400710 elseif(APPLE)
Antonio Maiorano9418b512020-04-08 23:18:13 -0400711 target_compile_definitions(vk_base INTERFACE "VK_USE_PLATFORM_MACOS_MVK")
David 'Digit' Turnerd3717932019-11-19 17:54:00 +0100712 elseif(FUCHSIA)
Antonio Maiorano9418b512020-04-08 23:18:13 -0400713 target_compile_definitions(vk_base INTERFACE "VK_USE_PLATFORM_FUCHSIA")
Nicolas Capens29a98092019-04-03 14:35:10 -0400714 else()
715 message(FATAL_ERROR "Platform does not support Vulkan yet")
Nicolas Capensd3545372019-08-09 13:59:18 -0400716 endif()
717
Antonio Maiorano9418b512020-04-08 23:18:13 -0400718 add_subdirectory(src/System) # Add vk_system target
719 add_subdirectory(src/Pipeline) # Add vk_pipeline target
720 add_subdirectory(src/WSI) # Add vk_wsi target
721 add_subdirectory(src/Device) # Add vk_device target
722 add_subdirectory(src/Vulkan) # Add vk_swiftshader target
Ben Claytonac736122020-03-24 17:48:31 +0000723
Ben Clayton6ce626b2020-05-05 12:39:23 +0100724 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND # turbo-cov is only useful for clang coverage info
725 SWIFTSHADER_LLVM_VERSION EQUAL "10.0" AND # turbo-cov does not build with earlier llvm versions
726 SWIFTSHADER_EMIT_COVERAGE)
Antonio Maiorano2430d662020-04-14 17:04:36 -0400727 add_subdirectory(${TESTS_DIR}/regres/cov/turbo-cov)
Ben Claytonac736122020-03-24 17:48:31 +0000728 endif()
729
Nicolas Capens29a98092019-04-03 14:35:10 -0400730endif()
Chris Forbes3d27f2e2018-09-26 09:24:39 -0700731
Corentin Wallez0866b292015-12-09 13:49:40 -0500732###########################################################
Nicolas Capens29a98092019-04-03 14:35:10 -0400733# Sample programs and tests
Corentin Wallez0866b292015-12-09 13:49:40 -0500734###########################################################
735
Nicolas Capens13943ba2020-03-17 22:36:24 -0400736if(HAVE_PVR_SUBMODULE AND SWIFTSHADER_BUILD_PVR)
Nicolas Capens51b28002020-01-30 16:41:00 -0500737 if(UNIX AND NOT APPLE)
738 set(PVR_WINDOW_SYSTEM XCB)
Nicolas Capens7e857092020-03-06 13:21:10 -0500739
740 # Set the RPATH of the next defined build targets to $ORIGIN,
741 # allowing them to load shared libraries from the execution directory.
742 set(CMAKE_BUILD_RPATH "$ORIGIN")
Nicolas Capens51b28002020-01-30 16:41:00 -0500743 endif()
744
Nicolas Capens13943ba2020-03-17 22:36:24 -0400745 set(PVR_BUILD_EXAMPLES TRUE CACHE BOOL "Build the PowerVR SDK Examples" FORCE)
Antonio Maioranoda4315d2020-04-15 13:49:56 -0400746 add_subdirectory(${THIRD_PARTY_DIR}/PowerVR_Examples)
Nicolas Capens51b28002020-01-30 16:41:00 -0500747
Nicolas Capens51b28002020-01-30 16:41:00 -0500748 # Samples known to work well
749 set(PVR_VULKAN_TARGET_GOOD
750 VulkanBumpmap
Nicolas Capens3702e012020-03-30 09:08:47 -0400751 VulkanExampleUI
752 VulkanGaussianBlur
Nicolas Capens51b28002020-01-30 16:41:00 -0500753 VulkanGlass
754 VulkanGnomeHorde
755 VulkanHelloAPI
756 VulkanImageBasedLighting
Nicolas Capens3702e012020-03-30 09:08:47 -0400757 VulkanIntroducingPVRUtils
Nicolas Capens51b28002020-01-30 16:41:00 -0500758 VulkanMultiSampling
Nicolas Capens3702e012020-03-30 09:08:47 -0400759 VulkanNavigation2D
760 VulkanParticleSystem
Nicolas Capens51b28002020-01-30 16:41:00 -0500761 VulkanSkinning
762 )
763
Nicolas Capens3702e012020-03-30 09:08:47 -0400764 set(PVR_GLES_TARGET_GOOD
765 OpenGLESHelloAPI
766 OpenGLESIntroducingPVRUtils
767 OpenGLESNavigation2D
768 )
769
Nicolas Capens51b28002020-01-30 16:41:00 -0500770 set(PVR_VULKAN_TARGET_OTHER
771 VulkanDeferredShading
772 VulkanDeferredShadingPFX
Nicolas Capens51b28002020-01-30 16:41:00 -0500773 VulkanGameOfLife
Nicolas Capens51b28002020-01-30 16:41:00 -0500774 VulkanIBLMapsGenerator
775 VulkanIMGTextureFilterCubic
776 VulkanIntroducingPVRShell
Nicolas Capens51b28002020-01-30 16:41:00 -0500777 VulkanIntroducingPVRVk
778 VulkanIntroducingUIRenderer
779 VulkanMultithreading
Nicolas Capens51b28002020-01-30 16:41:00 -0500780 VulkanNavigation3D
Nicolas Capens51b28002020-01-30 16:41:00 -0500781 VulkanPostProcessing
782 VulkanPVRScopeExample
783 VulkanPVRScopeRemote
784 )
785
Nicolas Capens3702e012020-03-30 09:08:47 -0400786 set(PVR_GLES_TARGET_OTHER
787 OpenGLESDeferredShading
788 OpenGLESGaussianBlur
789 OpenGLESImageBasedLighting
790 OpenGLESIMGFramebufferDownsample
791 OpenGLESIMGTextureFilterCubic
792 OpenGLESIntroducingPVRCamera
793 OpenGLESIntroducingPVRShell
794 OpenGLESIntroducingUIRenderer
795 OpenGLESMultiviewVR
796 OpenGLESNavigation3D
797 OpenGLESOpenCLExample
798 OpenGLESParticleSystem
799 OpenGLESPostProcessing
800 OpenGLESPVRScopeExample
801 OpenGLESPVRScopeRemote
802 OpenGLESSkinning
803 )
804
Nicolas Capens51b28002020-01-30 16:41:00 -0500805 set(PVR_TARGET_OTHER
806 glslang
807 glslangValidator
808 glslang-default-resource-limits
809 OGLCompiler
810 OSDependent
811 OpenCLMatrixMultiplication
Nicolas Capens51b28002020-01-30 16:41:00 -0500812 pugixml
813 PVRAssets
814 PVRCamera
815 PVRCore
816 PVRPfx
817 PVRShell
818 PVRUtilsGles
819 PVRUtilsVk
820 PVRVk
821 SPIRV
822 spirv-remap
823 SPVRemapper
824 uninstall
825 )
826
827 set(PVR_VULKAN_TARGET
828 ${PVR_VULKAN_TARGET_GOOD}
829 ${PVR_VULKAN_TARGET_OTHER}
830 )
831
Nicolas Capens3702e012020-03-30 09:08:47 -0400832 set(PVR_GLES_TARGET
833 ${PVR_GLES_TARGET_GOOD}
834 ${PVR_GLES_TARGET_OTHER}
835 )
836
Nicolas Capens51b28002020-01-30 16:41:00 -0500837 foreach(pvr_target ${PVR_VULKAN_TARGET})
838 add_dependencies(${pvr_target} vk_swiftshader)
839 endforeach()
840
Nicolas Capens3702e012020-03-30 09:08:47 -0400841 foreach(pvr_target ${PVR_GLES_TARGET})
842 add_dependencies(${pvr_target} libGLESv2)
843 add_dependencies(${pvr_target} libEGL)
844 endforeach()
845
846 foreach(pvr_target ${PVR_VULKAN_TARGET_GOOD} ${PVR_GLES_TARGET_GOOD})
Nicolas Capens51b28002020-01-30 16:41:00 -0500847 set_target_properties(${pvr_target} PROPERTIES FOLDER Samples)
848 endforeach()
849
Nicolas Capens3702e012020-03-30 09:08:47 -0400850 foreach(pvr_target ${PVR_TARGET_OTHER} ${PVR_VULKAN_TARGET_OTHER} ${PVR_GLES_TARGET_OTHER})
Nicolas Capens51b28002020-01-30 16:41:00 -0500851 set_target_properties(${pvr_target} PROPERTIES FOLDER Samples/PowerVR-Build)
852 endforeach()
Corentin Wallezcb586622020-03-27 17:38:29 +0100853endif()
Nicolas Capensf324fe52020-06-05 16:10:07 -0400854
855if(SWIFTSHADER_BUILD_TESTS)
856 add_subdirectory(${TESTS_DIR}/ReactorUnitTests) # Add ReactorUnitTests target
857 add_subdirectory(${TESTS_DIR}/GLESUnitTests) # Add gles-unittests target
858 add_subdirectory(${TESTS_DIR}/MathUnitTests) # Add math-unittests target
859 add_subdirectory(${TESTS_DIR}/SystemUnitTests) # Add system-unittests target
860endif()
861
862if(SWIFTSHADER_BUILD_BENCHMARKS)
863 if (NOT TARGET benchmark::benchmark)
864 set(BENCHMARK_ENABLE_TESTING FALSE CACHE BOOL FALSE FORCE)
865 add_subdirectory(${THIRD_PARTY_DIR}/benchmark)
866 endif()
867
Nicolas Capensaca9fb22020-06-10 12:53:31 -0400868 if (NOT TARGET glslang)
869 add_subdirectory(${THIRD_PARTY_DIR}/glslang)
870 endif()
871
Nicolas Capensf324fe52020-06-05 16:10:07 -0400872 add_subdirectory(${TESTS_DIR}/ReactorBenchmarks) # Add ReactorBenchmarks target
873 add_subdirectory(${TESTS_DIR}/SystemBenchmarks) # Add system-benchmarks target
874 add_subdirectory(${TESTS_DIR}/VulkanBenchmarks) # Add VulkanBenchmarks target
875endif()
876
877if(SWIFTSHADER_BUILD_TESTS AND SWIFTSHADER_BUILD_VULKAN)
878 add_subdirectory(${TESTS_DIR}/VulkanUnitTests) # Add VulkanUnitTests target
879endif()