summaryrefslogtreecommitdiff
path: root/Source/cmTargetPrecompileHeadersCommand.cxx
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@gmail.com>2019-09-19 23:56:31 +0200
committerBrad King <brad.king@kitware.com>2019-09-23 11:13:13 -0400
commitacb9511044a230126289c1e99cfed134c3be3c52 (patch)
tree4beb957a681b2baa9095c4f18f0254fbb29555d9 /Source/cmTargetPrecompileHeadersCommand.cxx
parentebb9346490741ddc2ce6f552bc1be57dfc730cfa (diff)
downloadcmake-acb9511044a230126289c1e99cfed134c3be3c52.tar.gz
Precompile headers: Treat headers as relative to current source directory
Teach `target_precompile_headers` to treat relative paths the same way as `target_sources`. Fixes: #19733
Diffstat (limited to 'Source/cmTargetPrecompileHeadersCommand.cxx')
-rw-r--r--Source/cmTargetPrecompileHeadersCommand.cxx41
1 files changed, 40 insertions, 1 deletions
diff --git a/Source/cmTargetPrecompileHeadersCommand.cxx b/Source/cmTargetPrecompileHeadersCommand.cxx
index 97f1bea5fb..5751fffa19 100644
--- a/Source/cmTargetPrecompileHeadersCommand.cxx
+++ b/Source/cmTargetPrecompileHeadersCommand.cxx
@@ -2,17 +2,29 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmTargetPrecompileHeadersCommand.h"
+#include "cmGeneratorExpression.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmStringAlgorithms.h"
+#include "cmSystemTools.h"
#include "cmTarget.h"
+#include <utility>
+
bool cmTargetPrecompileHeadersCommand::InitialPass(
std::vector<std::string> const& args, cmExecutionStatus&)
{
return this->HandleArguments(args, "PRECOMPILE_HEADERS", PROCESS_REUSE_FROM);
}
+void cmTargetPrecompileHeadersCommand::HandleInterfaceContent(
+ cmTarget* tgt, const std::vector<std::string>& content, bool prepend,
+ bool system)
+{
+ cmTargetPropCommandBase::HandleInterfaceContent(
+ tgt, ConvertToAbsoluteContent(tgt, content, true), prepend, system);
+}
+
void cmTargetPrecompileHeadersCommand::HandleMissingTarget(
const std::string& name)
{
@@ -31,6 +43,33 @@ std::string cmTargetPrecompileHeadersCommand::Join(
bool cmTargetPrecompileHeadersCommand::HandleDirectContent(
cmTarget* tgt, const std::vector<std::string>& content, bool, bool)
{
- tgt->AppendProperty("PRECOMPILE_HEADERS", this->Join(content).c_str());
+ tgt->AppendProperty(
+ "PRECOMPILE_HEADERS",
+ this->Join(ConvertToAbsoluteContent(tgt, content, false)).c_str());
return true;
}
+
+std::vector<std::string>
+cmTargetPrecompileHeadersCommand::ConvertToAbsoluteContent(
+ cmTarget* /*tgt*/, const std::vector<std::string>& content,
+ bool /*isInterfaceContent*/)
+{
+ std::vector<std::string> absoluteContent;
+ absoluteContent.reserve(content.size());
+ for (std::string const& src : content) {
+ std::string absoluteSrc;
+ // Use '<foo.h>' and '"foo.h"' includes and absolute paths as-is.
+ // Interpret relative paths with respect to the source directory.
+ // If the path starts in a generator expression, assume it is absolute.
+ if (cmHasLiteralPrefix(src, "<") || cmHasLiteralPrefix(src, "\"") ||
+ cmSystemTools::FileIsFullPath(src) ||
+ cmGeneratorExpression::Find(src) == 0) {
+ absoluteSrc = src;
+ } else {
+ absoluteSrc =
+ cmStrCat(this->Makefile->GetCurrentSourceDirectory(), '/', src);
+ }
+ absoluteContent.emplace_back(std::move(absoluteSrc));
+ }
+ return absoluteContent;
+}