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:
Brad King 2015-06-23 10:54:23 -04:00
parent d0c0efb5cc
commit 60eb396f10
3 changed files with 36 additions and 3 deletions

View File

@ -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) << " ";
}
}

View File

@ -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

View File

@ -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()