這章節要來解釋如何在CMAKE中加入auto test功能, 主要是透過enable_testing()啟動testing功能, 並透過add_test()間接呼叫ctest執行測試, 以及set_tests_properties(PROPERTIES PASS_REGULAR_EXPRESSION)來驗證執行結果
# Require a minimum version of cmake. # cmake_minimum_required(VERSION <min>>[...<policy_max>] [FATAL_ERROR]) cmake_minimum_required(VERSION 3.10) # Set the name of the project. # project(<PROJECT-NAME< [<anguage-name>...]) # project(<PROJECT-NAME> # [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] # [DESCRIPTION <project-description-string>] # [LANGUAGES <language-name>...]) project(Tutorial VERSION 0.1.2.3 DESCRIPTION "This is Brook 1st CMake Lib") # Add an executable to the project using the specified source files. # add_executable(<name> [WIN32] [MACOSX_BUNDLE] # [EXCLUDE_FROM_ALL] # [source1] [source2 ...]) add_executable(Tutorial hello.c) # option(<variable> "上述範例主要透過do_test(Tutorial 4 "mymath: 16")執行測試, 而do_test為我們自訂的function, 透過add_test(NAME Comp${arg} COMMAND ${target} ${arg})執行ctest與set_tests_properties(Comp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result})驗證執行結果, 這裡的${result}就等於"mymath: 16", 要根據輸出結果作對應修改." [value]) option(USE_MYMATH "Use tutorial provided math implementation" ON) # configure_file(<input> <output> # [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS | # FILE_PERMISSIONS <permissions>...] # [COPYONLY] [ESCAPE_QUOTES] [@ONLY] # [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) # configure a header file to pass some of the CMake settings # to the source code configure_file(Config.h.in Config.h) if (USE_MYMATH) # Add a subdirectory to the build. # add_subdirectory(source_dir [binary_dir] # [EXCLUDE_FROM_ALL]) add_subdirectory(mymath01) # list(APPEND <list> [<element> ...]) # Appends elements to the list. # If no variable named <list> exists in the current # scope its value is treated as empty and the elements # are appended to that empty list. list(APPEND EXTRA_LIBS MyMathLib1) else() list(APPEND EXTRA_LIBS "m") endif() # Specify libraries or flags to use when linking a given target and/or its dependents. # target_link_libraries(<target> # <PRIVATE|PUBLIC|INTERFACE> - ... # [<PRIVATE|PUBLIC|INTERFACE>
- ...]...) target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS}) # Add include directories to a target. # target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] # <INTERFACE|PUBLIC|PRIVATE> [items1...] # [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}") # Enable testing for current directory and below. enable_testing() # Start recording a function for later invocation as a command. # function(<name> [<arg1> ...]) # <commands> # endfunction() function(do_test target arg result) # Add a test to the project to be run by ctest(1). #add_test(NAME <name> COMMAND <command> [<arg>...] # [CONFIGURATIONS <config>...] # [WORKING_DIRECTORY <dir>] # [COMMAND_EXPAND_LISTS]) # Adds a test called <name> add_test(NAME Comp${arg} COMMAND ${target} ${arg}) # Set a property of the tests. # set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2) set_tests_properties(Comp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result} ) endfunction() do_test(Tutorial 4 "mymath: 16")
執行結果如下
[brook@:~/Projects/cmake/04-2]$ mkdir build && cd build [brook@:~/Projects/cmake/04-2/build]$ cmake ../src/ && make all test ARGS="-V" -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /build/brook/Projects/cmake/04-2/build Scanning dependencies of target MyMathLib1 [ 25%] Building C object mymath01/CMakeFiles/MyMathLib1.dir/mymath01.c.o [ 50%] Linking C static library libMyMathLib1.a [ 50%] Built target MyMathLib1 Scanning dependencies of target Tutorial [ 75%] Building C object CMakeFiles/Tutorial.dir/hello.c.o /build/brook/Projects/cmake/04-2/src/hello.c:6:9: note: #pragma message: use mymath #pragma message("use mymath") ^~~~~~~ [100%] Linking C executable Tutorial [100%] Built target Tutorial Running tests... UpdateCTestConfiguration from :/build/brook/Projects/cmake/04-2/build/DartConfiguration.tcl UpdateCTestConfiguration from :/build/brook/Projects/cmake/04-2/build/DartConfiguration.tcl Test project /build/brook/Projects/cmake/04-2/build Constructing a list of tests Done constructing a list of tests Updating test list for fixtures Added 0 tests to meet fixture requirements Checking test dependency graph... Checking test dependency graph end test 1 Start 1: Comp4 1: Test command: /build/brook/Projects/cmake/04-2/build/Tutorial "4" 1: Test timeout computed to be: 9.99988e+06 1: mymath: 16 1/1 Test #1: Comp4 ............................ Passed 0.01 sec 100% tests passed, 0 tests failed out of 1 Total Test time (real) = 0.01 sec [brook@:~/Projects/cmake/04-2/build]$ cmake ../src/ && make all test -- Configuring done -- Generating done -- Build files have been written to: /build/brook/Projects/cmake/04-2/build [ 50%] Built target MyMathLib1 [100%] Built target Tutorial Running tests... Test project /build/brook/Projects/cmake/04-2/build Start 1: Comp4 1/1 Test #1: Comp4 ............................ Passed 0.00 sec 100% tests passed, 0 tests failed out of 1 Total Test time (real) = 0.01 sec
利用make test ARGS="-V"多印一些ctest的output, 這樣比較容易debug