aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/cmake')
-rw-r--r--mesonbuild/cmake/common.py1
-rw-r--r--mesonbuild/cmake/interpreter.py31
-rw-r--r--mesonbuild/cmake/toolchain.py9
-rw-r--r--mesonbuild/cmake/tracetargets.py10
4 files changed, 43 insertions, 8 deletions
diff --git a/mesonbuild/cmake/common.py b/mesonbuild/cmake/common.py
index 7644c0b..b7ab1ba 100644
--- a/mesonbuild/cmake/common.py
+++ b/mesonbuild/cmake/common.py
@@ -19,6 +19,7 @@ language_map = {
'cuda': 'CUDA',
'objc': 'OBJC',
'objcpp': 'OBJCXX',
+ 'nasm': 'ASM_NASM',
'cs': 'CSharp',
'java': 'Java',
'fortran': 'Fortran',
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py
index 9296276..1019246 100644
--- a/mesonbuild/cmake/interpreter.py
+++ b/mesonbuild/cmake/interpreter.py
@@ -125,7 +125,7 @@ TRANSFER_DEPENDENCIES_FROM: T.Collection[str] = ['header_only']
_cmake_name_regex = re.compile(r'[^_a-zA-Z0-9]')
def _sanitize_cmake_name(name: str) -> str:
name = _cmake_name_regex.sub('_', name)
- if name in FORBIDDEN_TARGET_NAMES or name.startswith('meson'):
+ if name in FORBIDDEN_TARGET_NAMES or name.startswith('meson') or name[0].isdigit():
name = 'cm_' + name
return name
@@ -223,6 +223,7 @@ class ConverterTarget:
self.install = target.install
self.install_dir: T.Optional[Path] = None
self.link_libraries = target.link_libraries
+ self.link_targets: T.List[str] = []
self.link_flags = target.link_flags + target.link_lang_flags
self.public_link_flags: T.List[str] = []
self.depends_raw: T.List[str] = []
@@ -242,6 +243,8 @@ class ConverterTarget:
self.compile_opts: T.Dict[str, T.List[str]] = {}
self.public_compile_opts: T.List[str] = []
self.pie = False
+ self.version: T.Optional[str] = None
+ self.soversion: T.Optional[str] = None
# Project default override options (c_std, cpp_std, etc.)
self.override_options: T.List[str] = []
@@ -356,6 +359,8 @@ class ConverterTarget:
tgt = trace.targets.get(self.cmake_name)
if tgt:
self.depends_raw = trace.targets[self.cmake_name].depends
+ self.version = trace.targets[self.cmake_name].properties.get('VERSION', [None])[0]
+ self.soversion = trace.targets[self.cmake_name].properties.get('SOVERSION', [None])[0]
rtgt = resolve_cmake_trace_targets(self.cmake_name, trace, self.env, clib_compiler=self.clib_compiler)
self.includes += [Path(x) for x in rtgt.include_directories]
@@ -363,6 +368,8 @@ class ConverterTarget:
self.public_link_flags += rtgt.public_link_flags
self.public_compile_opts += rtgt.public_compile_opts
self.link_libraries += rtgt.libraries
+ self.depends_raw += rtgt.target_dependencies
+ self.link_targets += rtgt.target_dependencies
elif self.type.upper() not in ['EXECUTABLE', 'OBJECT_LIBRARY']:
mlog.warning('CMake: Target', mlog.bold(self.cmake_name), 'not found in CMake trace. This can lead to build errors')
@@ -957,17 +964,27 @@ class CMakeInterpreter:
object_libs += [tgt]
self.languages += [x for x in tgt.languages if x not in self.languages]
- # Second pass: Detect object library dependencies
+ # Second pass: Populate link_with project internal targets
+ for tgt in self.targets:
+ for i in tgt.link_targets:
+ # Handle target-based link libraries
+ link_with = self.output_target_map.target(i)
+ if not link_with or isinstance(link_with, ConverterCustomTarget):
+ # Generated file etc.
+ continue
+ tgt.link_with.append(link_with)
+
+ # Third pass: Detect object library dependencies
for tgt in self.targets:
tgt.process_object_libs(object_libs, self._object_lib_workaround)
- # Third pass: Reassign dependencies to avoid some loops
+ # Fourth pass: Reassign dependencies to avoid some loops
for tgt in self.targets:
tgt.process_inter_target_dependencies()
for ctgt in self.custom_targets:
ctgt.process_inter_target_dependencies()
- # Fourth pass: Remove rassigned dependencies
+ # Fifth pass: Remove reassigned dependencies
for tgt in self.targets:
tgt.cleanup_dependencies()
@@ -1159,6 +1176,12 @@ class CMakeInterpreter:
'objects': [method(x, 'extract_all_objects') for x in objec_libs],
}
+ # Only set version if we know it
+ if tgt.version:
+ tgt_kwargs['version'] = tgt.version
+ if tgt.soversion:
+ tgt_kwargs['soversion'] = tgt.soversion
+
# Only set if installed and only override if it is set
if install_tgt and tgt.install_dir:
tgt_kwargs['install_dir'] = tgt.install_dir
diff --git a/mesonbuild/cmake/toolchain.py b/mesonbuild/cmake/toolchain.py
index d410886..11a00be 100644
--- a/mesonbuild/cmake/toolchain.py
+++ b/mesonbuild/cmake/toolchain.py
@@ -175,7 +175,12 @@ class CMakeToolchain:
# Set the compiler variables
for lang, comp_obj in self.compilers.items():
- prefix = 'CMAKE_{}_'.format(language_map.get(lang, lang.upper()))
+ language = language_map.get(lang, None)
+
+ if not language:
+ continue # unsupported language
+
+ prefix = 'CMAKE_{}_'.format(language)
exe_list = comp_obj.get_exelist()
if not exe_list:
@@ -211,7 +216,7 @@ class CMakeToolchain:
# Generate the CMakeLists.txt
mlog.debug('CMake Toolchain: Calling CMake once to generate the compiler state')
languages = list(self.compilers.keys())
- lang_ids = [language_map.get(x, x.upper()) for x in languages]
+ lang_ids = [language_map.get(x) for x in languages if x in language_map]
cmake_content = dedent(f'''
cmake_minimum_required(VERSION 3.10)
project(CompInfo {' '.join(lang_ids)})
diff --git a/mesonbuild/cmake/tracetargets.py b/mesonbuild/cmake/tracetargets.py
index 2cc0c17..2b2b93d 100644
--- a/mesonbuild/cmake/tracetargets.py
+++ b/mesonbuild/cmake/tracetargets.py
@@ -45,6 +45,7 @@ class ResolvedTarget:
self.public_link_flags: T.List[str] = []
self.public_compile_opts: T.List[str] = []
self.libraries: T.List[str] = []
+ self.target_dependencies: T.List[str] = []
def resolve_cmake_trace_targets(target_name: str,
trace: 'CMakeTraceParser',
@@ -86,6 +87,7 @@ def resolve_cmake_trace_targets(target_name: str,
curr_path = Path(*path_to_framework)
framework_path = curr_path.parent
framework_name = curr_path.stem
+ res.public_compile_opts += [f"-F{framework_path}"]
res.libraries += [f'-F{framework_path}', '-framework', framework_name]
else:
res.libraries += [curr]
@@ -144,9 +146,13 @@ def resolve_cmake_trace_targets(target_name: str,
targets += [x for x in tgt.properties['IMPORTED_LOCATION'] if x]
if 'LINK_LIBRARIES' in tgt.properties:
- targets += [x for x in tgt.properties['LINK_LIBRARIES'] if x]
+ link_libraries = [x for x in tgt.properties['LINK_LIBRARIES'] if x]
+ targets += link_libraries
+ res.target_dependencies += link_libraries
if 'INTERFACE_LINK_LIBRARIES' in tgt.properties:
- targets += [x for x in tgt.properties['INTERFACE_LINK_LIBRARIES'] if x]
+ link_libraries = [x for x in tgt.properties['INTERFACE_LINK_LIBRARIES'] if x]
+ targets += link_libraries
+ res.target_dependencies += link_libraries
if f'IMPORTED_LINK_DEPENDENT_LIBRARIES_{cfg}' in tgt.properties:
targets += [x for x in tgt.properties[f'IMPORTED_LINK_DEPENDENT_LIBRARIES_{cfg}'] if x]