aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cmake/interpreter.py
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/interpreter.py
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/interpreter.py')
-rw-r--r--mesonbuild/cmake/interpreter.py28
1 files changed, 22 insertions, 6 deletions
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