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