toolchains-v1-check.py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from check_index import *
  2. import os
  3. class ExpectedVar(object):
  4. def __init__(self, name, omitEmpty=False):
  5. self.name = name
  6. self.omitEmpty = omitEmpty
  7. class ExpectedList(object):
  8. def __init__(self, name, omitEmpty=False):
  9. self.name = name
  10. self.omitEmpty = omitEmpty
  11. EXPECTED_TOOLCHAIN = {
  12. "language": "CXX",
  13. "compiler": {
  14. "path": ExpectedVar("CMAKE_CXX_COMPILER"),
  15. "commandFragment": ExpectedVar("CMAKE_CXX_COMPILER_ARG1", omitEmpty=True),
  16. "id": ExpectedVar("CMAKE_CXX_COMPILER_ID"),
  17. "version": ExpectedVar("CMAKE_CXX_COMPILER_VERSION"),
  18. "target": ExpectedVar("CMAKE_CXX_COMPILER_TARGET"),
  19. "implicit": {
  20. "includeDirectories": \
  21. ExpectedList("CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES"),
  22. "linkDirectories": \
  23. ExpectedList("CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES"),
  24. "linkFrameworkDirectories": \
  25. ExpectedList(
  26. "CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES"),
  27. "linkLibraries": \
  28. ExpectedList("CMAKE_CXX_IMPLICIT_LINK_LIBRARIES"),
  29. }
  30. },
  31. "sourceFileExtensions": \
  32. ExpectedList("CMAKE_CXX_SOURCE_FILE_EXTENSIONS"),
  33. }
  34. def check_objects(o):
  35. assert is_list(o)
  36. assert len(o) == 1
  37. check_index_object(o[0], "toolchains", 1, 1, check_object_toolchains)
  38. def check_object_toolchains(o):
  39. assert sorted(o.keys()) == ["kind", "toolchains", "version"]
  40. # The "kind" and "version" members are handled by check_index_object.
  41. toolchains = o["toolchains"]
  42. assert is_list(toolchains)
  43. # Other platform-specific toolchains may exist (like RC on Windows).
  44. has_cxx_toolchain = False
  45. for toolchain in toolchains:
  46. assert is_dict(toolchain)
  47. assert "language" in toolchain
  48. if toolchain["language"] == "CXX":
  49. check_object_toolchain(toolchain, EXPECTED_TOOLCHAIN)
  50. has_cxx_toolchain = True
  51. assert has_cxx_toolchain
  52. def check_object_toolchain(o, expected):
  53. expected_keys = [
  54. key for (key, value) in expected.items()
  55. if is_string(value) or is_dict(value)
  56. or (type(value) in (ExpectedVar, ExpectedList)
  57. and variables[value.name]["defined"]
  58. and not (value.omitEmpty and variables[value.name]["value"] == ''))]
  59. assert sorted(o.keys()) == sorted(expected_keys), "actual object {!r}, expected keys {!r}".format(o, sorted(expected_keys))
  60. for key in expected_keys:
  61. value = expected[key]
  62. if is_string(value):
  63. assert o[key] == value, "{!r}: actual {!r}, expected {!r}".format(key, o[key], value)
  64. elif is_dict(value):
  65. check_object_toolchain(o[key], value)
  66. elif type(value) == ExpectedVar:
  67. assert o[key] == variables[value.name]["value"], "{!r}: actual {!r}, expected {!r} (from {})".format(key, o[key], variables[value.name]["value"], value.name)
  68. elif type(value) == ExpectedList:
  69. expected_items = filter(
  70. None, variables[value.name]["value"].split(";"))
  71. check_list_match(lambda a, b: a == b, o[key], expected_items)
  72. else:
  73. assert False
  74. with open(os.path.join(args.build_dir, "toolchain_variables.json")) as f:
  75. variables = json.load(f)
  76. assert is_dict(variables)
  77. if variables.get("TOOLCHAINSV1_COMPILERARGS", 0) == 1:
  78. del EXPECTED_TOOLCHAIN["compiler"]["commandFragment"]
  79. elif variables.get("TOOLCHAINSV1_COMPILERARGS", 0) == 2:
  80. EXPECTED_TOOLCHAIN["compiler"]["commandFragment"] = "--hello world --something=other"
  81. assert is_dict(index)
  82. assert sorted(index.keys()) == ["cmake", "objects", "reply"]
  83. check_objects(index["objects"])