ENH: Create CMP0013 to disallow duplicate dirs
In CMake 2.6.3 and below we silently accepted duplicate build directories whose build files would then conflict. At first this was considured purely a bug that confused beginners but would not be used in a real project. In CMake 2.6.4 we explicitly made it an error. However, some real projects took advantage of this as a "feature" and got lucky that the subtle build errors it can cause did not occur. Therefore we need a policy to deal with the case more gracefully. See issue #9173.
This commit is contained in:
parent
f61f8e5383
commit
c790b1fabb
|
@ -1545,17 +1545,8 @@ void cmMakefile::AddSubDirectory(const char* srcPath, const char *binPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure the binary directory is unique.
|
// Make sure the binary directory is unique.
|
||||||
cmGlobalGenerator* gg = this->LocalGenerator->GetGlobalGenerator();
|
if(!this->EnforceUniqueDir(srcPath, binPath))
|
||||||
if(!gg->BinaryDirectoryIsNew(binPath))
|
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
|
||||||
e << "The binary directory\n"
|
|
||||||
<< " " << binPath << "\n"
|
|
||||||
<< "is already used to build another source directory, so it cannot "
|
|
||||||
<< "be used to build source directory\n"
|
|
||||||
<< " " << srcPath << "\n"
|
|
||||||
<< "Specify a unique binary directory name.";
|
|
||||||
this->IssueMessage(cmake::FATAL_ERROR, e.str());
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3719,6 +3710,54 @@ bool cmMakefile::EnforceUniqueName(std::string const& name, std::string& msg,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool cmMakefile::EnforceUniqueDir(const char* srcPath, const char* binPath)
|
||||||
|
{
|
||||||
|
// Make sure the binary directory is unique.
|
||||||
|
cmGlobalGenerator* gg = this->LocalGenerator->GetGlobalGenerator();
|
||||||
|
if(gg->BinaryDirectoryIsNew(binPath))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
cmOStringStream e;
|
||||||
|
switch (this->GetPolicyStatus(cmPolicies::CMP0013))
|
||||||
|
{
|
||||||
|
case cmPolicies::WARN:
|
||||||
|
// Print the warning.
|
||||||
|
e << this->GetPolicies()->GetPolicyWarning(cmPolicies::CMP0013)
|
||||||
|
<< "\n"
|
||||||
|
<< "The binary directory\n"
|
||||||
|
<< " " << binPath << "\n"
|
||||||
|
<< "is already used to build a source directory. "
|
||||||
|
<< "This command uses it to build source directory\n"
|
||||||
|
<< " " << srcPath << "\n"
|
||||||
|
<< "which can generate conflicting build files. "
|
||||||
|
<< "CMake does not support this use case but it used "
|
||||||
|
<< "to work accidentally and is being allowed for "
|
||||||
|
<< "compatibility.";
|
||||||
|
this->IssueMessage(cmake::AUTHOR_WARNING, e.str());
|
||||||
|
case cmPolicies::OLD:
|
||||||
|
// OLD behavior does not warn.
|
||||||
|
return true;
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
e << this->GetPolicies()->GetRequiredPolicyError(cmPolicies::CMP0013)
|
||||||
|
<< "\n";
|
||||||
|
case cmPolicies::NEW:
|
||||||
|
// NEW behavior prints the error.
|
||||||
|
e << "The binary directory\n"
|
||||||
|
<< " " << binPath << "\n"
|
||||||
|
<< "is already used to build a source directory. "
|
||||||
|
<< "It cannot be used to build source directory\n"
|
||||||
|
<< " " << srcPath << "\n"
|
||||||
|
<< "Specify a unique binary directory name.";
|
||||||
|
this->IssueMessage(cmake::FATAL_ERROR, e.str());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmPolicies::PolicyStatus
|
cmPolicies::PolicyStatus
|
||||||
cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id)
|
cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id)
|
||||||
|
|
|
@ -900,6 +900,8 @@ private:
|
||||||
|
|
||||||
bool ParseDefineFlag(std::string const& definition, bool remove);
|
bool ParseDefineFlag(std::string const& definition, bool remove);
|
||||||
|
|
||||||
|
bool EnforceUniqueDir(const char* srcPath, const char* binPath);
|
||||||
|
|
||||||
void ReadSources(std::ifstream& fin, bool t);
|
void ReadSources(std::ifstream& fin, bool t);
|
||||||
friend class cmMakeDepend; // make depend needs direct access
|
friend class cmMakeDepend; // make depend needs direct access
|
||||||
// to the Sources array
|
// to the Sources array
|
||||||
|
|
|
@ -369,6 +369,23 @@ cmPolicies::cmPolicies()
|
||||||
"The NEW behavior for this policy is to treat strings like true as a "
|
"The NEW behavior for this policy is to treat strings like true as a "
|
||||||
"boolean constant.",
|
"boolean constant.",
|
||||||
2,6,5, cmPolicies::WARN);
|
2,6,5, cmPolicies::WARN);
|
||||||
|
|
||||||
|
this->DefinePolicy(
|
||||||
|
CMP0013, "CMP0013",
|
||||||
|
"Duplicate binary directories are not allowed.",
|
||||||
|
"CMake 2.6.3 and below silently permitted add_subdirectory() calls "
|
||||||
|
"to create the same binary directory multiple times. "
|
||||||
|
"During build system generation files would be written and then "
|
||||||
|
"overwritten in the build tree and could lead to strange behavior. "
|
||||||
|
"CMake 2.6.4 and above explicitly detect duplicate binary directories. "
|
||||||
|
"CMake 2.6.4 always considers this case an error. "
|
||||||
|
"In CMake 2.6.5 and above this policy determines whether or not "
|
||||||
|
"the case is an error. "
|
||||||
|
"The OLD behavior for this policy is to allow duplicate binary "
|
||||||
|
"directories. "
|
||||||
|
"The NEW behavior for this policy is to disallow duplicate binary "
|
||||||
|
"directories with an error.",
|
||||||
|
2,6,5, cmPolicies::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::~cmPolicies()
|
cmPolicies::~cmPolicies()
|
||||||
|
|
|
@ -53,6 +53,7 @@ public:
|
||||||
CMP0010, // Bad variable reference syntax is an error
|
CMP0010, // Bad variable reference syntax is an error
|
||||||
CMP0011, // Strong policy scope for include and find_package
|
CMP0011, // Strong policy scope for include and find_package
|
||||||
CMP0012, // Strong handling of boolean constants
|
CMP0012, // Strong handling of boolean constants
|
||||||
|
CMP0013, // Duplicate binary directories not allowed
|
||||||
|
|
||||||
// Always the last entry. Useful mostly to avoid adding a comma
|
// Always the last entry. Useful mostly to avoid adding a comma
|
||||||
// the last policy when adding a new one.
|
// the last policy when adding a new one.
|
||||||
|
|
Loading…
Reference in New Issue