-
Notifications
You must be signed in to change notification settings - Fork 37
/
CMakeLists.txt
156 lines (131 loc) · 5.92 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
cmake_minimum_required (VERSION 3.1)
include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
# XXX required as long as we need to retrieve the VC4C compiler output path for the install precompiled headers command
cmake_policy(SET CMP0026 OLD)
####
# General configuration
####
# Option to enable/disable test-program
option(BUILD_TESTING "Build testing program" ON)
# Option to enable/disable cross compilation
option(CROSS_COMPILE "Cross compile for Raspbian" OFF)
# Option whether to include the SPIR-V Tools front-end
option(SPIRV_FRONTEND "Enables a second front-end for the SPIR-V intermediate language" OFF)
# Option whether to include the LLVM library front-end. This requires the LLVM development-headers to be available for the (SPIRV-)LLVM used
option(LLVMLIB_FRONTEND "Enables the front-end using the LLVM library to read LLVM modules" ON)
# Option whether to enable code coverage analysis via gcov
option(ENABLE_COVERAGE "Enables collection of code coverage via gcov" OFF)
# Option whether to enable use of the CLang library (EXPERIMENTAL)
option(CLANG_LIBRARY "Uses the libclang library for compilation, uses the clang executable otherwise" OFF)
# Option whether to enable more compile-time checks
option(ADVANCED_CHECKS "Enable advanced compile-time checks" OFF)
# Option to skipping pre-compiling the VC4CLStdLib standard-library headers at compile time. NOTE: The headers still need to be pre-compiled before execution!
option(VC4CL_STDLIB_PRECOMPILE "Enable pre-compiling of the VC4CLStdLib headers at compile time" ON)
# Path to the VC4CL standard library
# NOTE: Resolving ~ (for home directory) is currently not supported
if(NOT VC4CL_STDLIB_DIR)
find_file(VC4CL_STDLIB_FOUND "VC4CLStdLib/include/VC4CLStdLib.h")
if(VC4CL_STDLIB_FOUND)
get_filename_component(VC4CL_STDLIB_DIR ${VC4CL_STDLIB_FOUND} DIRECTORY)
message(STATUS "VC4CL standard library headers found: ${VC4CL_STDLIB_DIR}")
elseif(EXISTS "${CMAKE_SOURCE_DIR}/../VC4CLStdLib/include/VC4CLStdLib.h")
set(VC4CL_STDLIB_DIR "${CMAKE_SOURCE_DIR}/../VC4CLStdLib/include/")
message(STATUS "VC4CL standard library headers found: ${VC4CL_STDLIB_DIR}")
else()
message(WARNING "No development version of VC4CL standard-library headers found, will not automatically generate the precompiled files!")
endif()
endif()
if(CROSS_COMPILE)
include(cmake/crosscompile.cmake)
message(STATUS "Cross compiling for Raspbian with compiler: ${CMAKE_CXX_COMPILER}")
endif()
if(NOT BUILD_NUMBER)
set(BUILD_NUMBER 9999)
endif()
project (VC4C VERSION 0.4.${BUILD_NUMBER})
# Set C++ standard to C++14 without any extensions (e.g. GNU)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
# Set default build type to Debug
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE)
endif()
if(("${CMAKE_BUILD_TYPE}" STREQUAL "Release") OR ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo"))
# Only allow coverage for debug builds
set(ENABLE_COVERAGE OFF)
endif()
# Retain debug logs, exception stack trace and profiling results for RelWithDebInfo
# Also tell GCC that we change rounding modes and thus it should be careful with some optimizations
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -UNDEBUG -frounding-math")
# Set optimization and warning flags for the build types
include(cmake/flags.cmake)
# clang-tidy
find_program(CLANG_TIDY NAMES clang-tidy clang-tidy-5.0 clang-tidy-6.0 clang-tidy-7 clang-tidy-8 clang-tidy-9 clang-tidy-10)
if(ADVANCED_CHECKS AND CLANG_TIDY)
message(STATUS "Enabling clang-tidy compile time checks: ${CLANG_TIDY}")
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY}")
endif()
####
# Dependencies
####
if((CMAKE_MAJOR_VERSION VERSION_GREATER 3) OR ((CMAKE_MAJOR_VERSION VERSION_EQUAL 3) AND (CMAKE_MINOR_VERSION VERSION_GREATER_EQUAL 14)))
# CMake 3.14 introduces https://cmake.org/cmake/help/latest/module/FetchContent.html which allows us to run the configuration step
# of the downloaded dependencies at CMake configuration step and therefore, we have the proper targets available.
message(STATUS "Using CMake 3.14+ FetchContent to include dependencies...")
set(DEPENDENCIES_USE_FETCH_CONTENT ON)
else()
message(STATUS "Using CMake <3.14 ExternalProject to include dependencies...")
set(DEPENDENCIES_USE_FETCH_CONTENT OFF)
endif()
if(BUILD_OFFLINE)
# A result of != 0 is an error, so disable updating
set_property(DIRECTORY ${VC4C_SOURCE_DIR} PROPERTY EP_UPDATE_DISCONNECTED 1)
message(WARNING "Building in off-line mode, some dependencies might not be up-to-date!")
else()
set_property(DIRECTORY ${VC4C_SOURCE_DIR} PROPERTY EP_UPDATE_DISCONNECTED 0)
endif()
####
# Determine Clang version and configure front-ends
###
# Prefer Khronos OpenCL to LLVM IR (to SPIR-V) compiler, always include SPIR-V headers
include(cmake/spirv-headers.cmake)
include(cmake/spirv.cmake)
# Fall back to "standard" CLang
include(cmake/clang.cmake)
# If enabled, check whether the LLVM library front-end can be built
if(LLVMLIB_FRONTEND)
include(cmake/libllvm.cmake)
endif()
# Load this after the LLVM front-end, since it reuses some variables
if(CLANG_LIBRARY)
include(cmake/libclang.cmake)
endif()
if(NOT ((SPIRV_LLVM_SPIR_FOUND AND SPIRV_FRONTEND) OR (LLVMLIB_FRONTEND AND LLVM_LIBS_PATH)))
message(WARNING " Neither SPIR-V nor LLVM library front-end are configured!")
endif()
if(NOT SPIRV_CLANG_FOUND AND NOT CLANG_FOUND)
message(FATAL_ERROR "No supported OpenCL compiler found!")
endif()
include(cmake/cpplog.cmake)
# Variant backport for C++ < 17
include(cmake/variant.cmake)
####
# Additional configuration
####
include(cmake/sanitizers.cmake)
####
# Main files
####
#build all from ./src into ./build
add_definitions(-Dlogging=cpplog)
add_subdirectory(src)
add_subdirectory(tools)
if (BUILD_TESTING)
enable_testing()
include(cmake/cpptest-lite.cmake)
add_subdirectory(test)
endif (BUILD_TESTING)
include(cmake/packaging.cmake)