diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-06-26 15:48:26 +0200 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-06-28 13:22:37 +0200 |
commit | 3fb0e917aa688bde6792eac4fa6f210dd6c186f5 (patch) | |
tree | e6834f3d8be4f196997ab47b5c013097d6a9528c /mesonbuild/cmake/interpreter.py | |
parent | b07d3804fc32d1d9ec065107f78c5e5108864bd0 (diff) | |
download | meson-3fb0e917aa688bde6792eac4fa6f210dd6c186f5.zip meson-3fb0e917aa688bde6792eac4fa6f210dd6c186f5.tar.gz meson-3fb0e917aa688bde6792eac4fa6f210dd6c186f5.tar.bz2 |
cmake: Parse trace when configuring CMake
Diffstat (limited to 'mesonbuild/cmake/interpreter.py')
-rw-r--r-- | mesonbuild/cmake/interpreter.py | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index 88700f1..c338b42 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -18,6 +18,7 @@ from .common import CMakeException from .client import CMakeClient, RequestCMakeInputs, RequestConfigure, RequestCompute, RequestCodeModel, CMakeTarget from .executor import CMakeExecutor +from .traceparser import CMakeTraceParser from .. import mlog from ..environment import Environment from ..mesonlib import MachineChoice @@ -25,6 +26,7 @@ from ..mparser import Token, BaseNode, CodeBlockNode, FunctionNode, ArrayNode, A from ..compilers.compilers import lang_suffixes, header_suffixes, obj_suffixes from subprocess import Popen, PIPE, STDOUT from typing import List, Dict, Optional, TYPE_CHECKING +from threading import Thread import os, re if TYPE_CHECKING: @@ -293,11 +295,13 @@ class CMakeInterpreter: # Raw CMake results self.bs_files = [] self.codemodel = None + self.raw_trace = None # Analysed data self.project_name = '' self.languages = [] self.targets = [] + self.trace = CMakeTraceParser() # Generated meson data self.generated_targets = {} @@ -327,6 +331,7 @@ class CMakeInterpreter: cmake_args += ['-DCMAKE_LINKER={}'.format(comp.get_linker_exelist()[0])] cmake_args += ['-G', generator] cmake_args += ['-DCMAKE_INSTALL_PREFIX={}'.format(self.install_prefix)] + cmake_args += ['--trace', '--trace-expand'] cmake_args += extra_cmake_options # Run CMake @@ -338,17 +343,25 @@ class CMakeInterpreter: os.makedirs(self.build_dir, exist_ok=True) os_env = os.environ.copy() os_env['LC_ALL'] = 'C' - proc = Popen(cmake_args + [self.src_dir], stdout=PIPE, stderr=STDOUT, cwd=self.build_dir, env=os_env) + proc = Popen(cmake_args + [self.src_dir], stdout=PIPE, stderr=PIPE, cwd=self.build_dir, env=os_env) - # Print CMake log in realtime - while True: - line = proc.stdout.readline() - if not line: - break - mlog.log(line.decode('utf-8').strip('\n')) + def print_stdout(): + while True: + line = proc.stdout.readline() + if not line: + break + mlog.log(line.decode('utf-8').strip('\n')) + proc.stdout.close() + + t = Thread(target=print_stdout) + t.start() - # Wait for CMake to finish - proc.communicate() + self.raw_trace = proc.stderr.read() + self.raw_trace = self.raw_trace.decode('utf-8') + proc.stderr.close() + proc.wait() + + t.join() mlog.log() h = mlog.green('SUCCEEDED') if proc.returncode == 0 else mlog.red('FAILED') @@ -391,6 +404,10 @@ class CMakeInterpreter: self.project_name = '' self.languages = [] self.targets = [] + self.trace = CMakeTraceParser(permissive=True) + + # Parse the trace + self.trace.parse(self.raw_trace) # Find all targets for i in self.codemodel.configs: |