Back to home page

EIC code displayed by LXR

 
 

    


Warning, /geant4/cmake/Modules/G4TestAPI.cmake is written in an unsupported language. File is not indexed.

0001 #-----------------------------------------------------------------------
0002 # Special internal functions for building tests.
0003 #-----------------------------------------------------------------------
0004 #-----------------------------------------------------------------------
0005 # function geant4_add_test(<name> COMMAND cmd [arg1... ]
0006 #                          [PRECMD cmd [arg1...]] [POSTCMD cmd [arg1...]]
0007 #                           [OUTPUT outfile] [ERROR errfile]
0008 #                           [WORKING_DIRECTORY directory]
0009 #                           [ENVIRONMENT var1=val1 var2=val2 ...
0010 #                           [DEPENDS test1 ...]
0011 #                           [TIMEOUT seconds]
0012 #                           [DEBUG]
0013 #                           [SOURCE_DIR dir] [BINARY_DIR dir]
0014 #                           [BUILD target] [PROJECT project]
0015 #                           [PASSREGEX exp] [FAILREGEX epx]
0016 #                           [LABELS label1 label2 ...])
0017 #
0018 function(geant4_add_test test)
0019   cmake_parse_arguments(ARG
0020     "DEBUG"
0021     "TIMEOUT;BUILD;OUTPUT;ERROR;SOURCE_DIR;BINARY_DIR;PROJECT;PASSREGEX;FAILREGEX;WORKING_DIRECTORY"
0022     "COMMAND;PRECMD;POSTCMD;ENVIRONMENT;DEPENDS;LABELS"
0023     ${ARGN})
0024 
0025   if(CMAKE_CONFIGURATION_TYPES)
0026     set(_cfg $<CONFIGURATION>/)
0027   endif()
0028 
0029   # ARG_BUILD is treated as "zero or one"
0030   # zero arg: build everything
0031   # one arg: just that target
0032   if(ARG_BUILD OR "BUILD" IN_LIST ARG_KEYWORDS_MISSING_VALUES)
0033     set(_is_build_test TRUE)
0034   endif()
0035 
0036   # COMMAND AND BUILD: split test
0037   # - In this case, we have to create a -build and a -run test with the latter depending on the former
0038   # NOT COMMAND AND BUILD: pure build
0039   # COMMAND AND NOT BUILD: pure test
0040   if(ARG_COMMAND AND _is_build_test)
0041     set(_is_split_test TRUE)
0042   endif()
0043 
0044   # Supplying a PROJECT argument is now a deprecation warning and will be removed
0045   if(ARG_PROJECT)
0046     message(WARNING "Test '${test}' uses the deprecated 'PROJECT' argument to 'geant4_add_test'. This argument is obsolete")
0047   endif()
0048 
0049   #- Handle COMMAND argument
0050   list(LENGTH ARG_COMMAND _len)
0051   if(_len LESS 1)
0052     if(NOT _is_build_test)
0053       message(FATAL_ERROR "geant4_add_test: COMMAND argument is mandatory when BUILD argument is not supplied")
0054     endif()
0055   else()
0056     list(GET ARG_COMMAND 0 _prg)
0057     list(REMOVE_AT ARG_COMMAND 0)
0058     if(NOT IS_ABSOLUTE ${_prg})
0059       if(TARGET ${_prg})
0060         set(_prg "$<TARGET_FILE:${_prg}>")
0061       else()
0062         set(_prg ${CMAKE_CURRENT_BINARY_DIR}/${_cfg}${_prg})
0063       endif()
0064     elseif(EXISTS ${_prg})
0065       # Calling a prexisting/system program
0066     else()
0067       get_filename_component(_path ${_prg} PATH)
0068       get_filename_component(_file ${_prg} NAME)
0069       set(_prg ${_path}/${_cfg}${_file})
0070     endif()
0071     set(_cmd ${_prg} ${ARG_COMMAND})
0072     string(REPLACE ";" "#" _cmd "${_cmd}")
0073     string(REPLACE "=" "@" _cmd "${_cmd}")
0074   endif()
0075 
0076   set(_command ${CMAKE_COMMAND} -DTST=${test} -DCMD=${_cmd})
0077 
0078   #- Handle PRE and POST commands
0079   if(ARG_PRECMD)
0080     set(_pre ${ARG_PRECMD})
0081     string(REPLACE ";" "#" _pre "${_pre}")
0082     set(_command ${_command} -DPRE=${_pre})
0083   endif()
0084   if(ARG_POSTCMD)
0085     set(_post ${ARG_POSTCMD})
0086     string(REPLACE ";" "#" _post "${_post}")
0087     set(_command ${_command} -DPOST=${_post})
0088   endif()
0089 
0090   #- Handle OUTPUT, ERROR, DEBUG arguments
0091   if(ARG_OUTPUT)
0092     set(_command ${_command} -DOUT=${ARG_OUTPUT})
0093   endif()
0094 
0095   if(ARG_ERROR)
0096     set(_command ${_command} -DERR=${ARG_ERROR})
0097   endif()
0098 
0099   if(ARG_DEBUG)
0100     set(_command ${_command} -DDBG=ON)
0101   endif()
0102 
0103   if(ARG_WORKING_DIRECTORY)
0104     set(_command ${_command} -DCWD=${ARG_WORKING_DIRECTORY})
0105   endif()
0106 
0107   if(ARG_TIMEOUT)
0108     set(_command ${_command} -DTIM=${ARG_TIMEOUT})
0109   endif()
0110 
0111   #- Handle ENVIRONMENT argument
0112   if(ARG_ENVIRONMENT)
0113     string(REPLACE ";" "#" _env "${ARG_ENVIRONMENT}")
0114     string(REPLACE "=" "@" _env "${_env}")
0115     set(_command ${_command} -DENV=${_env})
0116   endif()
0117 
0118   #- Locate the test driver
0119   # This is one of the few cases where we require ..._SOURCE_DIR to be scoped to Geant4
0120   # because we may have called geant4_add_test after a project() call, as in the integration tests
0121   set(_driver ${Geant4_SOURCE_DIR}/cmake/Modules/G4TestDriver.cmake)
0122   if(NOT EXISTS ${_driver})
0123     message(FATAL_ERROR "geant4_add_test: G4TestDriver.cmake not found!")
0124   endif()
0125   set(_command ${_command} -P ${_driver})
0126 
0127   #- Now we can actually add the test
0128   if(_is_build_test)
0129     if(NOT ARG_SOURCE_DIR)
0130       set(ARG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
0131     endif()
0132     if(NOT ARG_BINARY_DIR)
0133       set(ARG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
0134     endif()
0135 
0136     set(__build_test_name "${test}")
0137     set(__run_test_name "")
0138 
0139     if(_is_split_test)
0140       set(__build_test_name "${test}-build")
0141       set(__run_test_name "${test}")
0142     endif()
0143 
0144     if(ARG_BUILD)
0145       set(__build_argument --build-target ${ARG_BUILD})
0146     endif()
0147 
0148     # Build part of the test
0149     # Again, note that we scope Geant4_DIR to Geant4_BINARY_DIR so we don't accidentally pickup
0150     # local or higher scopes
0151     add_test(NAME ${__build_test_name} COMMAND ${CMAKE_CTEST_COMMAND}
0152         --build-and-test  ${ARG_SOURCE_DIR} ${ARG_BINARY_DIR}
0153         --build-generator ${CMAKE_GENERATOR}
0154         --build-makeprogram ${CMAKE_MAKE_PROGRAM}
0155         ${__build_argument}
0156         --build-config $<CONFIGURATION>
0157         --build-noclean
0158         --build-options
0159           --no-warn-unused-cli
0160           -DGeant4_DIR=${Geant4_BINARY_DIR}
0161           -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
0162           -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
0163           -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
0164           -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
0165           -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
0166           -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
0167           -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
0168           -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
0169           -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
0170           -DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL}
0171           -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
0172           -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
0173           -DCMAKE_CXX_FLAGS_FULLRELWITHDEBINFO=${CMAKE_CXX_FLAGS_FULLRELWITHDEBINFO}
0174           -DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}
0175           -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}
0176           -DCMAKE_STATIC_LINKER_FLAGS=${CMAKE_STATIC_LINKER_FLAGS}
0177           -DCMAKE_DISABLE_FIND_PACKAGE_ROOT=$<BOOL:${CMAKE_DISABLE_FIND_PACKAGE_ROOT}>
0178           -DCMAKE_EXPORT_COMPILE_COMMANDS=$<BOOL:${CMAKE_EXPORT_COMPILE_COMMANDS}>
0179     )
0180     if(ARG_ENVIRONMENT)
0181       set_property(TEST ${__build_test_name} PROPERTY ENVIRONMENT ${ARG_ENVIRONMENT})
0182     endif()
0183 
0184     # Build part of the test should have additional regex, and *must* have same labels
0185     if(ARG_FAILREGEX)
0186       set_property(TEST ${__build_test_name} PROPERTY FAIL_REGULAR_EXPRESSION "warning:|(${ARG_FAILREGEX})")
0187     else()
0188       set_property(TEST ${__build_test_name} PROPERTY FAIL_REGULAR_EXPRESSION "warning:")
0189     endif()
0190 
0191     if(ARG_LABELS)
0192       set_property(TEST ${__build_test_name} PROPERTY LABELS ${ARG_LABELS})
0193     else()
0194       set_property(TEST ${__build_test_name} PROPERTY LABELS Nightly)
0195     endif()
0196 
0197     # (Optional) Run part of the test
0198     if(__run_test_name)
0199       add_test(NAME ${__run_test_name} COMMAND ${_command})
0200       set_property(TEST ${__run_test_name} PROPERTY DEPENDS ${__build_test_name})
0201       if(ARG_FAILREGEX)
0202         set_property(TEST ${__run_test_name} PROPERTY FAIL_REGULAR_EXPRESSION ${ARG_FAILREGEX})
0203       endif()
0204 
0205       # If WORKING_DIRECTORY supplied, make sure testdriver is run in
0206       # that directory, otherwise use specific binary dir
0207       if(ARG_WORKING_DIRECTORY)
0208         set_property(TEST ${__run_test_name} PROPERTY WORKING_DIRECTORY "${ARG_WORKING_DIRECTORY}")
0209       else()
0210         set_property(TEST ${__run_test_name} PROPERTY WORKING_DIRECTORY "${ARG_BINARY_DIR}")
0211       endif()
0212     endif()
0213   else()
0214     add_test(NAME ${test} COMMAND ${_command})
0215     if(ARG_FAILREGEX)
0216       set_property(TEST ${test} PROPERTY FAIL_REGULAR_EXPRESSION ${ARG_FAILREGEX})
0217     endif()
0218 
0219     # If WORKING_DIRECTORY supplied, make sure testdriver is run in
0220     # that directory.
0221     if(ARG_WORKING_DIRECTORY)
0222       set_property(TEST ${test} PROPERTY WORKING_DIRECTORY "${ARG_WORKING_DIRECTORY}")
0223     endif()
0224   endif()
0225 
0226   #- Handle TIMOUT and DEPENDS arguments
0227   if(ARG_TIMEOUT)
0228     set_property(TEST ${test} PROPERTY TIMEOUT ${ARG_TIMEOUT})
0229   endif()
0230 
0231   if(ARG_DEPENDS)
0232     # MUST be append because a split test may set this earlier
0233     set_property(TEST ${test} APPEND PROPERTY DEPENDS ${ARG_DEPENDS})
0234   endif()
0235 
0236   if(ARG_PASSREGEX)
0237     set_property(TEST ${test} PROPERTY PASS_REGULAR_EXPRESSION ${ARG_PASSREGEX})
0238   endif()
0239 
0240   if(ARG_LABELS)
0241     set_property(TEST ${test} PROPERTY LABELS ${ARG_LABELS})
0242   else()
0243     set_property(TEST ${test} PROPERTY LABELS Nightly)
0244   endif()
0245 endfunction()
0246