diff options
| author | Nicolas Werner <nicolas.werner@hotmail.de> | 2023-12-09 23:13:01 +0100 |
|---|---|---|
| committer | Eli Schwartz <eschwartz93@gmail.com> | 2023-12-12 20:14:26 -0500 |
| commit | ebf5757c59d9bceb953dc531c757e07dcf83c081 (patch) | |
| tree | b8456264dfb8f3a75f476343d0bd6a398677ccec /mesonbuild/cmake | |
| parent | f6f46173c48196f99f1daaf21affba0f44aef962 (diff) | |
| download | meson-ebf5757c59d9bceb953dc531c757e07dcf83c081.tar.gz | |
cmake: parse project version
This properly sets the project version in projects meson generates from
cmake projects. This allows dependency fallbacks to properly check the
version constraints in dependency calls when falling back to a cmake
subproject. Before this would fail, because the project version was
undefined.
Diffstat (limited to 'mesonbuild/cmake')
| -rw-r--r-- | mesonbuild/cmake/fileapi.py | 13 | ||||
| -rw-r--r-- | mesonbuild/cmake/interpreter.py | 7 |
2 files changed, 18 insertions, 2 deletions
diff --git a/mesonbuild/cmake/fileapi.py b/mesonbuild/cmake/fileapi.py index baf499fc0..c82c51fc0 100644 --- a/mesonbuild/cmake/fileapi.py +++ b/mesonbuild/cmake/fileapi.py @@ -30,8 +30,10 @@ class CMakeFileAPI: self.reply_dir = self.api_base_dir / 'reply' self.cmake_sources: T.List[CMakeBuildFile] = [] self.cmake_configurations: T.List[CMakeConfiguration] = [] + self.project_version = '' self.kind_resolver_map = { 'codemodel': self._parse_codemodel, + 'cache': self._parse_cache, 'cmakeFiles': self._parse_cmakeFiles, } @@ -41,12 +43,16 @@ class CMakeFileAPI: def get_cmake_configurations(self) -> T.List[CMakeConfiguration]: return self.cmake_configurations + def get_project_version(self) -> str: + return self.project_version + def setup_request(self) -> None: self.request_dir.mkdir(parents=True, exist_ok=True) query = { 'requests': [ {'kind': 'codemodel', 'version': {'major': 2, 'minor': 0}}, + {'kind': 'cache', 'version': {'major': 2, 'minor': 0}}, {'kind': 'cmakeFiles', 'version': {'major': 1, 'minor': 0}}, ] } @@ -279,6 +285,13 @@ class CMakeFileAPI: path = path if path.is_absolute() else src_dir / path self.cmake_sources += [CMakeBuildFile(path, i.get('isCMake', False), i.get('isGenerated', False))] + def _parse_cache(self, data: T.Dict[str, T.Any]) -> None: + assert 'entries' in data + + for e in data['entries']: + if e['name'] == 'CMAKE_PROJECT_VERSION': + self.project_version = e['value'] + def _strip_data(self, data: T.Any) -> T.Any: if isinstance(data, list): for idx, i in enumerate(data): diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index 8e9ea187e..20348b5f6 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -784,6 +784,7 @@ class CMakeInterpreter: # Analysed data self.project_name = '' + self.project_version = '' self.languages: T.List[str] = [] self.targets: T.List[ConverterTarget] = [] self.custom_targets: T.List[ConverterCustomTarget] = [] @@ -875,6 +876,8 @@ class CMakeInterpreter: # Load the codemodel configurations self.codemodel_configs = self.fileapi.get_cmake_configurations() + self.project_version = self.fileapi.get_project_version() + def analyse(self) -> None: if self.codemodel_configs is None: raise CMakeException('CMakeInterpreter was not initialized') @@ -949,7 +952,7 @@ class CMakeInterpreter: for tgt in self.targets: tgt.cleanup_dependencies() - mlog.log('CMake project', mlog.bold(self.project_name), 'has', mlog.bold(str(len(self.targets) + len(self.custom_targets))), 'build targets.') + mlog.log('CMake project', mlog.bold(self.project_name), mlog.bold(self.project_version), 'has', mlog.bold(str(len(self.targets) + len(self.custom_targets))), 'build targets.') def pretend_to_be_meson(self, options: TargetOptions) -> CodeBlockNode: if not self.project_name: @@ -1023,7 +1026,7 @@ class CMakeInterpreter: # Generate the root code block and the project function call root_cb = CodeBlockNode(token()) - root_cb.lines += [function('project', [self.project_name] + self.languages)] + root_cb.lines += [function('project', [self.project_name] + self.languages, {'version': self.project_version} if self.project_version else None)] # Add the run script for custom commands |
