- 基础设置
find_package(GTest CONFIG REQUIRED)
list(APPEND PROJECT_LIBRARIES GTest::gtest)
enable_testing()
enable_language(ASM)
- 添加可执行文件
Lift.cpp/Tests.S生成lift-aarch64-tests
Run.cpp/Tests.S/tests_aarch64.S生成run-aarch64-tests
add_executable(lift-aarch64-tests
EXCLUDE_FROM_ALL
Lift.cpp
Tests.S
)
add_executable(run-aarch64-tests
EXCLUDE_FROM_ALL
Run.cpp
Tests.S
tests_aarch64.S
)
在lift-aarch64-tests 作用域中设置 POSITION_INDEPENDENT_CODE 为ON
COMPILE_FLAGS为”-fPIC -pie”
设置 OBJECT_DEPENDS 为”${AARCH64_TEST_FILES}”
在run-aarch64-tests作用域中设置 POSITION_INDEPENDENT_CODE为 ON
COMPILE_FLAGS 为”-fPIC -pie”
OBJECT_DEPENDS 为”${AARCH64_TEST_FILES}”
set_target_properties(lift-aarch64-tests PROPERTIES
POSITION_INDEPENDENT_CODE ON
COMPILE_FLAGS "-fPIC -pie"
)
set_target_properties(lift-aarch64-tests PROPERTIES OBJECT_DEPENDS "${AARCH64_TEST_FILES}")
set_target_properties(run-aarch64-tests PROPERTIES
POSITION_INDEPENDENT_CODE ON
COMPILE_FLAGS "-fPIC -pie"
OBJECT_DEPENDS "${AARCH64_TEST_FILES}"
)
- 设置编译选项
target_compile_options(lift-aarch64-tests
PRIVATE ${AARCH64_TEST_FLAGS}
-DIN_TEST_GENERATOR
)
- file
会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中
file(GLOB AARCH64_TEST_FILES
"${CMAKE_CURRENT_LIST_DIR}/*/*.S"
)
- 输出文件执行命令
生成:
tests_aarch64.bc
tests_aarch64.S
执行:COMMND后面的命令
add_custom_command(
OUTPUT tests_aarch64.bc
COMMAND lift-aarch64-tests --arch aarch64 --bc_out tests_aarch64.bc
DEPENDS lift-aarch64-tests semantics
)
add_custom_command(
OUTPUT tests_aarch64.S
COMMAND ${CMAKE_BC_COMPILER}
-Wno-override-module
-S -O1 -g0
-c tests_aarch64.bc
-o tests_aarch64.S
DEPENDS tests_aarch64.bc
)
- 目标文件与库文件进行连接
target_link_libraries(lift-aarch64-tests PUBLIC remill ${PROJECT_LIBRARIES} )
target_include_directories(lift-aarch64-tests PUBLIC ${PROJECT_INCLUDEDIRECTORIES})
target_include_directories(lift-aarch64-tests PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(run-aarch64-tests PUBLIC remill ${PROJECT_LIBRARIES})
target_include_directories(run-aarch64-tests PUBLIC ${PROJECT_INCLUDEDIRECTORIES})
target_include_directories(run-aarch64-tests PRIVATE ${CMAKE_SOURCE_DIR})
- 开启项目测试工作
add_test(NAME "aarch64" COMMAND "run-aarch64-tests")
- 在顶层和目标层之间添加依赖关系
add_dependencies(test_dependencies run-aarch64-tests)