• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021-2025 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)
30add_compile_definitions(PANDA_CMAKE_SDK)
31
32if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
33    panda_set_flag(PANDA_TARGET_LINUX)
34    panda_set_flag(PANDA_TARGET_UNIX)
35    if (NOT PANDA_ENABLE_ADDRESS_SANITIZER)
36        panda_set_flag(PANDA_USE_FUTEX)
37    endif()
38elseif(CMAKE_SYSTEM_NAME STREQUAL "OHOS")
39    panda_set_flag(PANDA_TARGET_OHOS)
40    panda_set_flag(PANDA_TARGET_UNIX)
41elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
42    panda_set_flag(PANDA_TARGET_MOBILE)
43    panda_set_flag(PANDA_TARGET_UNIX)
44    if (NOT PANDA_ENABLE_ADDRESS_SANITIZER)
45        panda_set_flag(PANDA_USE_FUTEX)
46    endif()
47elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
48    panda_set_flag(PANDA_TARGET_WINDOWS)
49elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
50    panda_set_flag(PANDA_TARGET_MACOS)
51    panda_set_flag(PANDA_TARGET_UNIX)
52else()
53    message(FATAL_ERROR "Platform ${CMAKE_SYSTEM_NAME} is not supported")
54endif()
55
56if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64")
57    if(NOT PANDA_CROSS_AMD64_X86)
58        panda_set_flag(PANDA_TARGET_AMD64)
59    else()
60        panda_set_flag(PANDA_TARGET_X86)
61    endif()
62elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i[356]86")
63    panda_set_flag(PANDA_TARGET_X86)
64elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
65    panda_set_flag(PANDA_TARGET_ARM64)
66elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
67    panda_set_flag(PANDA_TARGET_ARM32)
68    panda_promote_to_definitions(
69        PANDA_TARGET_ARM32_ABI_SOFT
70        PANDA_TARGET_ARM32_ABI_SOFTFP
71        PANDA_TARGET_ARM32_ABI_HARD
72    )
73    if((PANDA_TARGET_ARM32_ABI_SOFT AND (PANDA_TARGET_ARM32_ABI_SOFTFP OR PANDA_TARGET_ARM32_ABI_HARD)) OR
74       (PANDA_TARGET_ARM32_ABI_SOFTFP AND (PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_HARD)) OR
75       (PANDA_TARGET_ARM32_ABI_HARD AND (PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)))
76        message(FATAL_ERROR "Only one PANDA_TARGET_ARM32_ABI_* should be set.
77            PANDA_TARGET_ARM32_ABI_SOFT = ${PANDA_TARGET_ARM32_ABI_SOFT}
78            PANDA_TARGET_ARM32_ABI_SOFTFP = ${PANDA_TARGET_ARM32_ABI_SOFTFP}
79            PANDA_TARGET_ARM32_ABI_HARD = ${PANDA_TARGET_ARM32_ABI_HARD}")
80    elseif(NOT (PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP OR PANDA_TARGET_ARM32_ABI_HARD))
81        message(FATAL_ERROR "PANDA_TARGET_ARM32_ABI_* is not set")
82    endif()
83else()
84    message(FATAL_ERROR "Processor ${CMAKE_SYSTEM_PROCESSOR} is not supported")
85endif()
86
87if(PANDA_TARGET_AMD64 OR PANDA_TARGET_ARM64)
88    panda_set_flag(PANDA_TARGET_64)
89elseif(PANDA_TARGET_X86 OR PANDA_TARGET_ARM32)
90    panda_set_flag(PANDA_TARGET_32)
91else()
92    message(FATAL_ERROR "Unknown bitness of the target platform")
93endif()
94
95if (PANDA_TRACK_INTERNAL_ALLOCATIONS)
96    message(STATUS "Track internal allocations")
97    add_definitions(-DTRACK_INTERNAL_ALLOCATIONS=${PANDA_TRACK_INTERNAL_ALLOCATIONS})
98endif()
99
100if (PANDA_TARGET_ARM64 AND NOT PANDA_CI_TESTING_MODE STREQUAL "Nightly")
101    if (PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER)
102        panda_set_flag(PANDA_ARM64_TESTS_WITH_SANITIZER)
103    endif()
104endif()
105
106
107# Enable global register variables usage only for clang >= 9.0.0 and gcc >= 8.0.0.
108# Clang 8.0.0 doesn't support all necessary options -ffixed-<reg>. Gcc 7.5.0 freezes
109# when compiling release interpreter.
110#
111# Also calling conventions of functions that use global register variables are different:
112# clang stores and restores registers that are used for global variables in the prolog
113# and epilog of such functions and gcc doesn't do it. So it's necessary to inline all
114# function that refers to global register variables to interpreter loop.
115
116# For this reason we disable global register variables usage for clang debug builds as
117# ALWAYS_INLINE macro expands to nothing in this mode and we cannot guarantee that all
118# necessary function will be inlined.
119#
120if(PANDA_TARGET_ARM64 AND ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang"
121                           AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0.0
122                           AND CMAKE_BUILD_TYPE MATCHES Release)
123                           OR
124                           (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
125                           AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0.0)))
126    panda_set_flag(PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES)
127endif()
128
129if(CMAKE_BUILD_TYPE MATCHES Debug)
130    # Additional debug information about fp in each frame
131    add_compile_options(-fno-omit-frame-pointer)
132endif()
133
134# for correct work with gdb-9
135# See https://discourse.llvm.org/t/gdb-10-1-cant-read-clangs-dwarf-v5/6035
136if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14)
137    if ("${CMAKE_BUILD_TYPE}" MATCHES "^(RelWithDebInfo|FastVerify|Debug|DebugDetailed)$")
138        add_compile_options(-gdwarf-4)
139    endif()
140endif()
141
142# Enable LTO only for Android aarch64 due to bug for Android armv7:
143# https://github.com/android/ndk/issues/721
144if (PANDA_TARGET_MOBILE AND PANDA_TARGET_ARM64)
145    set(PANDA_ENABLE_LTO true)
146    set(PANDA_LLVM_REGALLOC pbqp)
147endif()
148
149if (PANDA_PGO_INSTRUMENT OR PANDA_PGO_OPTIMIZE)
150    if (NOT PANDA_TARGET_MOBILE OR NOT PANDA_TARGET_ARM64)
151        message(FATAL_ERROR "PGO supported only for Android aarch64")
152    endif()
153
154    set(PANDA_ENABLE_LTO true)
155endif()
156
157# TODO(v.cherkashi): Remove PANDA_TARGET_MOBILE_WITH_MANAGED_LIBS when the managed libs are separated form the Panda
158if(PANDA_TARGET_MOBILE_WITH_MANAGED_LIBS)
159    add_definitions(-DPANDA_TARGET_MOBILE_WITH_MANAGED_LIBS=1)
160    if(PANDA_TARGET_MOBILE)
161        panda_set_flag(PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS)
162    endif()
163else()
164    add_definitions(-DPANDA_TARGET_MOBILE_WITH_MANAGED_LIBS=0)
165endif()
166
167if(PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS)
168    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-statement-expression")
169    if(MOBILE_NATIVE_LIBS_SOURCE_PATH)
170        include_directories(${MOBILE_NATIVE_LIBS_SOURCE_PATH}/libc)
171    else()
172        message(FATAL_ERROR "MOBILE_NATIVE_LIBS_SOURCE_PATH is not set")
173    endif()
174endif()
175
176if(PANDA_TARGET_64)
177    panda_set_flag(PANDA_USE_32_BIT_POINTER)
178endif()
179
180if(PANDA_TARGET_LINUX)
181    execute_process(COMMAND grep PRETTY_NAME= /etc/os-release
182                    OUTPUT_VARIABLE PANDA_TARGET_LINUX_DISTRO
183                    OUTPUT_STRIP_TRAILING_WHITESPACE
184    )
185    if(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu")
186        panda_set_flag(PANDA_TARGET_LINUX_UBUNTU)
187    endif()
188
189    if(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu 18\\.04")
190        panda_set_flag(PANDA_TARGET_LINUX_UBUNTU_18_04)
191    elseif(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu 20\\.04")
192        panda_set_flag(PANDA_TARGET_LINUX_UBUNTU_20_04)
193    elseif(PANDA_TARGET_LINUX_DISTRO MATCHES "Ubuntu 22\\.04")
194        panda_set_flag(PANDA_TARGET_LINUX_UBUNTU_22_04)
195    endif()
196    execute_process(COMMAND uname -a
197                    OUTPUT_VARIABLE PANDA_TARGET_WSL_DISTRO
198                    OUTPUT_STRIP_TRAILING_WHITESPACE
199    )
200    if(PANDA_TARGET_WSL_DISTRO MATCHES "Microsoft")
201        panda_set_flag(PANDA_TARGET_WSL)
202    endif()
203    if(PANDA_TARGET_WSL_DISTRO MATCHES "WSL")
204        panda_set_flag(PANDA_TARGET_GENERAL_WSL)
205    endif()
206endif()
207
208set(PANDA_WITH_RUNTIME    true)
209set(PANDA_WITH_COMPILER   true)
210set(PANDA_WITH_TOOLCHAIN  true)
211if (NOT DEFINED PANDA_WITH_BENCHMARKS)
212    set(PANDA_WITH_BENCHMARKS true)
213endif()
214set(PANDA_DEFAULT_LIB_TYPE "SHARED")
215
216option(PANDA_WITH_TESTS "Enable test targets" true)
217option(PANDA_WITH_BYTECODE_OPTIMIZER "Enable bytecode optimizer" true)
218option(PANDA_COMPILER_DEBUG_INFO "Support DWARF debug information in Compiler (JIT/AOT/IRtoC)" 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 OR PANDA_TARGET_ARM32)
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_TARGET_CPU_FEATURES              = ${PANDA_TARGET_CPU_FEATURES}")
516message(STATUS "PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES = ${PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES}")
517message(STATUS "PANDA_ENABLE_LTO                       = ${PANDA_ENABLE_LTO}")
518if(PANDA_TARGET_MOBILE)
519message(STATUS "PANDA_LLVM_REGALLOC                    = ${PANDA_LLVM_REGALLOC}")
520endif()
521if(PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS)
522message(STATUS "PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS   = ${PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS}")
523endif()
524message(STATUS "PANDA_WITH_RUNTIME                     = ${PANDA_WITH_RUNTIME}")
525message(STATUS "PANDA_WITH_COMPILER                    = ${PANDA_WITH_COMPILER}")
526message(STATUS "PANDA_COMPILER_ENABLE                  = ${PANDA_COMPILER_ENABLE}")
527message(STATUS "PANDA_WITH_TOOLCHAIN                   = ${PANDA_WITH_TOOLCHAIN}")
528message(STATUS "PANDA_WITH_TESTS                       = ${PANDA_WITH_TESTS}")
529message(STATUS "PANDA_WITH_BENCHMARKS                  = ${PANDA_WITH_BENCHMARKS}")
530message(STATUS "PANDA_WITH_BYTECODE_OPTIMIZER          = ${PANDA_WITH_BYTECODE_OPTIMIZER}")
531message(STATUS "PANDA_PGO_INSTRUMENT                   = ${PANDA_PGO_INSTRUMENT}")
532message(STATUS "PANDA_PGO_OPTIMIZE                     = ${PANDA_PGO_OPTIMIZE}")
533message(STATUS "PANDA_PRODUCT_BUILD                    = ${PANDA_PRODUCT_BUILD}")
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