aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cmake
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2019-07-11 19:05:49 +0200
committerDaniel Mensinger <daniel@mensinger-ka.de>2019-07-25 17:41:14 +0200
commit30c301a48cab11ab0f5c90911d829f9ef34196cc (patch)
treebe8e1a1dc1c09e93d8c3ef565cff691fea173d8c /mesonbuild/cmake
parent50bbeaf8593a7c37851062ccec1ce90b906301ac (diff)
downloadmeson-30c301a48cab11ab0f5c90911d829f9ef34196cc.zip
meson-30c301a48cab11ab0f5c90911d829f9ef34196cc.tar.gz
meson-30c301a48cab11ab0f5c90911d829f9ef34196cc.tar.bz2
cmake: handle interface libraries
Diffstat (limited to 'mesonbuild/cmake')
-rw-r--r--mesonbuild/cmake/interpreter.py44
1 files changed, 37 insertions, 7 deletions
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py
index 28a8488..5687ad2 100644
--- a/mesonbuild/cmake/interpreter.py
+++ b/mesonbuild/cmake/interpreter.py
@@ -74,8 +74,11 @@ target_type_map = {
'SHARED_LIBRARY': 'shared_library',
'EXECUTABLE': 'executable',
'OBJECT_LIBRARY': 'static_library',
+ 'INTERFACE_LIBRARY': 'header_only'
}
+target_type_requires_trace = ['INTERFACE_LIBRARY']
+
skip_targets = ['UTILITY']
blacklist_compiler_flags = [
@@ -138,6 +141,7 @@ class ConverterTarget:
self.link_with = []
self.object_libs = []
self.compile_opts = {}
+ self.public_compile_opts = []
self.pie = False
# Project default override options (c_std, cpp_std, etc.)
@@ -170,7 +174,7 @@ class ConverterTarget:
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:
+ def postprocess(self, output_target_map: dict, root_src_dir: str, subdir: str, install_prefix: str, trace: CMakeTraceParser) -> None:
# Detect setting the C and C++ standard
for i in ['c', 'cpp']:
if i not in self.compile_opts:
@@ -194,6 +198,18 @@ class ConverterTarget:
if self.type.upper() == 'OBJECT_LIBRARY':
self.pie = True
+ # Use the CMake trace, if required
+ if self.type.upper() in target_type_requires_trace:
+ if self.name in trace.targets:
+ props = trace.targets[self.name].properies
+
+ self.includes += props.get('INTERFACE_INCLUDE_DIRECTORIES', [])
+ self.public_compile_opts += props.get('INTERFACE_COMPILE_DEFINITIONS', [])
+ self.public_compile_opts += props.get('INTERFACE_COMPILE_OPTIONS', [])
+ self.link_flags += props.get('INTERFACE_LINK_OPTIONS', [])
+ else:
+ mlog.warning('CMake: Target', mlog.bold(self.name), 'not found in CMake trace. This can lead to build errors')
+
# Fix link libraries
temp = []
for i in self.link_libraries:
@@ -584,7 +600,7 @@ class CMakeInterpreter:
for i in self.custom_targets:
i.postprocess(output_target_map, self.src_dir, self.subdir, self.build_dir)
for i in self.targets:
- i.postprocess(output_target_map, self.src_dir, self.subdir, self.install_prefix)
+ i.postprocess(output_target_map, self.src_dir, self.subdir, self.install_prefix, self.trace)
if i.type == 'OBJECT_LIBRARY':
object_libs += [i]
self.languages += [x for x in i.languages if x not in self.languages]
@@ -762,17 +778,31 @@ class CMakeInterpreter:
dep_kwargs = {
'link_args': tgt.link_flags + tgt.link_libraries,
'link_with': id_node(tgt_var),
+ 'compile_args': tgt.public_compile_opts,
'include_directories': id_node(inc_var),
}
# Generate the function nodes
- inc_node = assign(inc_var, function('include_directories', tgt.includes))
- src_node = assign(src_var, function('files', sources))
- tgt_node = assign(tgt_var, function(tgt_func, [base_name, [id_node(src_var)] + generated], tgt_kwargs))
- dep_node = assign(dep_var, function('declare_dependency', kwargs=dep_kwargs))
+ node_list = []
+ if tgt_func == 'header_only':
+ del dep_kwargs['link_with']
+ inc_node = assign(inc_var, function('include_directories', tgt.includes))
+ dep_node = assign(dep_var, function('declare_dependency', kwargs=dep_kwargs))
+
+ node_list = [inc_node, dep_node]
+ src_var = ''
+ tgt_var = ''
+
+ else:
+ inc_node = assign(inc_var, function('include_directories', tgt.includes))
+ src_node = assign(src_var, function('files', sources))
+ tgt_node = assign(tgt_var, function(tgt_func, [base_name, [id_node(src_var)] + generated], tgt_kwargs))
+ dep_node = assign(dep_var, function('declare_dependency', kwargs=dep_kwargs))
+
+ node_list = [inc_node, src_node, tgt_node, dep_node]
# Add the nodes to the ast
- root_cb.lines += [inc_node, src_node, tgt_node, dep_node]
+ root_cb.lines += node_list
processed[tgt.name] = {'inc': inc_var, 'src': src_var, 'dep': dep_var, 'tgt': tgt_var, 'func': tgt_func}
def process_custom_target(tgt: ConverterCustomTarget) -> None: