1# Copyright (c) 2021-2024 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 14function(panda_set_flag flag) 15 set(${flag} 1 PARENT_SCOPE) 16 add_definitions("-D${flag}") 17endfunction() 18 19# For each CMake variable name, add a corresponding preprocessor definition 20# if variable evaluates to True. 21function(panda_promote_to_definitions) 22 foreach(var_name ${ARGV}) 23 if(${var_name}) 24 add_definitions("-D${var_name}") 25 endif() 26 endforeach() 27endfunction() 28 29set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) 30 31if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 32 panda_set_flag(PANDA_TARGET_LINUX) 33 panda_set_flag(PANDA_TARGET_UNIX) 34 if (NOT PANDA_ENABLE_ADDRESS_SANITIZER) 35 panda_set_flag(PANDA_USE_FUTEX) 36 endif() 37elseif(CMAKE_SYSTEM_NAME STREQUAL "OHOS") 38 panda_set_flag(PANDA_TARGET_OHOS) 39 panda_set_flag(PANDA_TARGET_UNIX) 40elseif(CMAKE_SYSTEM_NAME STREQUAL "Android") 41 panda_set_flag(PANDA_TARGET_MOBILE) 42 panda_set_flag(PANDA_TARGET_UNIX) 43 if (NOT PANDA_ENABLE_ADDRESS_SANITIZER) 44 panda_set_flag(PANDA_USE_FUTEX) 45 endif() 46elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") 47 panda_set_flag(PANDA_TARGET_WINDOWS) 48elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") 49 panda_set_flag(PANDA_TARGET_MACOS) 50 panda_set_flag(PANDA_TARGET_UNIX) 51else() 52 message(FATAL_ERROR "Platform ${CMAKE_SYSTEM_NAME} is not supported") 53endif() 54 55if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") 56 if(NOT PANDA_CROSS_AMD64_X86) 57 panda_set_flag(PANDA_TARGET_AMD64) 58 else() 59 panda_set_flag(PANDA_TARGET_X86) 60 endif() 61elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i[356]86") 62 panda_set_flag(PANDA_TARGET_X86) 63elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") 64 panda_set_flag(PANDA_TARGET_ARM64) 65elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm") 66 panda_set_flag(PANDA_TARGET_ARM32) 67 panda_promote_to_definitions( 68 PANDA_TARGET_ARM32_ABI_SOFT 69 PANDA_TARGET_ARM32_ABI_SOFTFP 70 PANDA_TARGET_ARM32_ABI_HARD 71 ) 72 if((PANDA_TARGET_ARM32_ABI_SOFT AND (PANDA_TARGET_ARM32_ABI_SOFTFP OR PANDA_TARGET_ARM32_ABI_HARD)) OR 73 (PANDA_TARGET_ARM32_ABI_SOFTFP AND (PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_HARD)) OR 74 (PANDA_TARGET_ARM32_ABI_HARD AND (PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP))) 75 message(FATAL_ERROR "Only one PANDA_TARGET_ARM32_ABI_* should be set. 76 PANDA_TARGET_ARM32_ABI_SOFT = ${PANDA_TARGET_ARM32_ABI_SOFT} 77 PANDA_TARGET_ARM32_ABI_SOFTFP = ${PANDA_TARGET_ARM32_ABI_SOFTFP} 78 PANDA_TARGET_ARM32_ABI_HARD = ${PANDA_TARGET_ARM32_ABI_HARD}") 79 elseif(NOT (PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP OR PANDA_TARGET_ARM32_ABI_HARD)) 80 message(FATAL_ERROR "PANDA_TARGET_ARM32_ABI_* is not set") 81 endif() 82else() 83 message(FATAL_ERROR "Processor ${CMAKE_SYSTEM_PROCESSOR} is not supported") 84endif() 85 86if(PANDA_TARGET_AMD64 OR PANDA_TARGET_ARM64) 87 panda_set_flag(PANDA_TARGET_64) 88elseif(PANDA_TARGET_X86 OR PANDA_TARGET_ARM32) 89 panda_set_flag(PANDA_TARGET_32) 90else() 91 message(FATAL_ERROR "Unknown bitness of the target platform") 92endif() 93 94if (PANDA_TRACK_INTERNAL_ALLOCATIONS) 95 message(STATUS "Track internal allocations") 96 add_definitions(-DTRACK_INTERNAL_ALLOCATIONS=${PANDA_TRACK_INTERNAL_ALLOCATIONS}) 97endif() 98 99if (PANDA_TARGET_ARM64 AND NOT PANDA_CI_TESTING_MODE STREQUAL "Nightly") 100 if (PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER) 101 panda_set_flag(PANDA_ARM64_TESTS_WITH_SANITIZER) 102 endif() 103endif() 104 105 106# Enable global register variables usage only for clang >= 9.0.0 and gcc >= 8.0.0. 107# Clang 8.0.0 doesn't support all necessary options -ffixed-<reg>. Gcc 7.5.0 freezes 108# when compiling release interpreter. 109# 110# Also calling conventions of functions that use global register variables are different: 111# clang stores and restores registers that are used for global variables in the prolog 112# and epilog of such functions and gcc doesn't do it. So it's necessary to inline all 113# function that refers to global register variables to interpreter loop. 114 115# For this reason we disable global register variables usage for clang debug builds as 116# ALWAYS_INLINE macro expands to nothing in this mode and we cannot guarantee that all 117# necessary function will be inlined. 118# 119if(PANDA_TARGET_ARM64 AND ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" 120 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0.0 121 AND CMAKE_BUILD_TYPE MATCHES Release) 122 OR 123 (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" 124 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0.0))) 125 panda_set_flag(PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES) 126endif() 127 128if(CMAKE_BUILD_TYPE MATCHES Debug) 129 # Additional debug information about fp in each frame 130 add_compile_options(-fno-omit-frame-pointer) 131endif() 132 133# for correct work with gdb-9 134# See https://discourse.llvm.org/t/gdb-10-1-cant-read-clangs-dwarf-v5/6035 135if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14) 136 if ("${CMAKE_BUILD_TYPE}" MATCHES "^(RelWithDebInfo|FastVerify|Debug|DebugDetailed)$") 137 add_compile_options(-gdwarf-4) 138 endif() 139endif() 140 141# Enable LTO only for Android aarch64 due to bug for Android armv7: 142# https://github.com/android/ndk/issues/721 143if (PANDA_TARGET_MOBILE AND PANDA_TARGET_ARM64) 144 set(PANDA_ENABLE_LTO true) 145 set(PANDA_LLVM_REGALLOC pbqp) 146endif() 147 148if (PANDA_PGO_INSTRUMENT OR PANDA_PGO_OPTIMIZE) 149 if (NOT PANDA_TARGET_MOBILE OR NOT PANDA_TARGET_ARM64) 150 message(FATAL_ERROR "PGO supported only for Android aarch64") 151 endif() 152 153 set(PANDA_ENABLE_LTO true) 154endif() 155 156# TODO(v.cherkashi): Remove PANDA_TARGET_MOBILE_WITH_MANAGED_LIBS when the managed libs are separated form the Panda 157if(PANDA_TARGET_MOBILE_WITH_MANAGED_LIBS) 158 add_definitions(-DPANDA_TARGET_MOBILE_WITH_MANAGED_LIBS=1) 159 if(PANDA_TARGET_MOBILE) 160 panda_set_flag(PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS) 161 endif() 162else() 163 add_definitions(-DPANDA_TARGET_MOBILE_WITH_MANAGED_LIBS=0) 164endif() 165 166if(PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS) 167 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-statement-expression") 168 if(MOBILE_NATIVE_LIBS_SOURCE_PATH) 169 include_directories(${MOBILE_NATIVE_LIBS_SOURCE_PATH}/libc) 170 else() 171 message(FATAL_ERROR "MOBILE_NATIVE_LIBS_SOURCE_PATH is not set") 172 endif() 173endif() 174 175if(PANDA_TARGET_64) 176 panda_set_flag(PANDA_USE_32_BIT_POINTER) 177endif() 178 179if(PANDA_TARGET_LINUX) 180 execute_process(COMMAND grep PRETTY_NAME= /etc/os-release 181 OUTPUT_VARIABLE PANDA_TARGET_LINUX_DISTRO 182 OUTPUT_STRIP_TRAILING_WHITESPACE 183 ) 184 if(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu") 185 panda_set_flag(PANDA_TARGET_LINUX_UBUNTU) 186 endif() 187 188 if(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu 18\\.04") 189 panda_set_flag(PANDA_TARGET_LINUX_UBUNTU_18_04) 190 elseif(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu 20\\.04") 191 panda_set_flag(PANDA_TARGET_LINUX_UBUNTU_20_04) 192 elseif(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu 22\\.04") 193 panda_set_flag(PANDA_TARGET_LINUX_UBUNTU_22_04) 194 endif() 195 execute_process(COMMAND uname -a 196 OUTPUT_VARIABLE PANDA_TARGET_WSL_DISTRO 197 OUTPUT_STRIP_TRAILING_WHITESPACE 198 ) 199 if(PANDA_TARGET_WSL_DISTRO MATCHES "Microsoft") 200 panda_set_flag(PANDA_TARGET_WSL) 201 endif() 202 if(PANDA_TARGET_WSL_DISTRO MATCHES "WSL") 203 panda_set_flag(PANDA_TARGET_GENERAL_WSL) 204 endif() 205endif() 206 207set(PANDA_WITH_RUNTIME true) 208set(PANDA_WITH_COMPILER true) 209set(PANDA_WITH_TOOLCHAIN true) 210if (NOT DEFINED PANDA_WITH_BENCHMARKS) 211 set(PANDA_WITH_BENCHMARKS true) 212endif() 213set(PANDA_DEFAULT_LIB_TYPE "SHARED") 214 215option(PANDA_WITH_TESTS "Enable test targets" true) 216option(PANDA_WITH_BYTECODE_OPTIMIZER "Enable bytecode optimizer" true) 217option(PANDA_COMPILER_DEBUG_INFO "Support DWARF debug information in Compiler (JIT/AOT/IRtoC)" OFF) 218option(PANDA_ENABLE_RELAYOUT_PROFILE "Enable relayout profile" OFF) 219option(PANDA_ENABLE_CCACHE "Enable ccache" true) 220if (NOT DEFINED ES2PANDA_PATH) 221 set(ES2PANDA_PATH ${PANDA_ROOT}/tools/es2panda) 222endif() 223 224if(PANDA_TARGET_WINDOWS) 225 set(PANDA_WITH_BENCHMARKS false) 226 set(PANDA_DEFAULT_LIB_TYPE "STATIC") 227 # introduced for GetDynamicTimeZoneInformation 228 add_definitions(-D_WIN32_WINNT=0x600) 229endif() 230 231if(PANDA_TARGET_MACOS) 232 set(PANDA_DEFAULT_LIB_TYPE "STATIC") 233 #introduced for "std::filesystem::create_directories" 234 add_compile_options(-mmacosx-version-min=10.15) 235endif() 236 237if(PANDA_TARGET_OHOS) 238 set(PANDA_WITH_BENCHMARKS false) 239 add_definitions(-D__MUSL__) 240 241 if(PANDA_TARGET_ARM64) 242 # WORKAROUND: 243 # Disable '-Wunused-command-line-argument' error to avoid compilation error: 244 # clang++: error: argument unused during compilation: '--gcc-toolchain=<path/to/toolchain>/llvm' [-Werror,-Wunused-command-line-argument] 245 add_compile_options(-Wno-unused-command-line-argument) 246 247 # -Wno-deprecated-declarations needs for third_parties and ecmascript plugin 248 add_compile_options(-Wno-deprecated-declarations) 249 endif() 250endif() 251 252if(CMAKE_BUILD_TYPE STREQUAL Debug) 253 add_definitions(-DPANDA_ENABLE_SLOW_DEBUG) 254 add_definitions(-D_GLIBCXX_ASSERTIONS) 255endif() 256 257if(CMAKE_BUILD_TYPE STREQUAL FastVerify) 258 add_definitions(-DPANDA_FAST_VERIFY) 259 add_definitions(-D_GLIBCXX_ASSERTIONS) 260endif() 261 262# The define is set for the build which will be delivered to customers. 263# Currently this build doesn't contain dependencies to debug libraries 264# (like libdwarf.so) 265option(PANDA_PRODUCT_BUILD "Build which will be delivered to customers" false) 266 267if(PANDA_PRODUCT_BUILD AND NOT (CMAKE_BUILD_TYPE STREQUAL "Release")) 268 message(FATAL_ERROR "PANDA_PRODUCT_BUILD must be run with the Release build type only!") 269endif() 270 271if(NOT PANDA_PRODUCT_BUILD AND PANDA_WITH_HIDDEN_SYMBOLS) 272 message(FATAL_ERROR "PANDA_WITH_HIDDEN_SYMBOLS must be run with PANDA_PRODUCT_BUILD only!") 273endif() 274 275option(PANDA_WITH_HIDDEN_SYMBOLS "Build with -fvisibility=hidden options for some libraries" ${PANDA_PRODUCT_BUILD}) 276 277if (("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR 278 "${CMAKE_BUILD_TYPE}" STREQUAL "DebugDetailed" OR 279 "${CMAKE_BUILD_TYPE}" STREQUAL "FastVerify" OR 280 "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") AND 281 (NOT PANDA_TARGET_WINDOWS) AND 282 (NOT PANDA_ENABLE_ADDRESS_SANITIZER) AND 283 (NOT PANDA_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER) AND 284 (NOT PANDA_ENABLE_THREAD_SANITIZER)) 285 # Windows do not have elf and dwarf libraries 286 # Sanitizers do not work properly with gdb 287 set(PANDA_COMPILER_DEBUG_INFO ON) 288endif() 289 290# libdwarf-dev lib (version: 20180129-1) in Ubuntu 18.04 has memory leaks 291# TODO(asidorov): delete the workaround when the problem is fixed 292if (PANDA_ENABLE_ADDRESS_SANITIZER AND PANDA_TARGET_LINUX_UBUNTU_18_04) 293 set(PANDA_COMPILER_DEBUG_INFO OFF) 294endif() 295 296# TODO: Ensure libdwarf is available when building with OHOS toolchain 297if (PANDA_TARGET_OHOS) 298 set(PANDA_COMPILER_DEBUG_INFO OFF) 299endif() 300 301if (PANDA_PRODUCT_BUILD) 302 set(PANDA_COMPILER_DEBUG_INFO OFF) 303endif() 304 305if ((NOT DEFINED PANDA_MINIMAL_VIXL) AND PANDA_PRODUCT_BUILD) 306 # VIXL aarch64 with Encoder only (with no Decoder or Simulator provided) 307 set(PANDA_MINIMAL_VIXL true) 308endif() 309 310panda_promote_to_definitions( 311 PANDA_PRODUCT_BUILD 312 PANDA_WITH_HIDDEN_SYMBOLS 313 PANDA_WITH_COMPILER 314 PANDA_WITH_BYTECODE_OPTIMIZER 315 PANDA_COMPILER_DEBUG_INFO 316 PANDA_MINIMAL_VIXL 317 INTRUSIVE_TESTING 318) 319 320option(PANDA_CROSS_COMPILER "Enable compiler cross-compilation support" ON) 321option(PANDA_COMPILER_TARGET_X86 "Build x86-backend") 322option(PANDA_COMPILER_TARGET_X86_64 "Build x86_64-backend" ON) 323option(PANDA_COMPILER_TARGET_AARCH32 "Build aarch32-backend" ON) 324option(PANDA_COMPILER_TARGET_AARCH64 "Build aarch64-backend" ON) 325# User-specified cross-toolchains: 326option(PANDA_CROSS_X86_64_TOOLCHAIN_FILE "Absolute path to X86_64 target toolchain" OFF) 327option(PANDA_CROSS_AARCH64_TOOLCHAIN_FILE "Absolute path to AARCH64 target toolchain" OFF) 328option(PANDA_CROSS_AARCH32_TOOLCHAIN_FILE "Absolute path to AARCH32 target toolchain" OFF) 329 330# true if current target supports JIT/AOT native compilation 331# TODO (asidorov, runtime): replace all uses of this option by PANDA_WITH_COMPILER 332set(PANDA_COMPILER_ENABLE TRUE) 333 334if (PANDA_TARGET_AMD64) 335 if (PANDA_CROSS_COMPILER) 336 if (HOST_TOOLS) 337 # For host-tools build support only single-target backend (with the same toolchain): 338 message(STATUS "set ${PANDA_HOST_TOOLS_TARGET_ARCH}") 339 set(PANDA_COMPILER_TARGET_${PANDA_HOST_TOOLS_TARGET_ARCH} ON) 340 else() 341 set(PANDA_COMPILER_TARGET_X86_64 ON) 342 # If `PANDA_CROSS_${arch}_TOOLCHAIN_FILE` wasn't specified, gcc-toolchain is used: 343 find_program(GCC_AARCH64_CXX "aarch64-linux-gnu-g++") 344 find_program(GCC_ARM_CXX "arm-linux-gnueabi-g++") 345 346 # The option is ON by default; this 'if' allows to check if the target wasn't turned off explicitly: 347 if (PANDA_COMPILER_TARGET_AARCH64) 348 if (PANDA_CROSS_AARCH64_TOOLCHAIN_FILE) 349 message(STATUS "Specified AARCH64 toolchain: ${PANDA_CROSS_AARCH64_TOOLCHAIN_FILE}") 350 elseif (GCC_AARCH64_CXX) 351 message(STATUS "Detected default AARCH64 toolchain") 352 else() 353 set(PANDA_COMPILER_TARGET_AARCH64 OFF) 354 message(STATUS "No AARCH64 toolchain found") 355 endif() 356 endif() 357 358 # The option is ON by default; this 'if' allows to check if the target wasn't turned off explicitly: 359 if (PANDA_COMPILER_TARGET_AARCH32) 360 if (PANDA_CROSS_AARCH32_TOOLCHAIN_FILE) 361 message(STATUS "Specified AARCH32 toolchain: ${PANDA_CROSS_AARCH32_TOOLCHAIN_FILE}") 362 elseif (GCC_ARM_CXX) 363 message(STATUS "Detected default AARCH32 toolchain") 364 else() 365 set(PANDA_COMPILER_TARGET_AARCH32 OFF) 366 message(STATUS "No AARCH32 toolchain found") 367 endif() 368 endif() 369 # TODO(dkofanov): cross-values do not support x86 370 set(PANDA_COMPILER_TARGET_X86 OFF) 371 endif() 372 else() 373 set(PANDA_COMPILER_TARGET_X86 OFF) 374 set(PANDA_COMPILER_TARGET_X86_64 ON) 375 set(PANDA_COMPILER_TARGET_AARCH32 OFF) 376 set(PANDA_COMPILER_TARGET_AARCH64 OFF) 377 endif() 378endif() 379 380if (PANDA_TARGET_X86) 381 set(PANDA_COMPILER_TARGET_X86 ON) 382 set(PANDA_COMPILER_TARGET_X86_64 OFF) 383 set(PANDA_COMPILER_TARGET_AARCH32 OFF) 384 set(PANDA_COMPILER_TARGET_AARCH64 OFF) 385endif() 386 387if (PANDA_TARGET_ARM32) 388 if(PANDA_TARGET_ARM32_ABI_SOFT) 389 set(PANDA_COMPILER_ENABLE FALSE) 390 set(PANDA_COMPILER_TARGET_X86 OFF) 391 set(PANDA_COMPILER_TARGET_X86_64 OFF) 392 set(PANDA_COMPILER_TARGET_AARCH32 OFF) 393 set(PANDA_COMPILER_TARGET_AARCH64 OFF) 394 else() 395 set(PANDA_COMPILER_TARGET_X86 OFF) 396 set(PANDA_COMPILER_TARGET_X86_64 OFF) 397 set(PANDA_COMPILER_TARGET_AARCH32 ON) 398 set(PANDA_COMPILER_TARGET_AARCH64 OFF) 399 endif() 400endif() 401 402if (PANDA_TARGET_ARM64) 403 set(PANDA_COMPILER_TARGET_X86 OFF) 404 set(PANDA_COMPILER_TARGET_X86_64 OFF) 405 set(PANDA_COMPILER_TARGET_AARCH32 OFF) 406 set(PANDA_COMPILER_TARGET_AARCH64 ON) 407endif() 408 409if ((NOT PANDA_TARGET_WINDOWS) AND (NOT PANDA_ENABLE_ADDRESS_SANITIZER) AND (NOT PANDA_ENABLE_THREAD_SANITIZER)) 410 panda_set_flag(PANDA_USE_CUSTOM_SIGNAL_STACK) 411endif() 412 413option(PANDA_LLVM_BACKEND "Enable LLVM backend for Ark compiler" OFF) 414 415if (NOT PANDA_LLVM_BACKEND) 416 if (PANDA_LLVM_INTERPRETER) 417 message(FATAL_ERROR "PANDA_LLVM_INTERPRETER can't be enabled without PANDA_LLVM_BACKEND") 418 endif() 419 420 if (PANDA_LLVM_FASTPATH) 421 message(FATAL_ERROR "PANDA_LLVM_FASTPATH can't be enabled without PANDA_LLVM_BACKEND") 422 endif() 423 424 if (PANDA_LLVM_AOT) 425 message(FATAL_ERROR "PANDA_LLVM_AOT can't be enabled without PANDA_LLVM_BACKEND") 426 endif() 427endif() 428 429if (NOT (PANDA_TARGET_AMD64 OR PANDA_TARGET_ARM64)) 430 set(PANDA_LLVM_BACKEND OFF) 431endif() 432 433if (PANDA_LLVM_BACKEND) 434 # PANDA_LLVM_BACKEND auto-enables LLVM_INTERPRETER, LLVM_AOT and LLVM_FASTPATH unless user 435 # disabled some of them explicitly. Example: 436 # -DPANDA_LLVM_BACKEND=ON -DPANDA_LLVM_FASTPATH=OFF => FASTPATH is OFF, INTERPRETER and AOT are ON 437 if (NOT DEFINED PANDA_LLVM_INTERPRETER) 438 set(PANDA_LLVM_INTERPRETER ON) 439 endif() 440 if (PANDA_TARGET_AMD64 AND NOT CMAKE_CROSSCOMPILING AND NOT HOST_TOOLS) 441 # LLVM_FASTPATH is not supported for x86_64 target build 442 if (NOT DEFINED PANDA_LLVM_FASTPATH) 443 set(PANDA_LLVM_FASTPATH OFF) 444 elseif(PANDA_LLVM_FASTPATH) 445 message(FATAL_ERROR "PANDA_LLVM_FASTPATH is not supported for x86_64") 446 endif() 447 else() # otherwise, it is processed similar to INTERPRETER above and AOT below 448 if (NOT DEFINED PANDA_LLVM_FASTPATH) 449 set(PANDA_LLVM_FASTPATH ON) 450 endif() 451 endif() 452 if (NOT DEFINED PANDA_LLVM_AOT) 453 set(PANDA_LLVM_AOT ON) 454 endif() 455 456 # LLVM_IRTOC is an internal flag telling if Irtoc compilation is necessary: 457 # al least one of LLVM_FASTPATH or LLVM_INTERPRETER should be on 458 if (PANDA_LLVM_FASTPATH OR PANDA_LLVM_INTERPRETER) 459 panda_set_flag(PANDA_LLVM_IRTOC) 460 endif() 461 462 # PANDA_BUILD_LLVM_BACKEND is an internal flag telling if it is necessary to compile backend 463 # in this particular circumstances. 464 # LLVM_AOT means we need the backend. LLVM_AOT is always disabled in host_tools part. 465 # LLVM_IRTOC means we need the backend unless we are in cross compilation. 466 # For cross compilation case Irtoc would be processed in host_tools part. 467 # For host_tools BUILD_LLVM_BACKEND is effectively equal to LLVM_IRTOC. 468 if (PANDA_LLVM_AOT OR (PANDA_LLVM_IRTOC AND NOT CMAKE_CROSSCOMPILING)) 469 panda_set_flag(PANDA_BUILD_LLVM_BACKEND) 470 endif() 471endif() 472 473panda_promote_to_definitions( 474 PANDA_COMPILER_TARGET_X86 475 PANDA_COMPILER_TARGET_X86_64 476 PANDA_COMPILER_TARGET_AARCH32 477 PANDA_COMPILER_TARGET_AARCH64 478 PANDA_COMPILER_ENABLE 479 PANDA_QEMU_BUILD 480 PANDA_LLVM_BACKEND 481 PANDA_LLVM_FASTPATH 482 PANDA_LLVM_INTERPRETER 483 PANDA_LLVM_AOT 484) 485 486if (PANDA_USE_PREBUILT_TARGETS) 487 set(CMAKE_NO_SYSTEM_FROM_IMPORTED ON) 488endif() 489 490if (PANDA_ETS_INTEROP_JS) 491 panda_set_flag(PANDA_ETS_INTEROP_JS) 492endif() 493 494message(STATUS "PANDA_TARGET_MOBILE_WITH_MANAGED_LIBS = ${PANDA_TARGET_MOBILE_WITH_MANAGED_LIBS}") 495message(STATUS "PANDA_TARGET_UNIX = ${PANDA_TARGET_UNIX}") 496message(STATUS "PANDA_TARGET_LINUX = ${PANDA_TARGET_LINUX}") 497message(STATUS "PANDA_TARGET_MOBILE = ${PANDA_TARGET_MOBILE}") 498message(STATUS "PANDA_USE_FUTEX = ${PANDA_USE_FUTEX}") 499message(STATUS "PANDA_TARGET_WINDOWS = ${PANDA_TARGET_WINDOWS}") 500message(STATUS "PANDA_TARGET_OHOS = ${PANDA_TARGET_OHOS}") 501message(STATUS "PANDA_TARGET_MACOS = ${PANDA_TARGET_MACOS}") 502message(STATUS "PANDA_CROSS_COMPILER = ${PANDA_CROSS_COMPILER}") 503message(STATUS "PANDA_CROSS_AMD64_X86 = ${PANDA_CROSS_AMD64_X86}") 504message(STATUS "PANDA_TARGET_AMD64 = ${PANDA_TARGET_AMD64}") 505message(STATUS "PANDA_TARGET_X86 = ${PANDA_TARGET_X86}") 506message(STATUS "PANDA_TARGET_ARM64 = ${PANDA_TARGET_ARM64}") 507message(STATUS "PANDA_TARGET_ARM32 = ${PANDA_TARGET_ARM32}") 508if(PANDA_TARGET_ARM32) 509message(STATUS "PANDA_TARGET_ARM32_ABI_SOFT = ${PANDA_TARGET_ARM32_ABI_SOFT}") 510message(STATUS "PANDA_TARGET_ARM32_ABI_SOFTFP = ${PANDA_TARGET_ARM32_ABI_SOFTFP}") 511message(STATUS "PANDA_TARGET_ARM32_ABI_HARD = ${PANDA_TARGET_ARM32_ABI_HARD}") 512endif() 513message(STATUS "PANDA_TARGET_64 = ${PANDA_TARGET_64}") 514message(STATUS "PANDA_TARGET_32 = ${PANDA_TARGET_32}") 515message(STATUS "PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES = ${PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES}") 516message(STATUS "PANDA_ENABLE_LTO = ${PANDA_ENABLE_LTO}") 517if(PANDA_TARGET_MOBILE) 518message(STATUS "PANDA_LLVM_REGALLOC = ${PANDA_LLVM_REGALLOC}") 519endif() 520if(PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS) 521message(STATUS "PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS = ${PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS}") 522endif() 523message(STATUS "PANDA_WITH_RUNTIME = ${PANDA_WITH_RUNTIME}") 524message(STATUS "PANDA_WITH_COMPILER = ${PANDA_WITH_COMPILER}") 525message(STATUS "PANDA_COMPILER_ENABLE = ${PANDA_COMPILER_ENABLE}") 526message(STATUS "PANDA_WITH_TOOLCHAIN = ${PANDA_WITH_TOOLCHAIN}") 527message(STATUS "PANDA_WITH_TESTS = ${PANDA_WITH_TESTS}") 528message(STATUS "PANDA_WITH_BENCHMARKS = ${PANDA_WITH_BENCHMARKS}") 529message(STATUS "PANDA_WITH_BYTECODE_OPTIMIZER = ${PANDA_WITH_BYTECODE_OPTIMIZER}") 530message(STATUS "PANDA_PGO_INSTRUMENT = ${PANDA_PGO_INSTRUMENT}") 531message(STATUS "PANDA_PGO_OPTIMIZE = ${PANDA_PGO_OPTIMIZE}") 532message(STATUS "PANDA_PRODUCT_BUILD = ${PANDA_PRODUCT_BUILD}") 533message(STATUS "PANDA_ENABLE_RELAYOUT_PROFILE = ${PANDA_ENABLE_RELAYOUT_PROFILE}") 534message(STATUS "PANDA_QEMU_BUILD = ${PANDA_QEMU_BUILD}") 535message(STATUS "PANDA_LLVM_BACKEND = ${PANDA_LLVM_BACKEND}") 536message(STATUS "PANDA_LLVM_INTERPRETER = ${PANDA_LLVM_INTERPRETER}") 537message(STATUS "PANDA_LLVM_FASTPATH = ${PANDA_LLVM_FASTPATH}") 538message(STATUS "PANDA_LLVM_AOT = ${PANDA_LLVM_AOT}") 539message(STATUS "PANDA_ENABLE_CCACHE = ${PANDA_ENABLE_CCACHE}") 540message(STATUS "PANDA_USE_CUSTOM_SIGNAL_STACK = ${PANDA_USE_CUSTOM_SIGNAL_STACK}") 541message(STATUS "PANDA_USE_PREBUILT_TARGETS = ${PANDA_USE_PREBUILT_TARGETS}") 542message(STATUS "CMAKE_NO_SYSTEM_FROM_IMPORTED = ${CMAKE_NO_SYSTEM_FROM_IMPORTED}") 543message(STATUS "ES2PANDA_PATH = ${ES2PANDA_PATH}") 544