| set(expected_json [=[[ | |
| {"path": "all-languages"}, | |
| {"path": "c-only", "languages": ["C"]}, | |
| {"path": "common"}, | |
| {"path": "cxx-id", "languages": ["CXX"]}, | |
| {"path": "cxx-only", "languages": ["CXX"]}, | |
| {"path": "lang-C", "languages": ["C"]}, | |
| {"path": "lang-CXX", "languages": ["CXX"]}, | |
| {"path": "mixed", "languages": ["C"]}, | |
| {"path": "mixed", "isSystem": true, "languages": ["CXX"]}, | |
| {"path": "system-C", "isSystem": true, "languages": ["C"]}, | |
| {"path": "system-CXX", "isSystem": true, "languages": ["CXX"]}, | |
| {"path": "system-common", "isSystem": true}, | |
| {"path": "system-cxx-id", "isSystem": true, "languages": ["CXX"]} | |
| ]]=]) | |
| file(READ "${RunCMake_TEST_BINARY_DIR}/enabled-languages.txt" enabled_languages) | |
| set(extra_languages ${enabled_languages}) | |
| list(REMOVE_ITEM extra_languages C CXX) | |
| set(non_cxx_languages ${enabled_languages}) | |
| list(REMOVE_ITEM non_cxx_languages CXX) | |
| list(SORT non_cxx_languages) | |
| string(REPLACE ";" "\", \"" non_cxx_languages "${non_cxx_languages}") | |
| foreach(language IN LISTS extra_languages) | |
| string(JSON index LENGTH "${expected_json}") | |
| string(JSON expected_json SET "${expected_json}" ${index} | |
| "{\"path\": \"lang-${language}\", \"languages\": [\"${language}\"]}") | |
| endforeach() | |
| string(JSON expected_count LENGTH "${expected_json}") | |
| math(EXPR last "${expected_count} - 1") | |
| set(expected_entries) | |
| foreach(index RANGE 0 ${last}) | |
| string(JSON entry GET "${expected_json}" ${index}) | |
| string(JSON path GET "${entry}" path) | |
| if(path STREQUAL "all-languages" AND extra_languages) | |
| string(JSON entry SET "${entry}" languages "[\"C\", \"CXX\"]") | |
| elseif(path STREQUAL "mixed") | |
| string(JSON is_system ERROR_VARIABLE error GET "${entry}" isSystem) | |
| if(error) | |
| string(JSON entry SET "${entry}" languages "[\"${non_cxx_languages}\"]") | |
| endif() | |
| endif() | |
| string(JSON expected_json SET "${expected_json}" ${index} "${entry}") | |
| list(APPEND expected_entries "${entry}") | |
| endforeach() | |
| foreach(target IN ITEMS concrete headers imported) | |
| file(GLOB replies "${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply/target-${target}-*.json") | |
| if(NOT replies) | |
| set(RunCMake_TEST_FAILED | |
| "No File API reply for ${target} in ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply\nEnabled languages: ${enabled_languages}") | |
| return() | |
| endif() | |
| validate_json_schema("${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api/schema_target.json" "${replies}") | |
| foreach(reply IN LISTS replies) | |
| file(READ "${reply}" contents) | |
| string(JSON actual_json ERROR_VARIABLE json_error GET "${contents}" interfaceIncludes) | |
| if(json_error) | |
| set(actual_json "Unable to read interfaceIncludes: ${json_error}") | |
| endif() | |
| set(diagnostics | |
| "Enabled languages: ${enabled_languages}\nExpected interfaceIncludes (paths relative to ${RunCMake_TEST_BINARY_DIR}/include):\n${expected_json}\nActual interfaceIncludes:\n${actual_json}") | |
| string(JSON count ERROR_VARIABLE error LENGTH "${contents}" interfaceIncludes) | |
| if(error OR NOT count EQUAL expected_count) | |
| set(RunCMake_TEST_FAILED "Expected ${expected_count} interface include entries in ${reply}, got ${count}\n${diagnostics}") | |
| return() | |
| endif() | |
| set(remaining_entries "${expected_entries}") | |
| foreach(index RANGE 0 ${last}) | |
| string(JSON path GET "${contents}" interfaceIncludes ${index} path) | |
| cmake_path(GET path FILENAME dir) | |
| if(NOT path STREQUAL "${RunCMake_TEST_BINARY_DIR}/include/${dir}") | |
| set(RunCMake_TEST_FAILED "Unexpected interface include path at index ${index} in ${reply}: ${path}\n${diagnostics}") | |
| return() | |
| endif() | |
| string(JSON entry GET "${contents}" interfaceIncludes ${index}) | |
| string(JSON entry SET "${entry}" path "\"${dir}\"") | |
| list(FIND remaining_entries "${entry}" match) | |
| if(match EQUAL -1) | |
| set(RunCMake_TEST_FAILED "Unexpected or duplicate interface include entry at index ${index} in ${reply}:\n${entry}\n${diagnostics}") | |
| return() | |
| endif() | |
| list(REMOVE_AT remaining_entries ${match}) | |
| endforeach() | |
| endforeach() | |
| endforeach() |