Guest User

Untitled

a guest
Jul 18th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #coding: utf-8
  3.  
  4. import subprocess
  5. import json
  6. import os
  7.  
  8. class CMakeError(Exception):
  9. pass
  10.  
  11. class CMakeMsgLoadError(CMakeError):
  12. pass
  13.  
  14. class CMakeMsgDumpError(CMakeError):
  15. pass
  16.  
  17. class CMakeMsg:
  18. BEGIN_MARK = '[== "CMake Server" ==['
  19. END_MARK = ']== "CMake Server" ==]'
  20.  
  21. @classmethod
  22. def loads(cls, data):
  23. lpos = data.find(cls.BEGIN_MARK)
  24. if lpos < 0:
  25. raise CMakeMsgLoadError()
  26. lpos += len(cls.BEGIN_MARK)
  27. rpos = data.rfind(cls.END_MARK)
  28. if rpos < 0:
  29. raise CMakeMsgLoadError()
  30. return json.loads(data[lpos:rpos])
  31.  
  32. @classmethod
  33. def dumps(cls, data):
  34. return '%s\n%s\n%s\n'%(cls.BEGIN_MARK, json.dumps(data), cls.END_MARK)
  35.  
  36. @classmethod
  37. def load(cls, fd):
  38. data = ''
  39. while True:
  40. line = fd.readline()
  41. if not line:
  42. raise CMakeMsgLoadError()
  43. data += line
  44. if line.find(cls.END_MARK) >= 0:
  45. break
  46. return cls.loads(data)
  47.  
  48. @classmethod
  49. def dump(cls, data, fd):
  50. data = cls.dumps(data)
  51. fd.write(data)
  52.  
  53. class CMakeServer:
  54. def __init__(self, cmake_command='cmake', version=None):
  55. self.args = (cmake_command, '-E', 'server', '--experimental', '--debug')
  56.  
  57. def start(self):
  58. self.popen = subprocess.Popen(self.args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  59. self.stdin = self.popen.stdin
  60. self.stdout = self.popen.stdout
  61.  
  62. class CMakeClient:
  63. def __init__(self, cmake_server, message_handler=None, progress_handler=None):
  64. self.server = cmake_server
  65. self.message_handler = message_handler or self._message_handler
  66. self.progress_handler = progress_handler or self._progress_handler
  67. self.hello = CMakeMsg.load(self.server.stdout)
  68. versions = self.hello['supportedProtocolVersions']
  69. self.major_version = versions[0]['major']
  70. self.minor_version = versions[0]['minor']
  71.  
  72. @staticmethod
  73. def _message_handler(message):
  74. print '-- ' + message
  75.  
  76. @staticmethod
  77. def _progress_handler(progress, message):
  78. pass
  79.  
  80. def call(self, type, **kw):
  81. data = kw.copy()
  82. data['type'] = type
  83. if type == 'handshake' and 'protocolVersion' not in data:
  84. data['protocolVersion'] = {'major': self.major_version}
  85. CMakeMsg.dump(data, self.server.stdin)
  86. while True:
  87. response = CMakeMsg.load(self.server.stdout)
  88. if response['type'] == 'message':
  89. self.message_handler(response['message'])
  90. elif response['type'] == 'progress':
  91. mininum = response['progressMinimum']
  92. maximum = response['progressMaximum']
  93. cur = (response['progressCurrent'] - mininum) / float(maximum - mininum)
  94. self.progress_handler(cur, response['progressMessage'])
  95. else:
  96. break
  97. if response['type'] == 'error':
  98. raise CMakeError(response['errorMessage'])
  99. return response
  100.  
  101. def handshake(self, sourceDirectory=os.getcwd(), buildDirectory=os.path.abspath('build'), **kw):
  102. return self.call('handshake', sourceDirectory=sourceDirectory, buildDirectory=buildDirectory, **kw)
  103.  
  104. def globalSettings(self):
  105. return self.call('globalSettings')
  106.  
  107. def setGlobalSettings(self, **kw):
  108. return self.call('setGlobalSettings', **kw)
  109.  
  110. def configure(self, cacheArguments=(), **kw):
  111. return self.call('configure', cacheArguments=cacheArguments, **kw)
  112.  
  113. def compute(self):
  114. return self.call('compute')
  115.  
  116. def codemodel(self):
  117. return self.call('codemodel')
  118.  
  119. def cmakeInputs(self):
  120. return self.call('cmakeInputs')
  121.  
  122. def cache(self):
  123. return self.call('cache')
  124.  
  125. def fileSystemWatchers(self):
  126. return self.call('fileSystemWatchers')
  127.  
  128. if __name__ == '__main__':
  129. server = CMakeServer()
  130. server.start()
  131. client = CMakeClient(server)
  132. client.handshake()
  133. client.configure()
  134. client.compute()
Add Comment
Please, Sign In to add comment