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