1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 10:47:59 +08:00

Autogen: Read skip files from makefile

This allows to pass SKIP_AUTOMOC hints to the
FOO_autogen target from files that are not listed
in the target sources.

The problem was that if main.cpp was listed in the source
but not main.h, then SKIP_AUTOMOC for main.h was ignored.
This commit is contained in:
Sebastian Holtermann
2017-08-22 14:52:52 +02:00
parent 1eb1b409c2
commit 727247c316

View File

@@ -194,6 +194,13 @@ static void AddDefinitionEscaped(cmMakefile* makefile, const char* key,
key, cmOutputConverter::EscapeForCMake(cmJoin(values, ";")).c_str());
}
static void AddDefinitionEscaped(cmMakefile* makefile, const char* key,
const std::set<std::string>& values)
{
makefile->AddDefinition(
key, cmOutputConverter::EscapeForCMake(cmJoin(values, ";")).c_str());
}
static bool AddToSourceGroup(cmMakefile* makefile, const std::string& fileName,
cmQtAutoGeneratorCommon::GeneratorType genType)
{
@@ -275,8 +282,8 @@ struct AutogenSetup
std::vector<std::string> sources;
std::vector<std::string> headers;
std::vector<std::string> mocSkip;
std::vector<std::string> uicSkip;
std::set<std::string> mocSkip;
std::set<std::string> uicSkip;
std::map<std::string, std::string> configSuffix;
std::map<std::string, std::string> configMocIncludes;
@@ -289,9 +296,40 @@ static void SetupAcquireScanFiles(cmGeneratorTarget const* target,
const std::vector<cmSourceFile*>& srcFiles,
AutogenSetup& setup)
{
// Read skip files from makefile sources
{
const std::vector<cmSourceFile*>& allSources =
target->Makefile->GetSourceFiles();
for (std::vector<cmSourceFile*>::const_iterator fit = allSources.begin();
fit != allSources.end(); ++fit) {
cmSourceFile* sf = *fit;
// sf->GetExtension() is only valid after sf->GetFullPath() ...
const std::string& fPath = sf->GetFullPath();
const cmSystemTools::FileFormat fileType =
cmSystemTools::GetFileFormat(sf->GetExtension().c_str());
if (!(fileType == cmSystemTools::CXX_FILE_FORMAT) &&
!(fileType == cmSystemTools::HEADER_FILE_FORMAT)) {
continue;
}
const bool skipAll = sf->GetPropertyAsBool("SKIP_AUTOGEN");
const bool mocSkip =
mocEnabled && (skipAll || sf->GetPropertyAsBool("SKIP_AUTOMOC"));
const bool uicSkip =
uicEnabled && (skipAll || sf->GetPropertyAsBool("SKIP_AUTOUIC"));
if (mocSkip || uicSkip) {
const std::string absFile = cmsys::SystemTools::GetRealPath(fPath);
if (mocSkip) {
setup.mocSkip.insert(absFile);
}
if (uicSkip) {
setup.uicSkip.insert(absFile);
}
}
}
}
const cmPolicies::PolicyStatus CMP0071_status =
target->Makefile->GetPolicyStatus(cmPolicies::CMP0071);
for (std::vector<cmSourceFile*>::const_iterator fileIt = srcFiles.begin();
fileIt != srcFiles.end(); ++fileIt) {
cmSourceFile* sf = *fileIt;
@@ -305,14 +343,15 @@ static void SetupAcquireScanFiles(cmGeneratorTarget const* target,
}
// Real file path
const std::string absFile = cmsys::SystemTools::GetRealPath(fPath);
// Skip flags
const bool skipAll = sf->GetPropertyAsBool("SKIP_AUTOGEN");
const bool mocSkip = skipAll || sf->GetPropertyAsBool("SKIP_AUTOMOC");
const bool uicSkip = skipAll || sf->GetPropertyAsBool("SKIP_AUTOUIC");
const bool accept = (mocEnabled && !mocSkip) || (uicEnabled && !uicSkip);
// Skip test
const bool mocSkip = !mocEnabled || (setup.mocSkip.count(absFile) != 0);
const bool uicSkip = !uicEnabled || (setup.uicSkip.count(absFile) != 0);
if (mocSkip && uicSkip) {
continue;
}
// For GENERATED files check status of policy CMP0071
if (accept && sf->GetPropertyAsBool("GENERATED")) {
if (sf->GetPropertyAsBool("GENERATED")) {
bool policyAccept = false;
switch (CMP0071_status) {
case cmPolicies::WARN: {
@@ -338,29 +377,16 @@ static void SetupAcquireScanFiles(cmGeneratorTarget const* target,
}
}
// Add file name to skip lists.
// Do this even when the file is not added to the sources/headers lists
// because the file name may be extracted from an other file when
// processing
if (mocSkip) {
setup.mocSkip.push_back(absFile);
}
if (uicSkip) {
setup.uicSkip.push_back(absFile);
}
if (accept) {
// Add file name to sources or headers list
switch (fileType) {
case cmSystemTools::CXX_FILE_FORMAT:
setup.sources.push_back(absFile);
break;
case cmSystemTools::HEADER_FILE_FORMAT:
setup.headers.push_back(absFile);
break;
default:
break;
}
// Add file name to sources or headers list
switch (fileType) {
case cmSystemTools::CXX_FILE_FORMAT:
setup.sources.push_back(absFile);
break;
case cmSystemTools::HEADER_FILE_FORMAT:
setup.headers.push_back(absFile);
break;
default:
break;
}
}
}