1# Copyright (c) 2021 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6#     http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14# Description: The configuration of toolchain file supplied to cmake, which specifies
15#              locations for compilers and toolchain utilities, and other target
16#              platform and compiler related information.
17
18cmake_minimum_required(VERSION 3.6.0)
19set(CMAKE_SYSTEM_VERSION 1)
20set(CMAKE_ASM_COMPILER_VERSION 15.0.4)
21
22if(DEFINED OHOS_SDK_NATIVE_TOOLCHAIN_DEFINED)
23  return()
24endif()
25set(OHOS_SDK_NATIVE_TOOLCHAIN_DEFINED true)
26
27# Set OHOS_SDK_NATIVE
28get_filename_component(OHOS_SDK_NATIVE "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
29file(TO_CMAKE_PATH "${OHOS_SDK_NATIVE}" OHOS_SDK_NATIVE)
30
31# Sdk native version
32file(STRINGS "${OHOS_SDK_NATIVE}/oh-uni-package.json" NATIVE_VER REGEX "\"version\":.*")
33string(REGEX REPLACE "\"version\":(.*)$" "\\1" SDK_NATIVE_VERSION "${NATIVE_VER}")
34string(STRIP "${SDK_NATIVE_VERSION}" SDK_NATIVE_VERSION)
35
36# Common default settings
37set(OHOS OHOS)
38set(CMAKE_SYSTEM_NAME OHOS)
39
40if(NOT DEFINED OHOS_PLATFORM_LEVEL)
41  set(OHOS_PLATFORM_LEVEL 1)
42endif()
43
44if(NOT DEFINED OHOS_TOOLCHAIN)
45  set(OHOS_TOOLCHAIN clang)
46endif()
47
48if(NOT DEFINED OHOS_STL)
49  set(OHOS_STL c++_shared)
50endif()
51
52if(NOT DEFINED OHOS_PIE)
53  set(OHOS_PIE TRUE)
54endif()
55
56if(NOT DEFINED OHOS_ARM_NEON)
57  set(OHOS_ARM_NEON thumb)
58endif()
59
60# set the ABI
61if(NOT DEFINED OHOS_ARCH)
62  set(OHOS_ARCH arm64-v8a)
63endif()
64
65# set the undefined symbols
66if(DEFINED OHOS_NO_UNDEFINED)
67  if(NOT DEFINED OHOS_ALLOW_UNDEFINED_SYMBOLS)
68    set(OHOS_ALLOW_UNDEFINED_SYMBOLS "${OHOS_NO_UNDEFINED}")
69  endif()
70endif()
71
72# set the ccache
73if(DEFINED SDK_NATIVE_CCACHE AND NOT DEFINED OHOS_CCACHE)
74  set(OHOS_CCACHE "${SDK_NATIVE_CCACHE}")
75endif()
76
77# set the sdk native platform
78include(${CMAKE_CURRENT_LIST_DIR}/sdk_native_platforms.cmake)
79if(NOT DEFINED OHOS_SDK_NATIVE_PLATFORM)
80  set(OHOS_SDK_NATIVE_PLATFORM "ohos-${SDK_NATIVE_MIN_PLATFORM_LEVEL}")
81endif()
82
83# set the sdk native platform level
84string(REPLACE "ohos-" "" OHOS_SDK_NATIVE_PLATFORM_LEVEL ${OHOS_SDK_NATIVE_PLATFORM})
85
86# set find executable programs on the host system path
87set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
88set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
89set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
90set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
91list(APPEND CMAKE_FIND_ROOT_PATH "${OHOS_SDK_NATIVE}")
92
93# set the arch abi
94set(CMAKE_OHOS_ARCH_ABI ${OHOS_ARCH})
95
96# set arch diff property ...
97if(OHOS_ARCH STREQUAL arm64-v8a)
98  set(OHOS_TOOLCHAIN_NAME aarch64-linux-ohos)
99  set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
100  set(CMAKE_SYSTEM_PROCESSOR aarch64)
101elseif(OHOS_ARCH STREQUAL armeabi-v7a)
102  set(OHOS_TOOLCHAIN_NAME arm-linux-ohos)
103  set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
104  set(CMAKE_SYSTEM_PROCESSOR arm)
105elseif(OHOS_ARCH STREQUAL x86_64)
106  set(OHOS_TOOLCHAIN_NAME x86_64-linux-ohos)
107  set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
108  set(CMAKE_SYSTEM_PROCESSOR x86_64)
109else()
110  message(FATAL_ERROR "unrecognized ${OHOS_ARCH}")
111endif()
112
113set(CMAKE_C_COMPILER_TARGET   ${OHOS_LLVM})
114set(CMAKE_CXX_COMPILER_TARGET ${OHOS_LLVM})
115set(CMAKE_ASM_COMPILER_TARGET ${OHOS_LLVM})
116
117# Export configurable variables for the try_compile() command.
118set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
119  OHOS_SDK_NATIVE
120  OHOS_TOOLCHAIN
121  OHOS_ARCH
122  OHOS_PLATFORM)
123
124# Set the common c flags
125set(OHOS_C_COMPILER_FLAGS)
126list(APPEND OHOS_C_COMPILER_FLAGS
127  -fdata-sections
128  -ffunction-sections
129  -funwind-tables
130  -fstack-protector-strong
131  -no-canonical-prefixes
132  -fno-addrsig
133  -Wa,--noexecstack)
134if(OHOS_DISABLE_FORMAT_STRING_CHECKS)
135  list(APPEND OHOS_C_COMPILER_FLAGS -Wno-error=format-security)
136else()
137  list(APPEND OHOS_C_COMPILER_FLAGS -Wformat -Werror=format-security)
138endif()
139if (OHOS_ARCH STREQUAL armeabi-v7a)
140    list(APPEND OHOS_C_COMPILER_FLAGS -march=armv7a)
141endif()
142if (CMAKE_BUILD_TYPE STREQUAL normal)
143    list(APPEND OHOS_C_COMPILER_FLAGS -g)
144endif()
145if(OHOS_ENABLE_ASAN STREQUAL ON)
146	list(APPEND OHOS_C_COMPILER_FLAGS
147		-shared-libasan
148		-fsanitize=address
149		-fno-omit-frame-pointer
150		-fsanitize-recover=address)
151	if(DEFINED OHOS_ASAN_BLACKLIST)
152		list(APPEND OHOS_C_COMPILER_FLAGS -fsanitize-blacklist="${OHOS_ASAN_BLACKLIST}")
153	endif()
154endif()
155
156if (OHOS_ENABLE_HWASAN STREQUAL ON AND OHOS_ARCH STREQUAL arm64-v8a)
157    list(APPEND OHOS_C_COMPILER_FLAGS
158	    -shared-libasan
159	    -fsanitize=hwaddress
160	    -mllvm -hwasan-globals=0
161	    -fno-emulated-tls
162	    -fno-omit-frame-pointer)
163    if (DEFINED OHOS_ASAN_BLACKLIST)
164	    list(APPEND OHOS_C_COMPILER_FLAGS -fsanitize-blacklist="${OHOS_ASAN_BLACKLIST}")
165    endif()
166endif()
167
168if(OHOS_ENABLE_TSAN STREQUAL ON AND OHOS_ARCH STREQUAL arm64-v8a)
169	list(APPEND OHOS_C_COMPILER_FLAGS
170		-shared-libsan
171		-fsanitize=thread
172		-fno-omit-frame-pointer)
173	if(DEFINED OHOS_TSAN_BLACKLIST)
174		list(APPEND OHOS_C_COMPILER_FLAGS -fsanitize-blacklist="${OHOS_TSAN_BLACKLIST}")
175	endif()
176endif()
177
178string(REPLACE ";" " " OHOS_C_COMPILER_FLAGS "${OHOS_C_COMPILER_FLAGS}")
179
180# set the common c++ flags
181set(OHOS_CXX_COMPILER_FLAGS)
182
183# set the common asm flags
184set(OHOS_ASM_COMPILER_FLAGS "${OHOS_C_COMPILER_FLAGS}")
185
186# set the debug variant flags
187set(OHOS_DEBUG_COMPILER_FLAGS)
188list(APPEND OHOS_DEBUG_COMPILER_FLAGS -O0 -g -fno-limit-debug-info)
189string(REPLACE ";" " " OHOS_DEBUG_COMPILER_FLAGS   "${OHOS_DEBUG_COMPILER_FLAGS}")
190
191# set the release variant flags
192set(OHOS_RELEASE_COMPILER_FLAGS)
193list(APPEND OHOS_RELEASE_COMPILER_FLAGS -O2)
194list(APPEND OHOS_RELEASE_COMPILER_FLAGS -DNDEBUG)
195string(REPLACE ";" " " OHOS_RELEASE_COMPILER_FLAGS "${OHOS_RELEASE_COMPILER_FLAGS}")
196
197# set the common link flags
198set(OHOS_COMMON_LINKER_FLAGS)
199list(APPEND OHOS_COMMON_LINKER_FLAGS --rtlib=compiler-rt)
200list(APPEND OHOS_COMMON_LINKER_FLAGS -fuse-ld=lld)
201
202if(OHOS_STL STREQUAL c++_static)
203  list(APPEND OHOS_COMMON_LINKER_FLAGS "-static-libstdc++")
204elseif(OHOS_STL STREQUAL none)
205  list(APPEND OHOS_CXX_COMPILER_FLAGS "-nostdinc++")
206  list(APPEND OHOS_COMMON_LINKER_FLAGS "-nostdlib++")
207elseif(OHOS_STL STREQUAL c++_shared)
208else()
209  message(FATAL_ERROR "Unsupported STL configuration: ${OHOS_STL}.")
210endif()
211
212list(APPEND OHOS_COMMON_LINKER_FLAGS
213  -Wl,--build-id=sha1
214  -Wl,--warn-shared-textrel
215  -Wl,--fatal-warnings
216  -lunwind)
217if(NOT OHOS_ALLOW_UNDEFINED_SYMBOLS)
218  list(APPEND OHOS_COMMON_LINKER_FLAGS -Wl,--no-undefined)
219endif()
220list(APPEND OHOS_COMMON_LINKER_FLAGS -Qunused-arguments -Wl,-z,noexecstack)
221string(REPLACE ";" " " OHOS_COMMON_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS}")
222
223# set the executable link flags
224set(OHOS_EXE_LINKER_FLAGS)
225list(APPEND OHOS_EXE_LINKER_FLAGS -Wl,--gc-sections)
226string(REPLACE ";" " " OHOS_EXE_LINKER_FLAGS "${OHOS_EXE_LINKER_FLAGS}")
227
228# set the other flags
229set(CMAKE_C_STANDARD_LIBRARIES_INIT "-lm")
230set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "-lm")
231set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
232
233# set the cmake global cflags
234set(CMAKE_C_FLAGS "" CACHE STRING "Flags for all build types.")
235set(CMAKE_C_FLAGS "${OHOS_C_COMPILER_FLAGS} ${CMAKE_C_FLAGS} -D__MUSL__")
236
237set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
238set(CMAKE_C_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
239
240set(CMAKE_C_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
241set(CMAKE_C_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_C_FLAGS_RELEASE}")
242
243# set the cmake global cppflags
244set(CMAKE_CXX_FLAGS "" CACHE STRING "Flags for all build types.")
245set(CMAKE_CXX_FLAGS "${OHOS_C_COMPILER_FLAGS} ${OHOS_CXX_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS} -D__MUSL__")
246
247set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
248set(CMAKE_CXX_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
249
250set(CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
251set(CMAKE_CXX_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
252
253# set the cmake global asmflags
254set(CMAKE_ASM_FLAGS "" CACHE STRING "Flags for all build types.")
255set(CMAKE_ASM_FLAGS "${OHOS_ASM_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS} -D__MUSL__")
256
257set(CMAKE_ASM_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
258set(CMAKE_ASM_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_DEBUG}")
259
260set(CMAKE_ASM_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
261set(CMAKE_ASM_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_RELEASE}")
262
263# set the link flags
264set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create shared libraries.")
265set(CMAKE_SHARED_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
266
267set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create modules.")
268set(CMAKE_MODULE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
269
270set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create executables.")
271set(CMAKE_EXE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${OHOS_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
272
273# set the executable suffix
274set(HOST_SYSTEM_EXE_SUFFIX)
275if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
276  set(HOST_SYSTEM_EXE_SUFFIX .exe)
277endif()
278
279# set the toolchain config.
280set(TOOLCHAIN_ROOT_PATH "${OHOS_SDK_NATIVE}/llvm")
281set(TOOLCHAIN_BIN_PATH  "${OHOS_SDK_NATIVE}/llvm/bin")
282
283set(CMAKE_SYSROOT "${OHOS_SDK_NATIVE}/sysroot")
284set(CMAKE_LIBRARY_ARCHITECTURE "${OHOS_TOOLCHAIN_NAME}")
285list(APPEND CMAKE_SYSTEM_LIBRARY_PATH "/usr/lib/${OHOS_TOOLCHAIN_NAME}")
286set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN   "${TOOLCHAIN_ROOT_PATH}")
287set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${TOOLCHAIN_ROOT_PATH}")
288set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${TOOLCHAIN_ROOT_PATH}")
289set(CMAKE_C_COMPILER "${TOOLCHAIN_BIN_PATH}/clang${HOST_SYSTEM_EXE_SUFFIX}")
290set(CMAKE_CXX_COMPILER "${TOOLCHAIN_BIN_PATH}/clang++${HOST_SYSTEM_EXE_SUFFIX}")
291
292set(OHOS_AR "${TOOLCHAIN_BIN_PATH}/llvm-ar${HOST_SYSTEM_EXE_SUFFIX}")
293set(OHOS_RANLIB "${TOOLCHAIN_BIN_PATH}/llvm-ranlib${HOST_SYSTEM_EXE_SUFFIX}")
294set(CMAKE_AR                "${OHOS_AR}" CACHE FILEPATH "Archiver")
295set(CMAKE_RANLIB            "${OHOS_RANLIB}" CACHE FILEPATH "Ranlib")
296set(UNIX TRUE CACHE BOOL FROCE)
297