Export: Escape exported property values when writing CMake language files
When writing export files, correctly encode property values that contain characters special to the CMake language parser. We must ensure that they parse correctly when loaded on the consuming side. Reported-by: Dan Liew <dan@su-root.co.uk>
This commit is contained in:
parent
d0c0efb5cc
commit
60eb396f10
|
@ -23,11 +23,27 @@
|
|||
#include "cmVersion.h"
|
||||
#include "cmComputeLinkInformation.h"
|
||||
#include "cmAlgorithms.h"
|
||||
#include "cmOutputConverter.h"
|
||||
|
||||
#include <cmsys/auto_ptr.hxx>
|
||||
#include <cmsys/FStream.hxx>
|
||||
#include <assert.h>
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static std::string cmExportFileGeneratorEscape(std::string const& str)
|
||||
{
|
||||
// Escape a property value for writing into a .cmake file.
|
||||
std::string result = cmOutputConverter::EscapeForCMake(str);
|
||||
// Un-escape variable references generated by our own export code.
|
||||
cmSystemTools::ReplaceString(result,
|
||||
"\\${_IMPORT_PREFIX}",
|
||||
"${_IMPORT_PREFIX}");
|
||||
cmSystemTools::ReplaceString(result,
|
||||
"\\${CMAKE_IMPORT_LIBRARY_SUFFIX}",
|
||||
"${CMAKE_IMPORT_LIBRARY_SUFFIX}");
|
||||
return result;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmExportFileGenerator::cmExportFileGenerator()
|
||||
{
|
||||
|
@ -608,7 +624,8 @@ void cmExportFileGenerator::GenerateInterfaceProperties(cmTarget const* target,
|
|||
for(ImportPropertyMap::const_iterator pi = properties.begin();
|
||||
pi != properties.end(); ++pi)
|
||||
{
|
||||
os << " " << pi->first << " \"" << pi->second << "\"\n";
|
||||
os << " " << pi->first << " "
|
||||
<< cmExportFileGeneratorEscape(pi->second) << "\n";
|
||||
}
|
||||
os << ")\n\n";
|
||||
}
|
||||
|
@ -1112,7 +1129,8 @@ cmExportFileGenerator
|
|||
for(ImportPropertyMap::const_iterator pi = properties.begin();
|
||||
pi != properties.end(); ++pi)
|
||||
{
|
||||
os << " " << pi->first << " \"" << pi->second << "\"\n";
|
||||
os << " " << pi->first << " "
|
||||
<< cmExportFileGeneratorEscape(pi->second) << "\n";
|
||||
}
|
||||
os << " )\n"
|
||||
<< "\n";
|
||||
|
@ -1223,7 +1241,7 @@ cmExportFileGenerator
|
|||
ImportPropertyMap::const_iterator pi = properties.find(*li);
|
||||
if (pi != properties.end())
|
||||
{
|
||||
os << "\"" << pi->second << "\" ";
|
||||
os << cmExportFileGeneratorEscape(pi->second) << " ";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,11 @@ install(FILES
|
|||
DESTINATION src
|
||||
)
|
||||
|
||||
add_library(cmakeonly INTERFACE)
|
||||
set_property(TARGET cmakeonly PROPERTY INTERFACE_COMPILE_DEFINITIONS [[DEF="\"\$\B"]])
|
||||
|
||||
install(TARGETS headeronly sharediface use_auto_type use_c_restrict source_target
|
||||
cmakeonly
|
||||
EXPORT expInterface
|
||||
)
|
||||
install(TARGETS sharedlib
|
||||
|
|
|
@ -99,3 +99,14 @@ add_executable(interfacetest_exp interfacetest.cpp)
|
|||
target_link_libraries(interfacetest_exp exp::sharediface)
|
||||
|
||||
do_try_compile(exp)
|
||||
|
||||
foreach(ns exp bld)
|
||||
get_property(defs TARGET ${ns}::cmakeonly PROPERTY INTERFACE_COMPILE_DEFINITIONS)
|
||||
if(NOT defs STREQUAL [[DEF="\"\$\B"]])
|
||||
message(SEND_ERROR
|
||||
"${ns}::cmakeonly property INTERFACE_COMPILE_DEFINITIONS is:\n"
|
||||
" ${defs}\n"
|
||||
"not\n"
|
||||
" " [[DEF="\"\$\B"]] "\n")
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
Loading…
Reference in New Issue