xref: /build/ohos/ndk/cmake/ohos.toolchain.cmake (revision 5f9996aa)
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
178if(OHOS_ENABLE_UBSAN)
179	list(APPEND OHOS_C_COMPILER_FLAGS
180		-shared-libsan
181		-fsanitize=undefined
182    -fno-omit-frame-pointer)
183endif()
184
185string(REPLACE ";" " " OHOS_C_COMPILER_FLAGS "${OHOS_C_COMPILER_FLAGS}")
186
187# set the common c++ flags
188set(OHOS_CXX_COMPILER_FLAGS)
189
190# set the common asm flags
191set(OHOS_ASM_COMPILER_FLAGS "${OHOS_C_COMPILER_FLAGS}")
192
193# set the debug variant flags
194set(OHOS_DEBUG_COMPILER_FLAGS)
195list(APPEND OHOS_DEBUG_COMPILER_FLAGS -O0 -g -fno-limit-debug-info)
196string(REPLACE ";" " " OHOS_DEBUG_COMPILER_FLAGS   "${OHOS_DEBUG_COMPILER_FLAGS}")
197
198# set the release variant flags
199set(OHOS_RELEASE_COMPILER_FLAGS)
200list(APPEND OHOS_RELEASE_COMPILER_FLAGS -O2)
201list(APPEND OHOS_RELEASE_COMPILER_FLAGS -DNDEBUG)
202string(REPLACE ";" " " OHOS_RELEASE_COMPILER_FLAGS "${OHOS_RELEASE_COMPILER_FLAGS}")
203
204# set the common link flags
205set(OHOS_COMMON_LINKER_FLAGS)
206list(APPEND OHOS_COMMON_LINKER_FLAGS --rtlib=compiler-rt)
207list(APPEND OHOS_COMMON_LINKER_FLAGS -fuse-ld=lld)
208
209if(OHOS_STL STREQUAL c++_static)
210  list(APPEND OHOS_COMMON_LINKER_FLAGS "-static-libstdc++")
211elseif(OHOS_STL STREQUAL none)
212  list(APPEND OHOS_CXX_COMPILER_FLAGS "-nostdinc++")
213  list(APPEND OHOS_COMMON_LINKER_FLAGS "-nostdlib++")
214elseif(OHOS_STL STREQUAL c++_shared)
215else()
216  message(FATAL_ERROR "Unsupported STL configuration: ${OHOS_STL}.")
217endif()
218
219list(APPEND OHOS_COMMON_LINKER_FLAGS
220  -Wl,--build-id=sha1
221  -Wl,--warn-shared-textrel
222  -Wl,--fatal-warnings
223  -lunwind)
224if(NOT OHOS_ALLOW_UNDEFINED_SYMBOLS)
225  list(APPEND OHOS_COMMON_LINKER_FLAGS -Wl,--no-undefined)
226endif()
227list(APPEND OHOS_COMMON_LINKER_FLAGS -Qunused-arguments -Wl,-z,noexecstack)
228string(REPLACE ";" " " OHOS_COMMON_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS}")
229
230# set the executable link flags
231set(OHOS_EXE_LINKER_FLAGS)
232list(APPEND OHOS_EXE_LINKER_FLAGS -Wl,--gc-sections)
233string(REPLACE ";" " " OHOS_EXE_LINKER_FLAGS "${OHOS_EXE_LINKER_FLAGS}")
234
235# set the other flags
236set(CMAKE_C_STANDARD_LIBRARIES_INIT "-lm")
237set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "-lm")
238set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
239
240# set the cmake global cflags
241set(CMAKE_C_FLAGS "" CACHE STRING "Flags for all build types.")
242set(CMAKE_C_FLAGS "${OHOS_C_COMPILER_FLAGS} ${CMAKE_C_FLAGS} -D__MUSL__")
243
244set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
245set(CMAKE_C_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
246
247set(CMAKE_C_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
248set(CMAKE_C_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_C_FLAGS_RELEASE}")
249
250# set the cmake global cppflags
251set(CMAKE_CXX_FLAGS "" CACHE STRING "Flags for all build types.")
252set(CMAKE_CXX_FLAGS "${OHOS_C_COMPILER_FLAGS} ${OHOS_CXX_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS} -D__MUSL__")
253
254set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
255set(CMAKE_CXX_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
256
257set(CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
258set(CMAKE_CXX_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
259
260# set the cmake global asmflags
261set(CMAKE_ASM_FLAGS "" CACHE STRING "Flags for all build types.")
262set(CMAKE_ASM_FLAGS "${OHOS_ASM_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS} -D__MUSL__")
263
264set(CMAKE_ASM_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
265set(CMAKE_ASM_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_DEBUG}")
266
267set(CMAKE_ASM_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
268set(CMAKE_ASM_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_RELEASE}")
269
270# set the link flags
271set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create shared libraries.")
272set(CMAKE_SHARED_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
273
274set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create modules.")
275set(CMAKE_MODULE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
276
277set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create executables.")
278set(CMAKE_EXE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${OHOS_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
279
280# set the executable suffix
281set(HOST_SYSTEM_EXE_SUFFIX)
282if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
283  set(HOST_SYSTEM_EXE_SUFFIX .exe)
284endif()
285
286# set the toolchain config.
287set(TOOLCHAIN_ROOT_PATH "${OHOS_SDK_NATIVE}/llvm")
288set(TOOLCHAIN_BIN_PATH  "${OHOS_SDK_NATIVE}/llvm/bin")
289
290set(CMAKE_SYSROOT "${OHOS_SDK_NATIVE}/sysroot")
291set(CMAKE_LIBRARY_ARCHITECTURE "${OHOS_TOOLCHAIN_NAME}")
292list(APPEND CMAKE_SYSTEM_LIBRARY_PATH "/usr/lib/${OHOS_TOOLCHAIN_NAME}")
293set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN   "${TOOLCHAIN_ROOT_PATH}")
294set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${TOOLCHAIN_ROOT_PATH}")
295set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${TOOLCHAIN_ROOT_PATH}")
296set(CMAKE_C_COMPILER "${TOOLCHAIN_BIN_PATH}/clang${HOST_SYSTEM_EXE_SUFFIX}")
297set(CMAKE_CXX_COMPILER "${TOOLCHAIN_BIN_PATH}/clang++${HOST_SYSTEM_EXE_SUFFIX}")
298
299set(OHOS_AR "${TOOLCHAIN_BIN_PATH}/llvm-ar${HOST_SYSTEM_EXE_SUFFIX}")
300set(OHOS_RANLIB "${TOOLCHAIN_BIN_PATH}/llvm-ranlib${HOST_SYSTEM_EXE_SUFFIX}")
301set(CMAKE_AR                "${OHOS_AR}" CACHE FILEPATH "Archiver")
302set(CMAKE_RANLIB            "${OHOS_RANLIB}" CACHE FILEPATH "Ranlib")
303set(UNIX TRUE CACHE BOOL FROCE)
304