• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)
20
21if(DEFINED OHOS_SDK_NATIVE_TOOLCHAIN_DEFINED)
22  return()
23endif()
24set(OHOS_SDK_NATIVE_TOOLCHAIN_DEFINED true)
25
26# Set OHOS_SDK_NATIVE
27get_filename_component(OHOS_SDK_NATIVE "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
28file(TO_CMAKE_PATH "${OHOS_SDK_NATIVE}" OHOS_SDK_NATIVE)
29
30# Sdk native version
31file(STRINGS "${OHOS_SDK_NATIVE}/oh-uni-package.json" NATIVE_VER REGEX "\"version\":.*")
32string(REGEX REPLACE "\"version\":(.*)$" "\\1" SDK_NATIVE_VERSION "${NATIVE_VER}")
33string(STRIP "${SDK_NATIVE_VERSION}" SDK_NATIVE_VERSION)
34
35# Common default settings
36set(OHOS TRUE)
37set(CMAKE_SYSTEM_NAME OHOS)
38
39if(NOT DEFINED OHOS_PLATFORM_LEVEL)
40  set(OHOS_PLATFORM_LEVEL 1)
41endif()
42
43if(NOT DEFINED OHOS_TOOLCHAIN)
44  set(OHOS_TOOLCHAIN clang)
45endif()
46
47if(NOT DEFINED OHOS_STL)
48  set(OHOS_STL c++_shared)
49endif()
50
51if(NOT DEFINED OHOS_PIE)
52  set(OHOS_PIE TRUE)
53endif()
54
55if(NOT DEFINED OHOS_ARM_NEON)
56  set(OHOS_ARM_NEON thumb)
57endif()
58
59# set the ABI
60if(NOT DEFINED OHOS_ARCH)
61  set(OHOS_ARCH arm64-v8a)
62endif()
63
64# set the undefined symbols
65if(DEFINED OHOS_NO_UNDEFINED)
66  if(NOT DEFINED OHOS_ALLOW_UNDEFINED_SYMBOLS)
67    set(OHOS_ALLOW_UNDEFINED_SYMBOLS "${OHOS_NO_UNDEFINED}")
68  endif()
69endif()
70
71# set the ccache
72if(DEFINED SDK_NATIVE_CCACHE AND NOT DEFINED OHOS_CCACHE)
73  set(OHOS_CCACHE "${SDK_NATIVE_CCACHE}")
74endif()
75
76# set the sdk native platform
77include(${CMAKE_CURRENT_LIST_DIR}/sdk_native_platforms.cmake)
78if(NOT DEFINED OHOS_SDK_NATIVE_PLATFORM)
79  set(OHOS_SDK_NATIVE_PLATFORM "ohos-${SDK_NATIVE_MIN_PLATFORM_LEVEL}")
80endif()
81
82# set the sdk native platform level
83string(REPLACE "ohos-" "" OHOS_SDK_NATIVE_PLATFORM_LEVEL ${OHOS_SDK_NATIVE_PLATFORM})
84
85# set find executable programs on the host system path
86set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
87set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
88set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
89set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
90list(APPEND CMAKE_FIND_ROOT_PATH "${OHOS_SDK_NATIVE}")
91
92# set the arch abi
93set(CMAKE_OHOS_ARCH_ABI ${OHOS_ARCH})
94
95# set arch diff property ...
96if(OHOS_ARCH STREQUAL arm64-v8a)
97  set(OHOS_TOOLCHAIN_NAME aarch64-linux-ohos)
98  set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
99  set(CMAKE_SYSTEM_PROCESSOR aarch64)
100elseif(OHOS_ARCH STREQUAL armeabi-v7a)
101  set(OHOS_TOOLCHAIN_NAME arm-linux-ohos)
102  set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
103  set(CMAKE_SYSTEM_PROCESSOR arm)
104elseif(OHOS_ARCH STREQUAL x86_64)
105  set(OHOS_TOOLCHAIN_NAME x86_64-linux-ohos)
106  set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
107  set(CMAKE_SYSTEM_PROCESSOR x86_64)
108else()
109  message(FATAL_ERROR "unrecognized ${OHOS_ARCH}")
110endif()
111
112set(CMAKE_C_COMPILER_TARGET   ${OHOS_LLVM})
113set(CMAKE_CXX_COMPILER_TARGET ${OHOS_LLVM})
114set(CMAKE_ASM_COMPILER_TARGET ${OHOS_LLVM})
115
116# Export configurable variables for the try_compile() command.
117set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
118  OHOS_TOOLCHAIN
119  OHOS_ARCH
120  OHOS_PLATFORM)
121
122# Set the common c flags
123set(OHOS_C_COMPILER_FLAGS)
124list(APPEND OHOS_C_COMPILER_FLAGS
125  -fdata-sections
126  -ffunction-sections
127  -funwind-tables
128  -fstack-protector-strong
129  -no-canonical-prefixes
130  -fno-addrsig
131  -Wa,--noexecstack)
132if(OHOS_DISABLE_FORMAT_STRING_CHECKS)
133  list(APPEND OHOS_C_COMPILER_FLAGS -Wno-error=format-security)
134else()
135  list(APPEND OHOS_C_COMPILER_FLAGS -Wformat -Werror=format-security)
136endif()
137if (OHOS_ARCH STREQUAL armeabi-v7a)
138    list(APPEND OHOS_C_COMPILER_FLAGS -march=armv7a)
139endif()
140if (CMAKE_BUILD_TYPE STREQUAL normal)
141    list(APPEND OHOS_C_COMPILER_FLAGS -g)
142endif()
143if(OHOS_ENABLE_ASAN STREQUAL ON)
144    list(APPEND OHOS_C_COMPILER_FLAGS
145        -shared-libasan
146        -fsanitize=address
147        -fno-omit-frame-pointer
148        -fsanitize-recover=address)
149    if(DEFINED OHOS_ASAN_BLACKLIST)
150        list(APPEND OHOS_C_COMPILER_FLAGS -fsanitize-blacklist="${OHOS_ASAN_BLACKLIST}")
151    endif()
152endif()
153string(REPLACE ";" " " OHOS_C_COMPILER_FLAGS "${OHOS_C_COMPILER_FLAGS}")
154
155# set the common c++ flags
156set(OHOS_CXX_COMPILER_FLAGS)
157
158# set the common asm flags
159set(OHOS_ASM_COMPILER_FLAGS "${OHOS_C_COMPILER_FLAGS}")
160
161# set the debug variant flags
162set(OHOS_DEBUG_COMPILER_FLAGS)
163list(APPEND OHOS_DEBUG_COMPILER_FLAGS -O0 -g -fno-limit-debug-info)
164string(REPLACE ";" " " OHOS_DEBUG_COMPILER_FLAGS   "${OHOS_DEBUG_COMPILER_FLAGS}")
165
166# set the release variant flags
167set(OHOS_RELEASE_COMPILER_FLAGS)
168list(APPEND OHOS_RELEASE_COMPILER_FLAGS -O2)
169list(APPEND OHOS_RELEASE_COMPILER_FLAGS -DNDEBUG)
170string(REPLACE ";" " " OHOS_RELEASE_COMPILER_FLAGS "${OHOS_RELEASE_COMPILER_FLAGS}")
171
172# set the common link flags
173set(OHOS_COMMON_LINKER_FLAGS)
174list(APPEND OHOS_COMMON_LINKER_FLAGS --rtlib=compiler-rt)
175list(APPEND OHOS_COMMON_LINKER_FLAGS -fuse-ld=lld)
176
177if(OHOS_STL STREQUAL c++_static)
178  list(APPEND OHOS_COMMON_LINKER_FLAGS "-static-libstdc++")
179elseif(OHOS_STL STREQUAL none)
180  list(APPEND OHOS_CXX_COMPILER_FLAGS "-nostdinc++")
181  list(APPEND OHOS_COMMON_LINKER_FLAGS "-nostdlib++")
182elseif(OHOS_STL STREQUAL c++_shared)
183else()
184  message(FATAL_ERROR "Unsupported STL configuration: ${OHOS_STL}.")
185endif()
186
187list(APPEND OHOS_COMMON_LINKER_FLAGS
188  -Wl,--build-id=sha1
189  -Wl,--warn-shared-textrel
190  -Wl,--fatal-warnings
191  -lunwind)
192if(NOT OHOS_ALLOW_UNDEFINED_SYMBOLS)
193  list(APPEND OHOS_COMMON_LINKER_FLAGS -Wl,--no-undefined)
194endif()
195list(APPEND OHOS_COMMON_LINKER_FLAGS -Qunused-arguments -Wl,-z,noexecstack)
196string(REPLACE ";" " " OHOS_COMMON_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS}")
197
198# set the executable link flags
199set(OHOS_EXE_LINKER_FLAGS)
200list(APPEND OHOS_EXE_LINKER_FLAGS -Wl,--gc-sections)
201string(REPLACE ";" " " OHOS_EXE_LINKER_FLAGS "${OHOS_EXE_LINKER_FLAGS}")
202
203# set the other flags
204set(CMAKE_C_STANDARD_LIBRARIES_INIT "-lm")
205set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "-lm")
206set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
207
208# set the cmake global cflags
209set(CMAKE_C_FLAGS "" CACHE STRING "Flags for all build types.")
210set(CMAKE_C_FLAGS "${OHOS_C_COMPILER_FLAGS} ${CMAKE_C_FLAGS} -D__MUSL__")
211
212set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
213set(CMAKE_C_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
214
215set(CMAKE_C_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
216set(CMAKE_C_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_C_FLAGS_RELEASE}")
217
218# set the cmake global cppflags
219set(CMAKE_CXX_FLAGS "" CACHE STRING "Flags for all build types.")
220set(CMAKE_CXX_FLAGS "${OHOS_C_COMPILER_FLAGS} ${OHOS_CXX_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS} -D__MUSL__")
221
222set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
223set(CMAKE_CXX_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
224
225set(CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
226set(CMAKE_CXX_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
227
228# set the cmake global asmflags
229set(CMAKE_ASM_FLAGS "" CACHE STRING "Flags for all build types.")
230set(CMAKE_ASM_FLAGS "${OHOS_ASM_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS} -D__MUSL__")
231
232set(CMAKE_ASM_FLAGS_DEBUG "" CACHE STRING "Flags for debug variant builds.")
233set(CMAKE_ASM_FLAGS_DEBUG "${OHOS_DEBUG_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_DEBUG}")
234
235set(CMAKE_ASM_FLAGS_RELEASE "" CACHE STRING "Flags for release variant builds.")
236set(CMAKE_ASM_FLAGS_RELEASE "${OHOS_RELEASE_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_RELEASE}")
237
238# set the link flags
239set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create shared libraries.")
240set(CMAKE_SHARED_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
241
242set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create modules.")
243set(CMAKE_MODULE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
244
245set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create executables.")
246set(CMAKE_EXE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${OHOS_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
247
248# set the executable suffix
249set(HOST_SYSTEM_EXE_SUFFIX)
250if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
251  set(HOST_SYSTEM_EXE_SUFFIX .exe)
252endif()
253
254# set the toolchain config.
255set(TOOLCHAIN_ROOT_PATH "${OHOS_SDK_NATIVE}/llvm")
256set(TOOLCHAIN_BIN_PATH  "${OHOS_SDK_NATIVE}/llvm/bin")
257
258set(CMAKE_SYSROOT "${OHOS_SDK_NATIVE}/sysroot")
259set(CMAKE_LIBRARY_ARCHITECTURE "${OHOS_TOOLCHAIN_NAME}")
260list(APPEND CMAKE_SYSTEM_LIBRARY_PATH "/usr/lib/${OHOS_TOOLCHAIN_NAME}")
261set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN   "${TOOLCHAIN_ROOT_PATH}")
262set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${TOOLCHAIN_ROOT_PATH}")
263set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${TOOLCHAIN_ROOT_PATH}")
264set(CMAKE_C_COMPILER "${TOOLCHAIN_BIN_PATH}/clang${HOST_SYSTEM_EXE_SUFFIX}")
265set(CMAKE_CXX_COMPILER "${TOOLCHAIN_BIN_PATH}/clang++${HOST_SYSTEM_EXE_SUFFIX}")
266
267set(OHOS_AR "${TOOLCHAIN_BIN_PATH}/llvm-ar${HOST_SYSTEM_EXE_SUFFIX}")
268set(OHOS_RANLIB "${TOOLCHAIN_BIN_PATH}/llvm-ranlib${HOST_SYSTEM_EXE_SUFFIX}")
269set(CMAKE_AR                "${OHOS_AR}" CACHE FILEPATH "Archiver")
270set(CMAKE_RANLIB            "${OHOS_RANLIB}" CACHE FILEPATH "Ranlib")
271