aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cmake
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2019-04-19 10:26:15 +0200
committerDaniel Mensinger <daniel@mensinger-ka.de>2019-06-06 18:27:04 +0200
commit1f3a57598e344eacaff1052403bd48ab9dd57ed5 (patch)
treedaf19b91f120d19031e4750252e22a77bdb8d46e /mesonbuild/cmake
parent5c603a900b004458a9a6816cb663316954c51a74 (diff)
downloadmeson-1f3a57598e344eacaff1052403bd48ab9dd57ed5.zip
meson-1f3a57598e344eacaff1052403bd48ab9dd57ed5.tar.gz
meson-1f3a57598e344eacaff1052403bd48ab9dd57ed5.tar.bz2
cmake: general windows and old CMake fixes
Diffstat (limited to 'mesonbuild/cmake')
-rw-r--r--mesonbuild/cmake/client.py18
-rw-r--r--mesonbuild/cmake/interpreter.py28
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