Skip to content

Commit 946d1e7

Browse files
authored
fixing CMakeConfigDeps escaping (#19034)
1 parent a4926c5 commit 946d1e7

3 files changed

Lines changed: 13 additions & 16 deletions

File tree

conan/tools/cmake/cmakedeps/templates/target_data.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from conan.tools.cmake.cmakedeps.templates import CMakeDepsFileTemplate
77
from conan.errors import ConanException
88
from conan.internal.api.install.generators import relativize_path
9+
from conan.tools.cmake.utils import cmake_escape_value
910

1011
"""
1112
@@ -296,15 +297,12 @@ def join_paths(paths):
296297

297298
def join_flags(separator, values):
298299
# Flags have to be escaped
299-
ret = separator.join(v.replace('\\', '\\\\').replace('$', '\\$').replace('"', '\\"')
300-
for v in values)
300+
ret = separator.join(cmake_escape_value(v) for v in values)
301301
return ret
302302

303303
def join_defines(values, prefix=""):
304304
# Defines have to be escaped, included spaces
305-
return "\n\t\t\t".join('"%s%s"' % (prefix, v.replace('\\', '\\\\').replace('$', '\\$').
306-
replace('"', '\\"'))
307-
for v in values)
305+
return "\n\t\t\t".join('"%s%s"' % (prefix, cmake_escape_value(v)) for v in values)
308306

309307
self.include_paths = join_paths(cpp_info.includedirs)
310308
self.lib_paths = join_paths(cpp_info.libdirs)

conan/tools/cmake/cmakedeps2/target_configuration.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from conan.internal.api.install.generators import relativize_path
99
from conan.internal.model.pkg_type import PackageType
1010
from conan.internal.graph.graph import CONTEXT_BUILD, CONTEXT_HOST
11+
from conan.tools.cmake.utils import cmake_escape_value
1112

1213

1314
class TargetConfigurationTemplate2:
@@ -181,8 +182,7 @@ def _get_cmake_lib(self, info, components, pkg_folder, pkg_folder_var):
181182
for i in info.includedirs) if info.includedirs else ""
182183
requires = self._requires(info, components)
183184
assert isinstance(requires, dict)
184-
defines = " ".join(info.defines)
185-
# TODO: Missing escaping?
185+
defines = " ".join(cmake_escape_value(f) for f in info.defines)
186186
# FIXME: Filter by lib traits!!!!!
187187
if not self._require.headers: # If not depending on headers, paths and
188188
includedirs = defines = None
@@ -191,10 +191,10 @@ def _get_cmake_lib(self, info, components, pkg_folder, pkg_folder_var):
191191
"includedirs": includedirs,
192192
"defines": defines,
193193
"requires": requires,
194-
"cxxflags": " ".join(info.cxxflags),
195-
"cflags": " ".join(info.cflags),
196-
"sharedlinkflags": " ".join(info.sharedlinkflags),
197-
"exelinkflags": " ".join(info.exelinkflags),
194+
"cxxflags": " ".join(cmake_escape_value(f) for f in info.cxxflags),
195+
"cflags": " ".join(cmake_escape_value(f) for f in info.cflags),
196+
"sharedlinkflags": " ".join(cmake_escape_value(v) for v in info.sharedlinkflags),
197+
"exelinkflags": " ".join(cmake_escape_value(v) for v in info.exelinkflags),
198198
"system_libs": " ".join(info.system_libs),
199199
"sources": " ".join(sources)
200200
}
@@ -306,11 +306,6 @@ def escape(p_):
306306
return escape(p)
307307
return f"${{{pkg_folder_var}}}/{escape(p)}"
308308

309-
@staticmethod
310-
def _escape_cmake_string(values):
311-
return " ".join(v.replace("\\", "\\\\").replace('$', '\\$').replace('"', '\\"')
312-
for v in values)
313-
314309
@property
315310
def _template(self):
316311
# TODO: CMake 3.24: Apple Frameworks: https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#genex:LINK_LIBRARY

conan/tools/cmake/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,7 @@ def parse_extra_variable(source, key, value):
3939
return var_value
4040
raise ConanException(f'{source} "{key}" has invalid type. Allowed types: str, int, float, dict,'
4141
f' got {type(value)}')
42+
43+
44+
def cmake_escape_value(v):
45+
return v.replace('\\', '\\\\').replace('$', '\\$').replace('"', '\\"')

0 commit comments

Comments
 (0)