summaryrefslogtreecommitdiffstats
path: root/Source/cmExportFileGenerator.cxx
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2014-03-31 15:37:02 (GMT)
committerStephen Kelly <steveire@gmail.com>2014-04-09 08:38:49 (GMT)
commit783bce295b98640ebcd56a4a6ca9f673992bcaa7 (patch)
tree04d27e1fa71737b5cf140f307fde7466dd38c1f5 /Source/cmExportFileGenerator.cxx
parentc869984ea013f99c3104abaf17d553b08c4b17c2 (diff)
downloadCMake-783bce295b98640ebcd56a4a6ca9f673992bcaa7.zip
CMake-783bce295b98640ebcd56a4a6ca9f673992bcaa7.tar.gz
CMake-783bce295b98640ebcd56a4a6ca9f673992bcaa7.tar.bz2
Export: Disallow exported interface includes in src/build tree (#14592).
Allow directories in the source tree or build tree only if the install tree is a subdirectory of the source tree or build tree, as appropriate. Re-use the test files in the RunCMake.include_directories test to run in multiple scenarios. Bump the required CMake version in the test to 3.0 to ensure that the new policy warnings are emitted correctly.
Diffstat (limited to 'Source/cmExportFileGenerator.cxx')
-rw-r--r--Source/cmExportFileGenerator.cxx38
1 files changed, 37 insertions, 1 deletions
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index b38c48b..42fce6d 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -279,7 +279,43 @@ static bool checkInterfaceDirs(const std::string &prepro,
}
if (isSubDirectory(li->c_str(), installDir))
{
- continue;
+ // The include directory is inside the install tree. If the
+ // install tree is not inside the source tree or build tree then
+ // fall through to the checks below that the include directory is not
+ // also inside the source tree or build tree.
+ bool shouldContinue =
+ isSubDirectory(installDir, topBinaryDir)
+ || isSubDirectory(installDir, topSourceDir);
+
+ if (!shouldContinue)
+ {
+ switch(target->GetPolicyStatusCMP0052())
+ {
+ case cmPolicies::WARN:
+ {
+ cmOStringStream s;
+ s << target->GetMakefile()->GetPolicies()
+ ->GetPolicyWarning(cmPolicies::CMP0052) << "\n";
+ s << "Directory:\n \"" << *li << "\"\nin "
+ "INTERFACE_INCLUDE_DIRECTORIES of target \""
+ << target->GetName() << "\" is a subdirectory of the install "
+ "directory:\n \"" << installDir << "\"";
+ target->GetMakefile()->IssueMessage(cmake::AUTHOR_WARNING,
+ s.str());
+ }
+ case cmPolicies::OLD:
+ shouldContinue = true;
+ break;
+ case cmPolicies::REQUIRED_ALWAYS:
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::NEW:
+ break;
+ }
+ }
+ if (shouldContinue)
+ {
+ continue;
+ }
}
if (isSubDirectory(li->c_str(), topBinaryDir))
{