diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-04-19 10:26:15 +0200 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-06-06 18:27:04 +0200 |
commit | 1f3a57598e344eacaff1052403bd48ab9dd57ed5 (patch) | |
tree | daf19b91f120d19031e4750252e22a77bdb8d46e /mesonbuild | |
parent | 5c603a900b004458a9a6816cb663316954c51a74 (diff) | |
download | meson-1f3a57598e344eacaff1052403bd48ab9dd57ed5.zip meson-1f3a57598e344eacaff1052403bd48ab9dd57ed5.tar.gz meson-1f3a57598e344eacaff1052403bd48ab9dd57ed5.tar.bz2 |
cmake: general windows and old CMake fixes
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/cmake/client.py | 18 | ||||
-rw-r--r-- | mesonbuild/cmake/interpreter.py | 28 |
2 files changed, 36 insertions, 10 deletions
diff --git a/mesonbuild/cmake/client.py b/mesonbuild/cmake/client.py index ae572f9..4375eb9 100644 --- a/mesonbuild/cmake/client.py +++ b/mesonbuild/cmake/client.py @@ -23,6 +23,7 @@ from contextlib import contextmanager from subprocess import Popen, PIPE, TimeoutExpired from typing import List, Optional import json +import os CMAKE_SERVER_BEGIN_STR = '[== "CMake Server" ==[' CMAKE_SERVER_END_STR = ']== "CMake Server" ==]' @@ -134,10 +135,15 @@ class RequestHandShake(RequestBase): vers = {'major': self.vers_major} if self.vers_minor is not None: vers['minor'] = self.vers_minor + + # Old CMake versions (3.7) want '/' even on Windows + src_list = os.path.normpath(self.src_dir).split(os.sep) + bld_list = os.path.normpath(self.build_dir).split(os.sep) + return { **super().to_dict(), - 'sourceDirectory': self.src_dir, - 'buildDirectory': self.build_dir, + 'sourceDirectory': '/'.join(src_list), + 'buildDirectory': '/'.join(bld_list), 'generator': self.generator, 'protocolVersion': vers } @@ -204,19 +210,23 @@ class ReplyCMakeInputs(ReplyBase): mlog.log(str(i)) def _flags_to_list(raw: str) -> List[str]: + # Convert a raw commandline string into a list of strings res = [] curr = '' escape = False in_string = False for i in raw: if escape: + # If the current char is not a quote, the '\' is probably important + if i not in ['"', "'"]: + curr += '\\' curr += i escape = False elif i == '\\': escape = True - elif i == '"' or i == "'": + elif i in ['"', "'"]: in_string = not in_string - elif i == ' ' or i == '\n': + elif i in [' ', '\n']: if in_string: curr += i else: diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index f0a971f..43ddc83 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -22,6 +22,7 @@ from ..build import Build from ..environment import Environment from ..mparser import Token, BaseNode, CodeBlockNode, FunctionNode, ArrayNode, ArgumentNode, AssignmentNode, BooleanNode, StringNode, IdNode, MethodNode from ..backend.backends import Backend +from ..compilers.compilers import obj_suffixes from ..dependencies.base import CMakeDependency, ExternalProgram from subprocess import Popen, PIPE, STDOUT from typing import List @@ -113,7 +114,7 @@ class ConverterTarget: def __repr__(self) -> str: return '<{}: {}>'.format(self.__class__.__name__, self.name) - std_regex = re.compile(r'([-]{1,2}std=|/std:v?)(.*)') + std_regex = re.compile(r'([-]{1,2}std=|/std:v?|[-]{1,2}std:)(.*)') def postprocess(self, output_target_map: dict, root_src_dir: str, subdir: str, install_prefix: str) -> None: # Detect setting the C and C++ standard @@ -133,6 +134,10 @@ class ConverterTarget: self.compile_opts[i] = temp + # Make sure to force enable -fPIC for OBJECT libraries + if self.type.upper() == 'OBJECT_LIBRARY': + self.pie = True + # Fix link libraries temp = [] for i in self.link_libraries: @@ -178,20 +183,26 @@ class ConverterTarget: def process_object_libs(self, obj_target_list: List['ConverterTarget']): # Try to detect the object library(s) from the generated input sources - temp = [os.path.basename(x) for x in self.generated if x.endswith('.o')] - self.generated = [x for x in self.generated if not x.endswith('.o')] + temp = [os.path.basename(x) for x in self.generated] + temp = [x for x in temp if any([x.endswith('.' + y) for y in obj_suffixes])] + temp = [os.path.splitext(x)[0] for x in temp] + # Temp now stores the source filenames of the object files for i in obj_target_list: - out_objects = [os.path.basename(x + '.o') for x in i.sources + i.generated] - for j in out_objects: + source_files = [os.path.basename(x) for x in i.sources + i.generated] + for j in source_files: if j in temp: self.object_libs += [i] break + # Filter out object files from the sources + self.generated = [x for x in self.generated if not any([x.endswith('.' + y) for y in obj_suffixes])] + def meson_func(self) -> str: return target_type_map.get(self.type.upper()) def log(self) -> None: mlog.log('Target', mlog.bold(self.name)) + mlog.log(' -- artifacts: ', mlog.bold(str(self.artifacts))) mlog.log(' -- full_name: ', mlog.bold(self.full_name)) mlog.log(' -- type: ', mlog.bold(self.type)) mlog.log(' -- install: ', mlog.bold('true' if self.install else 'false')) @@ -266,7 +277,9 @@ class CMakeInterpreter: mlog.log(mlog.bold('Running:'), ' '.join(cmake_args)) mlog.log() os.makedirs(self.build_dir, exist_ok=True) - proc = Popen(cmake_args + [self.src_dir], stdout=PIPE, stderr=STDOUT, cwd=self.build_dir) + 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) # Print CMake log in realtime while True: @@ -330,6 +343,9 @@ class CMakeInterpreter: self.targets += [ConverterTarget(k, self.env)] output_target_map = {x.full_name: x for x in self.targets} + for i in self.targets: + for j in i.artifacts: + output_target_map[os.path.basename(j)] = i object_libs = [] # First pass: Basic target cleanup |