77import xml .etree .ElementTree as ET
88
99import argunparse
10+ import version_query
1011
11- from ..general import Parser
12+ from ..general import ExternalTool , Parser
13+ from ..general .exc import ExternalToolVersionError
1214from ..general .tools import run_tool
1315
1416_LOG = logging .getLogger (__name__ )
1517
16- CASTXML_PATH = pathlib .Path ('castxml' )
18+
19+ class CastXml (ExternalTool ):
20+ """Define how to execute CastXML tool.
21+
22+ https://github.com/CastXML/CastXML
23+ """
24+
25+ path = pathlib .Path ('castxml' )
26+ _version_arg = '--version'
27+
28+ @classmethod
29+ def _version_output_filter (cls , output : str ) -> str :
30+ for output_line in output .splitlines ():
31+ if output_line .startswith ('castxml version ' ):
32+ return output_line .replace ('castxml version ' , '' )
33+ raise ExternalToolVersionError (f'could not extract version from output: { output } ' )
34+
35+
36+ CastXml .assert_exists ()
37+ CastXml .assert_version_at_least (version_query .Version (0 , 4 ))
1738
1839
1940def run_castxml (input_path : pathlib .Path , output_path : pathlib .Path , gcc : bool = False ):
@@ -29,7 +50,7 @@ def run_castxml(input_path: pathlib.Path, output_path: pathlib.Path, gcc: bool =
2950 elif platform .system () == 'Darwin' :
3051 kwargs ['castxml-cc-gnu' ] = 'clang++'
3152 kwargs ['o' ] = str (output_path )
32- return run_tool (CASTXML_PATH , args , kwargs ,
53+ return run_tool (CastXml . path , args , kwargs ,
3354 argunparser = argunparse .ArgumentUnparser (opt_value = ' ' ))
3455
3556
0 commit comments