summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2020-01-31 10:22:07 +0100
committerJussi Pakkanen <jpakkane@gmail.com>2020-02-04 00:39:04 +0200
commit1f7e73fd5cd7b85d4c7d179c9299e13189b8556d (patch)
tree805500690a680e6cd30bb8463a3867d7f53698d9
parent97dd5224768bbd6003dbad76ee37967b17711ecd (diff)
downloadmeson-1f7e73fd5cd7b85d4c7d179c9299e13189b8556d.tar.gz
cmake: Sanitize CMake names (fixes #6554)
-rw-r--r--mesonbuild/cmake/interpreter.py22
-rw-r--r--test cases/cmake/1 basic/meson.build6
-rw-r--r--test cases/cmake/1 basic/subprojects/cmMod/CMakeLists.txt4
-rw-r--r--test cases/cmake/1 basic/subprojects/cmMod/cmMod.hpp15
4 files changed, 23 insertions, 24 deletions
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py
index 2aa0c0191..81844a0ca 100644
--- a/mesonbuild/cmake/interpreter.py
+++ b/mesonbuild/cmake/interpreter.py
@@ -125,10 +125,13 @@ blacklist_link_libs = [
'advapi32.lib'
]
-generated_target_name_prefix = 'cm_'
-
transfer_dependencies_from = ['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)
+ return 'cm_' + name
+
class OutputTargetMap:
rm_so_version = re.compile(r'(\.[0-9]+)+$')
@@ -234,8 +237,7 @@ class ConverterTarget:
self.override_options = []
# Convert the target name to a valid meson target name
- self.name = self.name.replace('-', '_')
- self.name = generated_target_name_prefix + self.name
+ self.name = _sanitize_cmake_name(self.name)
for i in target.files:
# Determine the meson language
@@ -593,8 +595,7 @@ class ConverterCustomTarget:
self.depends = []
# Convert the target name to a valid meson target name
- self.name = self.name.replace('-', '_')
- self.name = generated_target_name_prefix + self.name
+ self.name = _sanitize_cmake_name(self.name)
def __repr__(self) -> str:
return '<{}: {} {}>'.format(self.__class__.__name__, self.name, self.outputs)
@@ -1192,6 +1193,7 @@ class CMakeInterpreter:
root_cb.lines += [assign(tgt_var, function('custom_target', [tgt.name], tgt_kwargs))]
processed[tgt.name] = {'inc': None, 'src': None, 'dep': None, 'tgt': tgt_var, 'func': 'custom_target'}
+ name_map[tgt.cmake_name] = tgt.name
# Now generate the target function calls
for i in self.custom_targets:
@@ -1208,7 +1210,7 @@ class CMakeInterpreter:
def target_info(self, target: str) -> T.Optional[T.Dict[str, str]]:
# Try resolving the target name
# start by checking if there is a 100% match (excluding the name prefix)
- prx_tgt = generated_target_name_prefix + target
+ prx_tgt = _sanitize_cmake_name(target)
if prx_tgt in self.generated_targets:
return self.generated_targets[prx_tgt]
# check if there exists a name mapping
@@ -1219,11 +1221,7 @@ class CMakeInterpreter:
return None
def target_list(self) -> T.List[str]:
- prx_str = generated_target_name_prefix
- prx_len = len(prx_str)
- res = [x for x in self.generated_targets.keys()]
- res = [x[prx_len:] if x.startswith(prx_str) else x for x in res]
- return res
+ return list(self.internal_name_map.keys())
def _object_lib_workaround(self) -> bool:
return 'link' in self.linkers and self.backend_name.startswith('vs')
diff --git a/test cases/cmake/1 basic/meson.build b/test cases/cmake/1 basic/meson.build
index a23063d24..8e1671a33 100644
--- a/test cases/cmake/1 basic/meson.build
+++ b/test cases/cmake/1 basic/meson.build
@@ -3,10 +3,10 @@ project('cmakeSubTest', ['c', 'cpp'])
cm = import('cmake')
sub_pro = cm.subproject('cmMod')
-sub_dep = sub_pro.dependency('cmModLib')
+sub_dep = sub_pro.dependency('cmModLib++')
-assert(sub_pro.target_list() == ['cmModLib'], 'There should be exactly one target')
-assert(sub_pro.target_type('cmModLib') == 'shared_library', 'Target type should be shared_library')
+assert(sub_pro.target_list() == ['cmModLib++'], 'There should be exactly one target')
+assert(sub_pro.target_type('cmModLib++') == 'shared_library', 'Target type should be shared_library')
exe1 = executable('main', ['main.cpp'], dependencies: [sub_dep])
test('test1', exe1)
diff --git a/test cases/cmake/1 basic/subprojects/cmMod/CMakeLists.txt b/test cases/cmake/1 basic/subprojects/cmMod/CMakeLists.txt
index 8b2f7e968..9798209b0 100644
--- a/test cases/cmake/1 basic/subprojects/cmMod/CMakeLists.txt
+++ b/test cases/cmake/1 basic/subprojects/cmMod/CMakeLists.txt
@@ -7,6 +7,6 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_definitions("-DDO_NOTHING_JUST_A_FLAG=1")
-add_library(cmModLib SHARED cmMod.cpp)
+add_library(cmModLib++ SHARED cmMod.cpp)
include(GenerateExportHeader)
-generate_export_header(cmModLib)
+generate_export_header(cmModLib++)
diff --git a/test cases/cmake/1 basic/subprojects/cmMod/cmMod.hpp b/test cases/cmake/1 basic/subprojects/cmMod/cmMod.hpp
index 52f576bf3..0e6dc0484 100644
--- a/test cases/cmake/1 basic/subprojects/cmMod/cmMod.hpp
+++ b/test cases/cmake/1 basic/subprojects/cmMod/cmMod.hpp
@@ -1,13 +1,14 @@
#pragma once
+#include "cmmodlib++_export.h"
#include <string>
-#include "cmmodlib_export.h"
-class CMMODLIB_EXPORT cmModClass {
- private:
- std::string str;
- public:
- cmModClass(std::string foo);
+class CMMODLIB___EXPORT cmModClass {
+private:
+ std::string str;
- std::string getStr() const;
+public:
+ cmModClass(std::string foo);
+
+ std::string getStr() const;
};