1*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates. 2*523fa7a6SAndroid Build Coastguard Worker# All rights reserved. 3*523fa7a6SAndroid Build Coastguard Worker# 4*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 5*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 6*523fa7a6SAndroid Build Coastguard Worker 7*523fa7a6SAndroid Build Coastguard Worker# 8*523fa7a6SAndroid Build Coastguard Worker# This file is intended to have helper functions for test-related CMakeLists.txt 9*523fa7a6SAndroid Build Coastguard Worker# files. 10*523fa7a6SAndroid Build Coastguard Worker# 11*523fa7a6SAndroid Build Coastguard Worker# ### Editing this file ### 12*523fa7a6SAndroid Build Coastguard Worker# 13*523fa7a6SAndroid Build Coastguard Worker# This file should be formatted with 14*523fa7a6SAndroid Build Coastguard Worker# ~~~ 15*523fa7a6SAndroid Build Coastguard Worker# cmake-format -i Test.cmake 16*523fa7a6SAndroid Build Coastguard Worker# ~~~ 17*523fa7a6SAndroid Build Coastguard Worker# It should also be cmake-lint clean. 18*523fa7a6SAndroid Build Coastguard Worker# 19*523fa7a6SAndroid Build Coastguard Worker 20*523fa7a6SAndroid Build Coastguard Workerinclude(${EXECUTORCH_ROOT}/build/Utils.cmake) 21*523fa7a6SAndroid Build Coastguard Worker 22*523fa7a6SAndroid Build Coastguard Worker# Find prebuilt executorch library 23*523fa7a6SAndroid Build Coastguard Workerfind_package(executorch CONFIG REQUIRED) 24*523fa7a6SAndroid Build Coastguard Worker 25*523fa7a6SAndroid Build Coastguard Workerenable_testing() 26*523fa7a6SAndroid Build Coastguard Workerfind_package(GTest CONFIG REQUIRED) 27*523fa7a6SAndroid Build Coastguard Worker 28*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(cpuinfo) 29*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(extension_data_loader) 30*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(portable_kernels) 31*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(portable_ops_lib) 32*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(pthreadpool) 33*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(quantized_ops_lib) 34*523fa7a6SAndroid Build Coastguard Worker 35*523fa7a6SAndroid Build Coastguard Worker# Add code coverage flags to supported compilers 36*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_USE_CPP_CODE_COVERAGE) 37*523fa7a6SAndroid Build Coastguard Worker if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 38*523fa7a6SAndroid Build Coastguard Worker string(APPEND CMAKE_C_FLAGS " --coverage -fprofile-abs-path") 39*523fa7a6SAndroid Build Coastguard Worker string(APPEND CMAKE_CXX_FLAGS " --coverage -fprofile-abs-path") 40*523fa7a6SAndroid Build Coastguard Worker elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 41*523fa7a6SAndroid Build Coastguard Worker string(APPEND CMAKE_C_FLAGS " -fprofile-instr-generate -fcoverage-mapping") 42*523fa7a6SAndroid Build Coastguard Worker string(APPEND CMAKE_CXX_FLAGS 43*523fa7a6SAndroid Build Coastguard Worker " -fprofile-instr-generate -fcoverage-mapping" 44*523fa7a6SAndroid Build Coastguard Worker ) 45*523fa7a6SAndroid Build Coastguard Worker else() 46*523fa7a6SAndroid Build Coastguard Worker message(ERROR 47*523fa7a6SAndroid Build Coastguard Worker "Code coverage for compiler ${CMAKE_CXX_COMPILER_ID} is unsupported" 48*523fa7a6SAndroid Build Coastguard Worker ) 49*523fa7a6SAndroid Build Coastguard Worker endif() 50*523fa7a6SAndroid Build Coastguard Workerendif() 51*523fa7a6SAndroid Build Coastguard Worker 52*523fa7a6SAndroid Build Coastguard Worker# A helper function to generate a gtest cxx executable target @param 53*523fa7a6SAndroid Build Coastguard Worker# target_name: name for the executable @param SOURCES <list_of_sources>: test 54*523fa7a6SAndroid Build Coastguard Worker# sources to be compiled. Sometimes util sources are used as well @param EXTRA 55*523fa7a6SAndroid Build Coastguard Worker# LIBS <list_of_libs>: additional libraries to be linked against the target. 56*523fa7a6SAndroid Build Coastguard Worker# gtest, gmock, executorch are linked by default, but Sometimes user may need 57*523fa7a6SAndroid Build Coastguard Worker# additional libraries like kernels. We use CMake package executorch in this 58*523fa7a6SAndroid Build Coastguard Worker# helper, so user can easily add installed libraries. 59*523fa7a6SAndroid Build Coastguard Worker# 60*523fa7a6SAndroid Build Coastguard Worker# Example: et_cxx_test(my_test SOURCES my_test.cpp EXTRA_LIBS portable_kernels) 61*523fa7a6SAndroid Build Coastguard Worker# 62*523fa7a6SAndroid Build Coastguard Worker# This defines a gtest executable my_test, compiling my_test.cpp, and linking 63*523fa7a6SAndroid Build Coastguard Worker# against libportable_kernels.a. 64*523fa7a6SAndroid Build Coastguard Worker# 65*523fa7a6SAndroid Build Coastguard Workerfunction(et_cxx_test target_name) 66*523fa7a6SAndroid Build Coastguard Worker 67*523fa7a6SAndroid Build Coastguard Worker set(multi_arg_names SOURCES EXTRA_LIBS) 68*523fa7a6SAndroid Build Coastguard Worker cmake_parse_arguments(ET_CXX_TEST "" "" "${multi_arg_names}" ${ARGN}) 69*523fa7a6SAndroid Build Coastguard Worker 70*523fa7a6SAndroid Build Coastguard Worker # Let files say "include <executorch/path/to/header.h>". 71*523fa7a6SAndroid Build Coastguard Worker target_include_directories(executorch INTERFACE ${EXECUTORCH_ROOT}/..) 72*523fa7a6SAndroid Build Coastguard Worker 73*523fa7a6SAndroid Build Coastguard Worker set(ET_TEST_UTIL_SOURCES 74*523fa7a6SAndroid Build Coastguard Worker ${EXECUTORCH_ROOT}/runtime/core/exec_aten/testing_util/tensor_util.cpp 75*523fa7a6SAndroid Build Coastguard Worker ) 76*523fa7a6SAndroid Build Coastguard Worker 77*523fa7a6SAndroid Build Coastguard Worker add_executable(${target_name} ${ET_CXX_TEST_SOURCES} ${ET_TEST_UTIL_SOURCES}) 78*523fa7a6SAndroid Build Coastguard Worker # Includes gtest, gmock, executorch by default 79*523fa7a6SAndroid Build Coastguard Worker target_link_libraries( 80*523fa7a6SAndroid Build Coastguard Worker ${target_name} GTest::gtest GTest::gtest_main GTest::gmock executorch 81*523fa7a6SAndroid Build Coastguard Worker ${ET_CXX_TEST_EXTRA_LIBS} 82*523fa7a6SAndroid Build Coastguard Worker ) 83*523fa7a6SAndroid Build Coastguard Worker 84*523fa7a6SAndroid Build Coastguard Worker # add_test adds a test target to be used by ctest. We use `ExecuTorchTest` as 85*523fa7a6SAndroid Build Coastguard Worker # the ctest target name for the test executable Usage: cd 86*523fa7a6SAndroid Build Coastguard Worker # cmake-out/path/to/test/; ctest Note: currently we directly invoke the test 87*523fa7a6SAndroid Build Coastguard Worker # target, without using ctest 88*523fa7a6SAndroid Build Coastguard Worker add_test(ExecuTorchTest ${target_name}) 89*523fa7a6SAndroid Build Coastguard Worker 90*523fa7a6SAndroid Build Coastguard Workerendfunction() 91