aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cmake
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2019-06-26 15:48:26 +0200
committerDaniel Mensinger <daniel@mensinger-ka.de>2019-06-28 13:22:37 +0200
commit3fb0e917aa688bde6792eac4fa6f210dd6c186f5 (patch)
treee6834f3d8be4f196997ab47b5c013097d6a9528c /mesonbuild/cmake
parentb07d3804fc32d1d9ec065107f78c5e5108864bd0 (diff)
downloadmeson-3fb0e917aa688bde6792eac4fa6f210dd6c186f5.zip
meson-3fb0e917aa688bde6792eac4fa6f210dd6c186f5.tar.gz
meson-3fb0e917aa688bde6792eac4fa6f210dd6c186f5.tar.bz2
cmake: Parse trace when configuring CMake
Diffstat (limited to 'mesonbuild/cmake')
-rw-r--r--mesonbuild/cmake/interpreter.py35
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: