aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/cmake/interpreter.py37
-rw-r--r--mesonbuild/interpreter.py11
2 files changed, 29 insertions, 19 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)
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 6d268c6..6df7ae1 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -2546,10 +2546,9 @@ external dependencies (including libraries) must go to "dependencies".''')
def do_subproject_cmake(self, dirname, subdir, subdir_abs, default_options, required, kwargs):
with mlog.nested():
- build_dir = os.path.join(self.environment.get_scratch_dir(), 'cmake_subp_{}'.format(dirname))
new_build = self.build.copy()
prefix = self.coredata.builtins['prefix'].value
- cm_int = CMakeInterpreter(new_build, subdir, subdir_abs, build_dir, prefix, new_build.environment, self.backend)
+ cm_int = CMakeInterpreter(new_build, subdir, subdir_abs, prefix, new_build.environment, self.backend)
cm_int.initialise()
cm_int.analyse()
@@ -2562,15 +2561,15 @@ external dependencies (including libraries) must go to "dependencies".''')
mlog.log()
# Debug print the generated meson file
- mlog.debug('=== BEGIN meson.build ===')
+ mlog.log('=== BEGIN meson.build ===')
from .ast import AstIndentationGenerator, AstPrinter
printer = AstPrinter()
ast.accept(AstIndentationGenerator())
ast.accept(printer)
printer.post_process()
- mlog.debug(printer.result)
- mlog.debug('=== END meson.build ===')
- mlog.debug()
+ mlog.log(printer.result)
+ mlog.log('=== END meson.build ===')
+ mlog.log()
result = self.do_subproject_meson(dirname, subdir, default_options, required, kwargs, ast, cm_int.bs_files)