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