blob: d763bc6de5a26adf74a75c68f08ae80189bc25fb [file] [log] [blame]
Jakub Sujakdf5d9872023-05-22 17:38:56 +01001# Copyright (c) 2023 Arm Limited.
2#
3# SPDX-License-Identifier: MIT
4#
5# Permission is hereby granted, free of charge, to any person obtaining a copy
6# of this software and associated documentation files (the "Software"), to
7# deal in the Software without restriction, including without limitation the
8# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9# sell copies of the Software, and to permit persons to whom the Software is
10# furnished to do so, subject to the following conditions:
11#
12# The above copyright notice and this permission notice shall be included in all
13# copies or substantial portions of the Software.
14#
15# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21# SOFTWARE.
22
23cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
24
25#---------------------------------------------------------------------
26# Compute Kernel Writer Project
27
28project(ComputeKernelWriter
29 VERSION 1.0.0
30 LANGUAGES CXX
Jakub Sujak7a698a32023-06-21 09:45:41 +010031)
Jakub Sujakdf5d9872023-05-22 17:38:56 +010032
33set(CMAKE_CXX_STANDARD 14)
34set(CMAKE_CXX_STANDARD_REQUIRED ON)
Jakub Sujakdf5d9872023-05-22 17:38:56 +010035
36include(GNUInstallDirs)
37
38message(STATUS "${CMAKE_PROJECT_NAME} ${CMAKE_PROJECT_VERSION}")
Jakub Sujakdf5d9872023-05-22 17:38:56 +010039
40#---------------------------------------------------------------------
41# Options
42
Jakub Sujakdf5d9872023-05-22 17:38:56 +010043option(CKW_ENABLE_OPENCL "Enable OpenCL code generation" OFF)
44option(CKW_ENABLE_ASSERTS "Enable assertions. Always enabled in Debug builds" OFF)
45option(CKW_BUILD_TESTING "Build the Compute Kernel Writer validation test suite" OFF)
Jakub Sujake86f9922023-07-05 17:30:02 +010046option(CKW_BUILD_PROTOTYPE "Build the prototype implementation of kernel writer." OFF)
Jakub Sujak7a698a32023-06-21 09:45:41 +010047option(CKW_CCACHE "Use compiler cache for faster recompilation" OFF)
Jakub Sujakdf5d9872023-05-22 17:38:56 +010048
49#---------------------------------------------------------------------
50# Build configuration
51
52get_property(CKW_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
53
Jakub Sujakbec9b032023-06-09 14:13:30 +010054# Allow only Release or Debug builds
55if(NOT CKW_IS_MULTI_CONFIG) # Single-config generators
Jakub Sujakdf5d9872023-05-22 17:38:56 +010056 if(NOT CMAKE_BUILD_TYPE)
Jakub Sujakbec9b032023-06-09 14:13:30 +010057 set(CMAKE_BUILD_TYPE Release CACHE STRING "Options: Release (default) or Debug" FORCE)
Jakub Sujakdf5d9872023-05-22 17:38:56 +010058 endif()
Jakub Sujakbec9b032023-06-09 14:13:30 +010059else() # Multi-config generators
60 list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES RelWithDebInfo MinSizeRel)
Jakub Sujakdf5d9872023-05-22 17:38:56 +010061endif()
62
63# Simplistic CCache setup
64if(CKW_CCACHE)
65 find_program(CCACHE_FOUND ccache)
66 if(CCACHE_FOUND)
67 set(CMAKE_C_COMPILER_LAUNCHER ${CACHE_FOUND})
68 set(CMAKE_CXX_COMPILER_LAUNCHER ${CACHE_FOUND})
69 endif()
70endif()
71
72#---------------------------------------------------------------------
73# Library targets
74
Jakub Sujak7a698a32023-06-21 09:45:41 +010075set(CKW_CXX_FLAGS
76 -Wall
77 -Werror
78 -Wextra
79 -Wdisabled-optimization
80 -Wformat=2
81 -Winit-self
82 -Wstrict-overflow=2
83 -Wswitch-default
84 -Woverloaded-virtual
85 -Wformat-security
86 -Wctor-dtor-privacy
87 -Wsign-promo
88 -Weffc++
89 -pedantic
90)
91set(GNU_WARNINGS
92 -Wlogical-op
93 -Wstrict-null-sentinel
94)
95set(CKW_ASSERTS_OPTS
96 -fstack-protector-strong
97)
Jakub Sujakdf5d9872023-05-22 17:38:56 +010098
Jakub Sujak7a698a32023-06-21 09:45:41 +010099add_library(ckw)
100target_compile_options(ckw
101 PUBLIC
102 ${CKW_CXX_FLAGS}
103 "$<$<CXX_COMPILER_ID:GNU>:${GNU_WARNINGS}>"
104 "$<$<CONFIG:Debug>:${CKW_ASSERTS_OPTS}>"
105 "$<$<BOOL:${CKW_ASSERTS}>:${CKW_ASSERTS_OPTS}>"
106 # Set CMAKE_CXX_FLAGS last so user can overwrite options
107 ${CMAKE_CXX_FLAGS}
108 PRIVATE
Jakub Sujake86f9922023-07-05 17:30:02 +0100109 # Always optimize for binary size
Jakub Sujak7a698a32023-06-21 09:45:41 +0100110 $<$<CONFIG:Release>:-Os>
111)
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100112
Jakub Sujak7a698a32023-06-21 09:45:41 +0100113target_compile_definitions(ckw PUBLIC
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100114 $<$<CONFIG:Debug>:COMPUTE_KERNEL_WRITER_DEBUG_ENABLED>
115 $<$<CONFIG:Debug>:COMPUTE_KERNEL_WRITER_ASSERTS_ENABLED>
116 $<$<BOOL:${CKW_ASSERTS}>:COMPUTE_KERNEL_WRITER_ASSERTS_ENABLED>
117 $<$<BOOL:${CKW_ENABLE_OPENCL}>:COMPUTE_KERNEL_WRITER_OPENCL_ENABLED>
Jakub Sujak7a698a32023-06-21 09:45:41 +0100118)
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100119
120target_sources(ckw PRIVATE
121 src/Error.cpp
122 src/Helpers.cpp
123 src/TensorInfo.cpp
124 src/TensorUtils.cpp
125 src/TileInfo.cpp
Gunes Bayir2ae536a2023-07-05 11:39:37 +0100126 src/ITileOperand.cpp
Viet-Hoa Do3389f532023-07-05 17:36:40 +0100127 src/Kernel.cpp
128 src/KernelWriter.cpp
Viet-Hoa Dobd4f6b92023-05-30 09:34:32 +0100129)
130
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100131if(CKW_ENABLE_OPENCL)
132 target_sources(ckw PRIVATE
Gian Marco Iodice68e9c4d2023-06-15 17:40:28 +0100133 src/cl/CLConstantTile.cpp
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100134 src/cl/CLHelpers.cpp
135 src/cl/CLTile.cpp
Gian Marco Iodice68e9c4d2023-06-15 17:40:28 +0100136 src/cl/ICLTile.cpp
Viet-Hoa Do3389f532023-07-05 17:36:40 +0100137 src/cl/CLKernelWriter.cpp
Jakub Sujak7a698a32023-06-21 09:45:41 +0100138 )
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100139endif()
140
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100141target_include_directories(ckw
142 PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include
143 PRIVATE ${CMAKE_CURRENT_LIST_DIR}
Viet-Hoa Doce3c48c2023-07-03 13:44:43 +0100144)
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100145
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100146#---------------------------------------------------------------------
147# Validation tests
148
149if(CKW_BUILD_TESTING)
150 add_executable(ckw_validation
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100151 validation/Validation.cpp
Jakub Sujak7a698a32023-06-21 09:45:41 +0100152 )
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100153 if(CKW_ENABLE_OPENCL)
Jakub Sujak7a698a32023-06-21 09:45:41 +0100154 target_sources(ckw_validation PRIVATE
155 validation/tests/CLConstantTileTest.hpp
156 validation/tests/CLTileTest.hpp)
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100157 endif()
158
159 target_link_libraries(ckw_validation PRIVATE ckw)
160 target_include_directories(ckw_validation
161 PRIVATE ${CMAKE_CURRENT_LIST_DIR}
Jakub Sujak7a698a32023-06-21 09:45:41 +0100162 )
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100163endif()
164
165#---------------------------------------------------------------------
Viet-Hoa Doce3c48c2023-07-03 13:44:43 +0100166# Prototype
Jakub Sujak7a698a32023-06-21 09:45:41 +0100167
Viet-Hoa Doce3c48c2023-07-03 13:44:43 +0100168if(CKW_BUILD_PROTOTYPE)
169 add_subdirectory(prototype)
Viet-Hoa Dobd4f6b92023-05-30 09:34:32 +0100170endif()
171
172#---------------------------------------------------------------------
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100173# Installing
174
175install(TARGETS ckw
176 CONFIGURATIONS Release
177 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
178 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
179 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
Jakub Sujak7a698a32023-06-21 09:45:41 +0100180)
Jakub Sujakdf5d9872023-05-22 17:38:56 +0100181
182install(DIRECTORY include/ckw
183 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Jakub Sujak7a698a32023-06-21 09:45:41 +0100184)