include(RunCMake) cmake_policy(SET CMP0140 NEW) # Arguments after the first are the files to validate against the schema function(validate_fileapi_schema schema) if(NOT ARGN) # No files to validate against the schema return() endif() list(JOIN ARGN "\n" file_list) set(file_list_file ${RunCMake_TEST_BINARY_DIR}/check_file_list.txt) file(WRITE "${file_list_file}" "${file_list}") execute_process( COMMAND ${Python_EXECUTABLE} "${RunCMake_SOURCE_DIR}/fileapi_validate_schema.py" "${file_list_file}" "${schema}" RESULT_VARIABLE result OUTPUT_VARIABLE output ERROR_VARIABLE output ) if(NOT result STREQUAL 0) string(REPLACE "\n" "\n " output "${output}") string(APPEND RunCMake_TEST_FAILED "Failed to validate files against JSON schema: ${schema}\nOutput:\n${output}\n") endif() return(PROPAGATE RunCMake_TEST_FAILED) endfunction() # Function called in *-check.cmake scripts to check api files. function(check_api expect) file(GLOB_RECURSE actual LIST_DIRECTORIES TRUE RELATIVE ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1 ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/* ) if(NOT "${actual}" MATCHES "${expect}") set(RunCMake_TEST_FAILED "API files: ${actual} do not match what we expected: ${expect} in directory: ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1") endif() if(NOT RunCMake_TEST_FAILED AND Python_EXECUTABLE AND CMake_TEST_JSON_SCHEMA) cmake_path(SET schema_dir NORMALIZE ${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api) set(prefix ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1) set(replies ${actual}) list(FILTER replies INCLUDE REGEX "^reply/") set(schema_types index # Special case, error replies also use this schema codemodel directory target configureLog cache cmakeFiles toolchains ) foreach(schema_type IN LISTS schema_types) set(schema_type_${schema_type} "") endforeach() foreach(file IN LISTS replies) if(file MATCHES "^reply/(index|error)-") list(APPEND schema_type_index ${prefix}/${file}) else() foreach(schema_type IN LISTS schema_types) if(file MATCHES "^reply/${schema_type}-") list(APPEND schema_type_${schema_type} ${prefix}/${file}) endif() endforeach() endif() endforeach() foreach(schema_type IN LISTS schema_types) validate_fileapi_schema( ${schema_dir}/schema_${schema_type}.json ${schema_type_${schema_type}} ) endforeach() endif() return(PROPAGATE RunCMake_TEST_FAILED) endfunction() function(check_stateful_queries) if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE OR NOT CMake_TEST_JSON_SCHEMA) return() endif() cmake_path(SET schema_dir NORMALIZE ${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api ) set(prefix ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query/client) list(TRANSFORM ARGN REPLACE "^(.+)$" "${prefix}-\\1/query.json" OUTPUT_VARIABLE query_json_files ) validate_fileapi_schema( ${schema_dir}/schema_stateful_query.json ${query_json_files} ) return(PROPAGATE RunCMake_TEST_FAILED) endfunction() function(check_python case prefix) if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE) return() endif() file(GLOB index ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply/${prefix}-*.json) execute_process( COMMAND ${Python_EXECUTABLE} "${RunCMake_SOURCE_DIR}/${case}-check.py" "${index}" "${CMAKE_CXX_COMPILER_ID}" "${RunCMake_TEST_BINARY_DIR}" RESULT_VARIABLE result OUTPUT_VARIABLE output ERROR_VARIABLE output ) if(NOT result EQUAL 0) string(REPLACE "\n" "\n " output " ${output}") set(RunCMake_TEST_FAILED "Unexpected index:\n${output}" PARENT_SCOPE) endif() endfunction() if(RunCMake_GENERATOR_IS_MULTI_CONFIG) set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release\\;MinSizeRel\\;RelWithDebInfo") endif() if(JsonCpp_VERSION_STRING AND JsonCpp_VERSION_STRING VERSION_LESS 1.7.5) set(ENV{CMake_JSONCPP_PRE_1_7_5} 1) endif() run_cmake(Nothing) run_cmake(Empty) run_cmake(EmptyClient) run_cmake(Stale) run_cmake(SharedStateless) run_cmake(ClientStateless) run_cmake(MixedStateless) run_cmake(DuplicateStateless) run_cmake(ClientStateful) run_cmake(ProjectQueryGood) run_cmake(ProjectQueryBad) run_cmake(FailConfigure) function(run_object object) set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${object}-build) list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0118=NEW) run_cmake(${object}) list(POP_BACK RunCMake_TEST_OPTIONS) set(RunCMake_TEST_NO_CLEAN 1) run_cmake_command(${object}-SharedStateless ${CMAKE_COMMAND} .) run_cmake_command(${object}-ClientStateless ${CMAKE_COMMAND} .) run_cmake_command(${object}-ClientStateful ${CMAKE_COMMAND} .) run_cmake_command(${object}-FailConfigure ${CMAKE_COMMAND} . -DFAIL=1) endfunction() run_object(codemodel-v2) run_object(configureLog-v1) run_object(cache-v2) run_object(cmakeFiles-v1) run_object(toolchains-v1)