From dfd6c88aaa54a03a61434c413e30c217eb98f1d5 Mon Sep 17 00:00:00 2001 From: Marcus Asteborg Date: Tue, 22 Dec 2020 00:33:56 -0800 Subject: cmake - add support to run ctest on android #2347 Signed-off-by: Ralph Giles --- CMakeLists.txt | 49 ++++++++++++++++++++++++------------------ Makefile.am | 1 + cmake/RunTest.cmake | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 20 deletions(-) create mode 100644 cmake/RunTest.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a28f441c..02de9b74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -579,7 +579,7 @@ if(OPUS_BUILD_PROGRAMS) target_link_libraries(opus_compare PRIVATE opus ${OPUS_REQUIRED_LIBRARIES}) endif() -if(BUILD_TESTING) +if(BUILD_TESTING AND NOT BUILD_SHARED_LIBS) enable_testing() # tests @@ -590,29 +590,38 @@ if(BUILD_TESTING) if(OPUS_FIXED_POINT) target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API) endif() - add_test(NAME test_opus_decode COMMAND $ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME test_opus_decode COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$ + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") add_executable(test_opus_padding ${test_opus_padding_sources}) target_include_directories(test_opus_padding PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(test_opus_padding PRIVATE opus) - add_test(NAME test_opus_padding COMMAND $ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) - - if(NOT BUILD_SHARED_LIBS) - # disable tests that depends on private API when building shared lib - add_executable(test_opus_api ${test_opus_api_sources}) - target_include_directories(test_opus_api - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) - target_link_libraries(test_opus_api PRIVATE opus) - if(OPUS_FIXED_POINT) - target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API) - endif() - add_test(NAME test_opus_api COMMAND $ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) - - add_executable(test_opus_encode ${test_opus_encode_sources}) - target_include_directories(test_opus_encode - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) - target_link_libraries(test_opus_encode PRIVATE opus) - add_test(NAME test_opus_encode COMMAND $ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME test_opus_padding COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$ + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") + + add_executable(test_opus_api ${test_opus_api_sources}) + target_include_directories(test_opus_api + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) + target_link_libraries(test_opus_api PRIVATE opus) + if(OPUS_FIXED_POINT) + target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API) endif() + add_test(NAME test_opus_api COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$ + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") + + add_executable(test_opus_encode ${test_opus_encode_sources}) + target_include_directories(test_opus_encode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) + target_link_libraries(test_opus_encode PRIVATE opus) + add_test(NAME test_opus_encode COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$ + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") endif() diff --git a/Makefile.am b/Makefile.am index 83beaa3f..70a2ebfa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -222,6 +222,7 @@ EXTRA_DIST = opus.pc.in \ cmake/OpusFunctions.cmake \ cmake/OpusPackageVersion.cmake \ cmake/OpusSources.cmake \ + cmake/RunTest.cmake \ cmake/config.h.cmake.in \ cmake/vla.c \ meson/get-version.py \ diff --git a/cmake/RunTest.cmake b/cmake/RunTest.cmake new file mode 100644 index 00000000..f6f8b4a2 --- /dev/null +++ b/cmake/RunTest.cmake @@ -0,0 +1,61 @@ +if(NOT EXISTS ${TEST_EXECUTABLE}) + message(FATAL_ERROR "Error could not find ${TEST_EXECUTABLE}, ensure that you built the test binary") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + + # support to run plain old binary on android devices + # requires android debug bridge to be installed + + find_program(adb_executable adb) + if(NOT adb_executable) + message(FATAL_ERROR "Error could not find adb") + endif() + + # check if any device emulator is attached + execute_process(COMMAND ${adb_executable} shell echo RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error adb: no devices/emulators found") + endif() + + # push binary + set(android_path /data/local/tmp) + execute_process(COMMAND ${adb_executable} push ${TEST_EXECUTABLE} ${android_path} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} push ${TEST_EXECUTABLE} ${android_path} failed with result ${CMD_RESULT}") + endif() + + # set permissions + get_filename_component(test_executable ${TEST_EXECUTABLE} NAME) + set(test_executable_on_android /data/local/tmp/${test_executable}) + execute_process(COMMAND ${adb_executable} shell chmod 555 ${test_executable_on_android} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} shell chmod 555 ${test_executable_on_android} failed with result ${CMD_RESULT}") + endif() + + # run executable + execute_process(COMMAND ${adb_executable} shell ${test_executable_on_android} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} shell ${test_executable_on_android} failed with result ${CMD_RESULT}") + endif() + + # clean up binary + execute_process(COMMAND ${adb_executable} shell rm ${test_executable_on_android} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} shell rm ${test_executable_on_android} failed with result ${CMD_RESULT}") + endif() + +elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") + # CTest doesn't support iOS + + message(FATAL_ERROR "Error CTest is not supported on iOS") + +else() + # for other platforms just execute test binary on host + + execute_process(COMMAND ${TEST_EXECUTABLE} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${TEST_EXECUTABLE} failed with result ${CMD_RESULT}") + endif() + +endif() \ No newline at end of file -- cgit v1.2.3