aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cmake/interpreter.py
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2019-02-23 17:05:11 +0100
committerDaniel Mensinger <daniel@mensinger-ka.de>2019-06-06 18:27:03 +0200
commitd114d8446eac10ad27f4b09c02e0049890a4b2a0 (patch)
tree434666f4b4d087d88d108406b11b92690a6e3b0b /mesonbuild/cmake/interpreter.py
parent1041c71eb0370041492055fff5c7a2bffd306b58 (diff)
downloadmeson-d114d8446eac10ad27f4b09c02e0049890a4b2a0.zip
meson-d114d8446eac10ad27f4b09c02e0049890a4b2a0.tar.gz
meson-d114d8446eac10ad27f4b09c02e0049890a4b2a0.tar.bz2
cmake: Minor fixes
Diffstat (limited to 'mesonbuild/cmake/interpreter.py')
-rw-r--r--mesonbuild/cmake/interpreter.py37
1 files changed, 24 insertions, 13 deletions
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py
index 7073e94..1962e06 100644
--- a/mesonbuild/cmake/interpreter.py
+++ b/mesonbuild/cmake/interpreter.py
@@ -53,10 +53,13 @@ CMAKE_TGT_TYPE_MAP = {
'OBJECT_LIBRARY': 'static_library',
}
+CMAKE_TGT_SKIP = ['UTILITY']
+
class ConverterTarget:
lang_cmake_to_meson = {val.lower(): key for key, val in CMAKE_LANGUAGE_MAP.items()}
- def __init__(self, target: CMakeTarget):
+ def __init__(self, target: CMakeTarget, env: Environment):
+ self.env = env
self.artifacts = target.artifacts
self.src_dir = target.src_dir
self.build_dir = target.build_dir
@@ -110,7 +113,7 @@ class ConverterTarget:
std_regex = re.compile(r'([-]{1,2}std=|/std:v?)(.*)')
- def postprocess(self, output_target_map: dict, root_src_dir: str, install_prefix: str) -> None:
+ def postprocess(self, output_target_map: dict, root_src_dir: str, subdir: str, install_prefix: str) -> None:
# Detect setting the C and C++ standard
for i in ['c', 'cpp']:
if not i in self.compile_opts:
@@ -134,9 +137,11 @@ class ConverterTarget:
# Let meson handle this arcane magic
if ',-rpath,' in i:
continue
- if i in output_target_map:
- self.link_with += [output_target_map[i]]
- continue
+ if not os.path.isabs(i):
+ basename = os.path.basename(i)
+ if basename in output_target_map:
+ self.link_with += [output_target_map[basename]]
+ continue
temp += [i]
self.link_libraries = temp
@@ -147,11 +152,14 @@ class ConverterTarget:
x = os.path.normpath(os.path.join(self.src_dir, x))
if os.path.isabs(x) and os.path.commonpath([x, root_src_dir]) == root_src_dir:
return os.path.relpath(x, root_src_dir)
+ if os.path.isabs(x) and os.path.commonpath([x, self.env.get_build_dir()]) == self.env.get_build_dir():
+ return os.path.relpath(x, os.path.join(self.env.get_build_dir(), subdir))
return x
- self.includes = [rel_path(x) for x in set(self.includes + [self.build_dir])]
- self.sources = [rel_path(x) for x in self.sources]
- self.generated = [rel_path(x) for x in self.generated]
+ build_dir_rel = os.path.relpath(self.build_dir, os.path.join(self.env.get_build_dir(), subdir))
+ self.includes = list(set([rel_path(x) for x in set(self.includes)] + [build_dir_rel]))
+ self.sources = [rel_path(x) for x in self.sources if not x.endswith('.rule')]
+ self.generated = [rel_path(x) for x in self.generated if not x.endswith('.rule')]
# Make sure '.' is always in the include directories
if '.' not in self.includes:
@@ -197,12 +205,13 @@ class ConverterTarget:
mlog.log(' -', key, '=', mlog.bold(str(val)))
class CMakeInterpreter:
- def __init__(self, build: Build, subdir: str, src_dir: str, build_dir: str, install_prefix: str, env: Environment, backend: Backend):
+ def __init__(self, build: Build, subdir: str, src_dir: str, install_prefix: str, env: Environment, backend: Backend):
assert(hasattr(backend, 'name'))
self.build = build
self.subdir = subdir
self.src_dir = src_dir
- self.build_dir = build_dir
+ self.build_dir_rel = os.path.join(subdir, '__CMake_build')
+ self.build_dir = os.path.join(env.get_build_dir(), self.build_dir_rel)
self.install_prefix = install_prefix
self.env = env
self.backend_name = backend.name
@@ -308,14 +317,15 @@ class CMakeInterpreter:
if not self.project_name:
self.project_name = j.name
for k in j.targets:
- self.targets += [ConverterTarget(k)]
+ if k.type not in CMAKE_TGT_SKIP:
+ self.targets += [ConverterTarget(k, self.env)]
output_target_map = {x.full_name: x for x in self.targets}
object_libs = []
# First pass: Basic target cleanup
for i in self.targets:
- i.postprocess(output_target_map, self.src_dir, self.install_prefix)
+ i.postprocess(output_target_map, self.src_dir, self.subdir, self.install_prefix)
if i.type == 'OBJECT_LIBRARY':
object_libs += [i]
self.languages += [x for x in i.languages if x not in self.languages]
@@ -401,7 +411,8 @@ class CMakeInterpreter:
raise CMakeException('Unknown target type "{}"'.format(tgt.type))
# Determine the variable names
- base_name = tgt.name
+ base_name = str(tgt.name)
+ base_name = base_name.replace('-', '_')
inc_var = '{}_inc'.format(base_name)
src_var = '{}_src'.format(base_name)
dep_var = '{}_dep'.format(base_name)