• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021-2022 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
14cmake_minimum_required(VERSION 3.5.2 FATAL_ERROR)
15
16if(NOT CMAKE_CROSSCOMPILING)
17
18    set(CMAKE_VERBOSE_MAKEFILE ON)
19
20    project(cts_generator)
21
22    if(NOT PANDA_CTS_JOBS_NUMBER)
23        if(PANDA_ENABLE_THREAD_SANITIZER)
24          # Decrease threads for build with TSAN to deal with increased memory usage
25          # 04.12.20 set to 16 to check behavior
26          set(PANDA_CTS_JOBS_NUMBER 16)
27        else()
28          set(PANDA_CTS_JOBS_NUMBER 16)
29        endif()
30    endif()
31
32    set(CTS_TSAN_TEST_SELECTION "--include-tag tsan")
33
34    # Set timeout for the entire CTS test suite
35    if(NOT PANDA_CTS_TESTING_TIMEOUT)
36        # Increase timeout for build with sanitizers
37        if(PANDA_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER OR PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER)
38            set(PANDA_CTS_TESTING_TIMEOUT 6000)
39        else()
40            set(PANDA_CTS_TESTING_TIMEOUT 4000)
41        endif()
42    endif()
43
44    # Set timeout for each single test
45    if(NOT PANDA_CTS_TEST_TIMEOUT)
46        # Increase single test timeout for build with sanitizers
47        if(PANDA_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER OR PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER)
48            set(PANDA_CTS_TEST_TIMEOUT 300)   # 300 seconds
49        else()
50            set(PANDA_CTS_TEST_TIMEOUT 60)    # 60 seconds
51        endif()
52    endif()
53
54    # Source files:
55    set(CTS_TEMPLATE_DIR_SRC "${PROJECT_SOURCE_DIR}/cts-template")
56    set(CTS_TEMPLATE "${PROJECT_BINARY_DIR}/cts-template/template.yaml")
57    set(CTS_TEMPLATE_SCHEMA "${PROJECT_BINARY_DIR}/cts-template/yaml-schema.json")
58    set(CTS_GENERATED_DIR "${PROJECT_BINARY_DIR}/cts-generated/")
59    set(CTS_TEMP_DIR "${PROJECT_BINARY_DIR}/tmp/")
60    set(VERIFIER_DEBUG_CONFIG "${PROJECT_SOURCE_DIR}/verifier.config")
61
62    file(
63        COPY "${CTS_TEMPLATE_DIR_SRC}"
64        DESTINATION "${PROJECT_BINARY_DIR}"
65    )
66
67    file(
68        COPY "${VERIFIER_DEBUG_CONFIG}"
69        DESTINATION "${PROJECT_BINARY_DIR}"
70    )
71
72    # Generated files:
73    set(CTS_GENERATED "${PROJECT_BINARY_DIR}/cts-generated")
74    set(CTS_REPORT_RUN "${PROJECT_BINARY_DIR}/cts-generated/report.txt")
75
76    set(OUTPUT_FILES ${CTS_GENERATED})
77    set(OUTPUT_RUN ${CTS_REPORT_RUN})
78
79    # CTS Generator
80
81    set(CTS_GENERATOR "${PROJECT_SOURCE_DIR}/generate-cts.rb")
82    set(CTS_TEST_RUNNER "${PROJECT_SOURCE_DIR}/test-runner.rb")
83
84    # CTS_TEST_SELECT_OPTION is not defined, use predefined value for exclude tag and include tag options.
85    if (NOT DEFINED CTS_TEST_SELECT_OPTION)
86      if (CMAKE_BUILD_TYPE STREQUAL "Release")
87        if (PANDA_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER OR PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER)
88          set(CTS_TEST_SELECT_OPTION "--exclude-tag sanitizer-fail")
89        else()
90          set(CTS_TEST_SELECT_OPTION "--exclude-tag release")
91        endif()
92      else()
93        set(CTS_TEST_SELECT_OPTION " ")
94      endif()
95    endif()
96
97    # CTS_TEST_SELECT_OPTION_JIT is not defined, use predefined value for exclude tag and include tag options.
98    if (NOT DEFINED CTS_TEST_SELECT_OPTION_JIT)
99      if (CMAKE_BUILD_TYPE STREQUAL "Release")
100        if (PANDA_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER OR PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER)
101          set(CTS_TEST_SELECT_OPTION_JIT "--exclude-tag sanitizer-fail")
102        else()
103          set(CTS_TEST_SELECT_OPTION_JIT "--exclude-tag release")
104        endif()
105      else()
106        set(CTS_TEST_SELECT_OPTION_JIT " ")
107      endif()
108    endif()
109
110    set(CTS_TEST_SELECT_NIGHTLY_OPTION "${CTS_TEST_SELECT_OPTION}")
111    set(CTS_TEST_SELECT_NIGHTLY_OPTION_JIT "${CTS_TEST_SELECT_OPTION_JIT}")
112    # Limit tests for sanitizer build
113    if (PANDA_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER OR PANDA_ENABLE_ADDRESS_SANITIZER OR PANDA_ENABLE_THREAD_SANITIZER)
114        set(CTS_TEST_SELECT_OPTION "${CTS_TEST_SELECT_OPTION} ${CTS_TSAN_TEST_SELECTION}")
115        set(CTS_TEST_SELECT_OPTION_JIT "${CTS_TEST_SELECT_OPTION_JIT} ${CTS_TSAN_TEST_SELECTION}")
116    endif()
117
118    if (NOT DEFINED CTS_TEST_PRLIMIT_OPTIONS)
119      if (PANDA_ENABLE_ADDRESS_SANITIZER)
120        set(CTS_TEST_PRLIMIT_OPTIONS "--prlimit='--stack=100000000'")
121      endif()
122    endif()
123
124    # Exclude Arm-specific failures
125    if ((PANDA_TARGET_ARM32) OR (PANDA_TARGET_ARM64))
126      set(CTS_TEST_SELECT_OPTION_JIT "${CTS_TEST_SELECT_OPTION_JIT} --exclude-tag arm64-fail --exclude-tag arm64-jit")
127      set(CTS_TEST_SELECT_NIGHTLY_OPTION_JIT "${CTS_TEST_SELECT_NIGHTLY_OPTION_JIT} --exclude-tag arm64-fail --exclude-tag arm64-jit")
128    endif()
129
130    add_custom_command(OUTPUT ${OUTPUT_FILES}
131        COMMENT "Generate CTS files"
132        COMMAND ${CTS_GENERATOR}
133            -t "${CTS_TEMPLATE}"
134            -s "${CTS_TEMPLATE_SCHEMA}"
135            -o "${CTS_GENERATED_DIR}"
136            -k
137        DEPENDS "$<TARGET_FILE:ark_asm>" "$<TARGET_FILE:ark>" "$<TARGET_FILE:arkquick>"
138    )
139
140    # Convert arg string to separate args
141    string(REPLACE " " ";" CTS_TEST_SELECT_OPTION_ARGS ${CTS_TEST_SELECT_OPTION})
142    string(REPLACE " " ";" CTS_TEST_SELECT_OPTION_JIT_ARGS ${CTS_TEST_SELECT_OPTION_JIT})
143    string(REPLACE " " ";" CTS_TEST_SELECT_NIGHTLY_OPTION_ARGS ${CTS_TEST_SELECT_NIGHTLY_OPTION})
144    string(REPLACE " " ";" CTS_TEST_SELECT_NIGHTLY_OPTION_JIT_ARGS ${CTS_TEST_SELECT_NIGHTLY_OPTION_JIT})
145
146    # Run tests without enforced JIT, with irtoc-interpreter and with enforced JIT
147
148    add_custom_command(OUTPUT ${OUTPUT_RUN}
149        COMMENT "Run generated CTS tests"
150        COMMAND ${CTS_TEST_RUNNER}
151             -t "${CTS_GENERATED_DIR}"
152             -p "${PROJECT_BINARY_DIR}/../../"
153             -x "${CTS_TEMP_DIR}"
154             -v 1
155             --with-quickener
156             --global-timeout ${PANDA_CTS_TESTING_TIMEOUT}
157             --timeout ${PANDA_CTS_TEST_TIMEOUT}
158             -j ${PANDA_CTS_JOBS_NUMBER}
159             --verifier-config "${PROJECT_BINARY_DIR}/verifier.config"
160             ${CTS_TEST_PRLIMIT_OPTIONS}
161             ${CTS_TEST_SELECT_OPTION_ARGS} VERBATIM
162        COMMAND ${CTS_TEST_RUNNER}
163             -t "${CTS_GENERATED_DIR}"
164             -p "${PROJECT_BINARY_DIR}/../../"
165             -x "${CTS_TEMP_DIR}"
166             -v 1
167             -e irtoc_ignore
168             -o "--interpreter-type=irtoc --gc-type=g1-gc"
169             --with-quickener
170             --global-timeout ${PANDA_CTS_TESTING_TIMEOUT}
171             --timeout ${PANDA_CTS_TEST_TIMEOUT}
172             -j ${PANDA_CTS_JOBS_NUMBER}
173             --verifier-config "${PROJECT_BINARY_DIR}/verifier.config"
174             ${CTS_TEST_PRLIMIT_OPTIONS}
175            --exclude-tag verifier
176             ${CTS_TEST_SELECT_OPTION_ARGS} VERBATIM
177        COMMAND ${CTS_TEST_RUNNER}
178            -t "${CTS_GENERATED_DIR}"
179            -p "${PROJECT_BINARY_DIR}/../../"
180            -x "${CTS_TEMP_DIR}"
181            -v 1
182            --with-quickener
183            --global-timeout ${PANDA_CTS_TESTING_TIMEOUT}
184            --timeout ${PANDA_CTS_TEST_TIMEOUT}
185            -j ${PANDA_CTS_JOBS_NUMBER}
186            --verifier-config "${PROJECT_BINARY_DIR}/verifier.config"
187            -o "--compiler-hotness-threshold=0"
188            -o "--no-async-jit"
189            ${CTS_TEST_PRLIMIT_OPTIONS}
190            --exclude-tag verifier
191            ${CTS_TEST_SELECT_OPTION_JIT_ARGS} VERBATIM
192        DEPENDS "$<TARGET_FILE:ark_asm>" "$<TARGET_FILE:ark>" "$<TARGET_FILE:arkquick>" "$<TARGET_FILE:verifier>" "${OUTPUT_FILES}"
193    )
194
195    if (PANDA_EXPORT_CTS_OPTIONS)
196      file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/cts-options" "CTS_TEST_SELECT_OPTION_ARGS=\"${CTS_TEST_SELECT_OPTION}\"\n")
197      file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/cts-options" "CTS_TEST_SELECT_OPTION_JIT_ARGS=\"${CTS_TEST_SELECT_OPTION_JIT}\"\n")
198      file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/cts-options" "CTS_TEST_PRLIMIT_OPTIONS=\"${CTS_TEST_PRLIMIT_OPTIONS}\"\n")
199      file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/cts-options" "CTS_TEST_SELECT_NIGHTLY_OPTION_ARGS=\"${CTS_TEST_SELECT_NIGHTLY_OPTION}\"\n")
200      file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/cts-options" "CTS_TEST_SELECT_NIGHTLY_OPTION_JIT_ARGS=\"${CTS_TEST_SELECT_NIGHTLY_OPTION_JIT}\"\n")
201    endif()
202
203    add_custom_target(cts-generator-build DEPENDS ${OUTPUT_FILES})
204    add_dependencies(cts-generator-build arkstdlib)
205
206    add_custom_target(cts-generator DEPENDS cts-generator-build ${OUTPUT_RUN})
207endif()
208