RunCMakeTest.cmake 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. include(RunCMake)
  2. cmake_policy(SET CMP0140 NEW)
  3. # Arguments after the first are the files to validate against the schema
  4. function(validate_fileapi_schema schema)
  5. if(NOT ARGN)
  6. # No files to validate against the schema
  7. return()
  8. endif()
  9. list(JOIN ARGN "\n" file_list)
  10. set(file_list_file ${RunCMake_TEST_BINARY_DIR}/check_file_list.txt)
  11. file(WRITE "${file_list_file}" "${file_list}")
  12. execute_process(
  13. COMMAND ${Python_EXECUTABLE}
  14. "${RunCMake_SOURCE_DIR}/fileapi_validate_schema.py"
  15. "${file_list_file}"
  16. "${schema}"
  17. RESULT_VARIABLE result
  18. OUTPUT_VARIABLE output
  19. ERROR_VARIABLE output
  20. )
  21. if(NOT result STREQUAL 0)
  22. string(REPLACE "\n" "\n " output "${output}")
  23. string(APPEND RunCMake_TEST_FAILED
  24. "Failed to validate files against JSON schema: ${schema}\nOutput:\n${output}\n")
  25. endif()
  26. return(PROPAGATE RunCMake_TEST_FAILED)
  27. endfunction()
  28. # Function called in *-check.cmake scripts to check api files.
  29. function(check_api expect)
  30. file(GLOB_RECURSE actual
  31. LIST_DIRECTORIES TRUE
  32. RELATIVE ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1
  33. ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/*
  34. )
  35. if(NOT "${actual}" MATCHES "${expect}")
  36. set(RunCMake_TEST_FAILED "API files:
  37. ${actual}
  38. do not match what we expected:
  39. ${expect}
  40. in directory:
  41. ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1")
  42. endif()
  43. if(NOT RunCMake_TEST_FAILED AND Python_EXECUTABLE AND CMake_TEST_JSON_SCHEMA)
  44. cmake_path(SET schema_dir NORMALIZE ${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api)
  45. set(prefix ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1)
  46. set(replies ${actual})
  47. list(FILTER replies INCLUDE REGEX "^reply/")
  48. set(schema_types
  49. index # Special case, error replies also use this schema
  50. codemodel
  51. directory
  52. target
  53. configureLog
  54. cache
  55. cmakeFiles
  56. toolchains
  57. )
  58. foreach(schema_type IN LISTS schema_types)
  59. set(schema_type_${schema_type} "")
  60. endforeach()
  61. foreach(file IN LISTS replies)
  62. if(file MATCHES "^reply/(index|error)-")
  63. list(APPEND schema_type_index ${prefix}/${file})
  64. else()
  65. foreach(schema_type IN LISTS schema_types)
  66. if(file MATCHES "^reply/${schema_type}-")
  67. list(APPEND schema_type_${schema_type} ${prefix}/${file})
  68. endif()
  69. endforeach()
  70. endif()
  71. endforeach()
  72. foreach(schema_type IN LISTS schema_types)
  73. validate_fileapi_schema(
  74. ${schema_dir}/schema_${schema_type}.json
  75. ${schema_type_${schema_type}}
  76. )
  77. endforeach()
  78. endif()
  79. return(PROPAGATE RunCMake_TEST_FAILED)
  80. endfunction()
  81. function(check_stateful_queries)
  82. if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE OR NOT CMake_TEST_JSON_SCHEMA)
  83. return()
  84. endif()
  85. cmake_path(SET schema_dir NORMALIZE
  86. ${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api
  87. )
  88. set(prefix ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query/client)
  89. list(TRANSFORM ARGN
  90. REPLACE "^(.+)$" "${prefix}-\\1/query.json"
  91. OUTPUT_VARIABLE query_json_files
  92. )
  93. validate_fileapi_schema(
  94. ${schema_dir}/schema_stateful_query.json
  95. ${query_json_files}
  96. )
  97. return(PROPAGATE RunCMake_TEST_FAILED)
  98. endfunction()
  99. function(check_python case prefix)
  100. if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE)
  101. return()
  102. endif()
  103. file(GLOB index ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply/${prefix}-*.json)
  104. execute_process(
  105. COMMAND ${Python_EXECUTABLE} "${RunCMake_SOURCE_DIR}/${case}-check.py"
  106. --build-dir "${RunCMake_TEST_BINARY_DIR}"
  107. --reply-index "${index}"
  108. --cxx-compiler-id "${CMAKE_CXX_COMPILER_ID}"
  109. RESULT_VARIABLE result
  110. OUTPUT_VARIABLE output
  111. ERROR_VARIABLE output
  112. )
  113. if(NOT result EQUAL 0)
  114. string(REPLACE "\n" "\n " output " ${output}")
  115. set(RunCMake_TEST_FAILED "Unexpected index:\n${output}" PARENT_SCOPE)
  116. endif()
  117. endfunction()
  118. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  119. set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release\\;MinSizeRel\\;RelWithDebInfo")
  120. endif()
  121. if(JsonCpp_VERSION AND JsonCpp_VERSION VERSION_LESS 1.7.5)
  122. set(ENV{CMake_JSONCPP_PRE_1_7_5} 1)
  123. endif()
  124. run_cmake(Nothing)
  125. run_cmake(Empty)
  126. run_cmake(EmptyClient)
  127. run_cmake(Stale)
  128. run_cmake(SharedStateless)
  129. run_cmake(ClientStateless)
  130. run_cmake(MixedStateless)
  131. run_cmake(DuplicateStateless)
  132. run_cmake(ClientStateful)
  133. run_cmake(ProjectQueryGood)
  134. run_cmake(ProjectQueryBad)
  135. run_cmake(FailConfigure)
  136. function(run_object object)
  137. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${object}-build)
  138. list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0118=NEW)
  139. run_cmake(${object})
  140. list(POP_BACK RunCMake_TEST_OPTIONS)
  141. set(RunCMake_TEST_NO_CLEAN 1)
  142. run_cmake_command(${object}-SharedStateless ${CMAKE_COMMAND} .)
  143. run_cmake_command(${object}-ClientStateless ${CMAKE_COMMAND} .)
  144. run_cmake_command(${object}-ClientStateful ${CMAKE_COMMAND} .)
  145. run_cmake_command(${object}-FailConfigure ${CMAKE_COMMAND} . -DFAIL=1)
  146. endfunction()
  147. run_object(codemodel-v2)
  148. run_object(configureLog-v1)
  149. run_object(cache-v2)
  150. run_object(cmakeFiles-v1)
  151. run_object(toolchains-v1)