LLAddBuildTest.cmake
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:11k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. # -*- cmake -*-
  2. include(LLTestCommand)
  3. include(GoogleMock)
  4. MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
  5.   # Given a project name and a list of sourcefiles (with optional properties on each),
  6.   # add targets to build and run the tests specified.
  7.   # ASSUMPTIONS:
  8.   # * this macro is being executed in the project file that is passed in
  9.   # * current working SOURCE dir is that project dir
  10.   # * there is a subfolder tests/ with test code corresponding to the filenames passed in
  11.   # * properties for each sourcefile passed in indicate what libs to link that file with (MAKE NO ASSUMPTIONS ASIDE FROM TUT)
  12.   #
  13.   # More info and examples at: https://wiki.secondlife.com/wiki/How_to_add_unit_tests_to_indra_code
  14.   #
  15.   # WARNING: do NOT modify this code without working with poppy -
  16.   # there is another branch that will conflict heavily with any changes here.
  17. INCLUDE(GoogleMock)
  18.   IF(LL_TEST_VERBOSE)
  19.     MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}")
  20.   ENDIF(LL_TEST_VERBOSE)
  21.   # Start with the header and project-wide setup before making targets
  22.   #project(UNITTEST_PROJECT_${project})
  23.   # Setup includes, paths, etc
  24.   SET(alltest_SOURCE_FILES
  25.     ${CMAKE_SOURCE_DIR}/test/test.cpp
  26.     ${CMAKE_SOURCE_DIR}/test/lltut.cpp
  27.     )
  28.   SET(alltest_DEP_TARGETS
  29.     # needed by the test harness itself
  30.     ${APRUTIL_LIBRARIES}
  31.     ${APR_LIBRARIES}
  32.     llcommon
  33.     )
  34.   IF(NOT "${project}" STREQUAL "llmath")
  35.     # add llmath as a dep unless the tested module *is* llmath!
  36.     LIST(APPEND alltest_DEP_TARGETS
  37.       llmath
  38.       )
  39.   ENDIF(NOT "${project}" STREQUAL "llmath")
  40.   SET(alltest_INCLUDE_DIRS
  41.     ${LLMATH_INCLUDE_DIRS}
  42.     ${LLCOMMON_INCLUDE_DIRS}
  43.     ${LIBS_OPEN_DIR}/test
  44.     ${GOOGLEMOCK_INCLUDE_DIRS}
  45.     )
  46.   SET(alltest_LIBRARIES
  47.     ${GOOGLEMOCK_LIBRARIES}
  48.     ${PTHREAD_LIBRARY}
  49.     ${WINDOWS_LIBRARIES}
  50.     )
  51.   # Headers, for convenience in targets.
  52.   SET(alltest_HEADER_FILES
  53.     ${CMAKE_SOURCE_DIR}/test/test.h
  54.     )
  55.   # Use the default flags
  56.   if (LINUX)
  57.     SET(CMAKE_EXE_LINKER_FLAGS "")
  58.   endif (LINUX)
  59.   # start the source test executable definitions
  60.   SET(${project}_TEST_OUTPUT "")
  61.   FOREACH (source ${sources})
  62.     STRING( REGEX REPLACE "(.*)\.[^.]+$" "\1" name ${source} )
  63.     STRING( REGEX REPLACE ".*\.([^.]+)$" "\1" extension ${source} )
  64.     IF(LL_TEST_VERBOSE)
  65.       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})")
  66.     ENDIF(LL_TEST_VERBOSE)
  67.     #
  68.     # Per-codefile additional / external source, header, and include dir property extraction
  69.     #
  70.     # Source
  71.     GET_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES)
  72.     IF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
  73.       SET(${name}_test_additional_SOURCE_FILES "")
  74.     ENDIF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
  75.     SET(${name}_test_SOURCE_FILES ${source} tests/${name}_test.${extension} ${alltest_SOURCE_FILES} ${${name}_test_additional_SOURCE_FILES} )
  76.     IF(LL_TEST_VERBOSE)
  77.       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}")
  78.     ENDIF(LL_TEST_VERBOSE)
  79.     # Headers
  80.     GET_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
  81.     IF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
  82.       SET(${name}_test_additional_HEADER_FILES "")
  83.     ENDIF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
  84.     SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES})
  85.     set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE)
  86.     LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES})
  87.     IF(LL_TEST_VERBOSE)
  88.       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}")
  89.     ENDIF(LL_TEST_VERBOSE)
  90.     # Include dirs
  91.     GET_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS)
  92.     IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
  93.       SET(${name}_test_additional_INCLUDE_DIRS "")
  94.     ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
  95.     INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS )
  96.     IF(LL_TEST_VERBOSE)
  97.       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
  98.     ENDIF(LL_TEST_VERBOSE)
  99.     # Setup target
  100.     ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES})
  101.     SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR})
  102.     #
  103.     # Per-codefile additional / external project dep and lib dep property extraction
  104.     #
  105.     # WARNING: it's REALLY IMPORTANT to not mix these. I guarantee it will not work in the future. + poppy 2009-04-19
  106.     # Projects
  107.     GET_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS)
  108.     IF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
  109.       SET(${name}_test_additional_PROJECTS "")
  110.     ENDIF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
  111.     # Libraries
  112.     GET_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES)
  113.     IF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
  114.       SET(${name}_test_additional_LIBRARIES "")
  115.     ENDIF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
  116.     IF(LL_TEST_VERBOSE)
  117.       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}")
  118.       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}")
  119.     ENDIF(LL_TEST_VERBOSE)
  120.     # Add to project
  121.     TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} )
  122.     
  123.     #
  124.     # Setup test targets
  125.     #
  126.     GET_TARGET_PROPERTY(TEST_EXE PROJECT_${project}_TEST_${name} LOCATION)
  127.     SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt)
  128.     SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR})
  129.     # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19
  130.     IF(LL_TEST_VERBOSE)
  131.       MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd  = ${TEST_CMD}")
  132.     ENDIF(LL_TEST_VERBOSE)
  133.     
  134.     IF(WINDOWS)
  135.       set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
  136.     ELSEIF(DARWIN)
  137.       set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
  138.     ELSE(WINDOWS)
  139.       set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
  140.     ENDIF(WINDOWS)
  141.     LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${TEST_CMD})
  142.     SET(TEST_SCRIPT_CMD ${LL_TEST_COMMAND_value})
  143.     IF(LL_TEST_VERBOSE)
  144.       MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script  = ${TEST_SCRIPT_CMD}")
  145.     ENDIF(LL_TEST_VERBOSE)
  146.     # Add test 
  147.     ADD_CUSTOM_COMMAND(
  148.         OUTPUT ${TEST_OUTPUT}
  149.         COMMAND ${TEST_SCRIPT_CMD}
  150.         DEPENDS PROJECT_${project}_TEST_${name}
  151.         WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  152.         )
  153.     # Why not add custom target and add POST_BUILD command?
  154.     # Slightly less uncertain behavior
  155.     # (OUTPUT commands run non-deterministically AFAIK) + poppy 2009-04-19
  156.     # > I did not use a post build step as I could not make it notify of a 
  157.     # > failure after the first time you build and fail a test. - daveh 2009-04-20
  158.     LIST(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT})
  159.   ENDFOREACH (source)
  160.   # Add the test runner target per-project
  161.   # (replaces old _test_ok targets all over the place)
  162.   ADD_CUSTOM_TARGET(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT})
  163.   ADD_DEPENDENCIES(${project} ${project}_tests)
  164. ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS)
  165. FUNCTION(LL_ADD_INTEGRATION_TEST 
  166.     testname
  167.     additional_source_files
  168.     library_dependencies
  169. # variable args
  170.     )
  171.   if(TEST_DEBUG)
  172.     message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on")
  173.   endif(TEST_DEBUG)
  174.   
  175.   SET(source_files
  176.     tests/${testname}_test.cpp
  177.     ${CMAKE_SOURCE_DIR}/test/test.cpp
  178.     ${CMAKE_SOURCE_DIR}/test/lltut.cpp
  179.     ${additional_source_files}
  180.     )
  181.   SET(libraries
  182.     ${library_dependencies}
  183.     ${GOOGLEMOCK_LIBRARIES}
  184.     ${PTHREAD_LIBRARY}
  185.     )
  186.   # Add test executable build target
  187.   if(TEST_DEBUG)
  188.     message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
  189.   endif(TEST_DEBUG)
  190.   ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
  191.   SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR})
  192.   # Add link deps to the executable
  193.   if(TEST_DEBUG)
  194.     message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})")
  195.   endif(TEST_DEBUG)
  196.   TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})
  197.   # Create the test running command
  198.   SET(test_command ${ARGN})
  199.   GET_TARGET_PROPERTY(TEST_EXE INTEGRATION_TEST_${testname} LOCATION)
  200.   LIST(FIND test_command "{}" test_exe_pos)
  201.   IF(test_exe_pos LESS 0)
  202.     # The {} marker means "the full pathname of the test executable."
  203.     # test_exe_pos -1 means we didn't find it -- so append the test executable
  204.     # name to $ARGN, the variable part of the arg list. This is convenient
  205.     # shorthand for both straightforward execution of the test program (empty
  206.     # $ARGN) and for running a "wrapper" program of some kind accepting the
  207.     # pathname of the test program as the last of its args. You need specify
  208.     # {} only if the test program's pathname isn't the last argument in the
  209.     # desired command line.
  210.     LIST(APPEND test_command "${TEST_EXE}")
  211.   ELSE (test_exe_pos LESS 0)
  212.     # Found {} marker at test_exe_pos. Remove the {}...
  213.     LIST(REMOVE_AT test_command test_exe_pos)
  214.     # ...and replace it with the actual name of the test executable.
  215.     LIST(INSERT test_command test_exe_pos "${TEST_EXE}")
  216.   ENDIF (test_exe_pos LESS 0)
  217.   IF(WINDOWS)
  218.     set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
  219.   ELSEIF(DARWIN)
  220.     set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
  221.   ELSE(WINDOWS)
  222.     set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
  223.   ENDIF(WINDOWS)
  224.   LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${test_command})
  225.   SET(TEST_SCRIPT_CMD ${LL_TEST_COMMAND_value})
  226.   if(TEST_DEBUG)
  227.     message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}")
  228.   endif(TEST_DEBUG)
  229.   ADD_CUSTOM_COMMAND(
  230.     TARGET INTEGRATION_TEST_${testname}
  231.     POST_BUILD
  232.     COMMAND ${TEST_SCRIPT_CMD}
  233.     )
  234.   # Use CTEST? Not sure how to yet...
  235.   # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
  236. ENDFUNCTION(LL_ADD_INTEGRATION_TEST)