BUG: Fix OS X AppBundle/FW byproducts dependencies

App Bundle and Framework directories, symlinks, and Info.plist files we
create during generation are byproducts, not outputs.  We should re-run
CMake only when they are missing, not when they are old.
See issue #8465.
This commit is contained in:
Brad King 2009-02-06 11:18:56 -05:00
parent 81601796a6
commit 2282748907
2 changed files with 38 additions and 9 deletions

View File

@ -352,18 +352,26 @@ void cmGlobalUnixMakefileGenerator3::WriteMainCMakefile()
cmakefileStream << " \"" <<
lg->Convert(tmpStr.c_str(),cmLocalGenerator::HOME_OUTPUT).c_str()
<< "\"\n";
const std::vector<std::string>& outfiles =
lg->GetMakefile()->GetOutputFiles();
for(std::vector<std::string>::const_iterator k= outfiles.begin();
k != outfiles.end(); ++k)
{
cmakefileStream << " \"" <<
lg->Convert(k->c_str(),cmLocalGenerator::HOME_OUTPUT).c_str()
<< "\"\n";
}
}
cmakefileStream << " )\n\n";
// CMake must rerun if a byproduct is missing.
{
cmakefileStream
<< "# Byproducts of CMake generate step:\n"
<< "SET(CMAKE_MAKEFILE_PRODUCTS\n";
const std::vector<std::string>& outfiles =
lg->GetMakefile()->GetOutputFiles();
for(std::vector<std::string>::const_iterator k = outfiles.begin();
k != outfiles.end(); ++k)
{
cmakefileStream << " \"" <<
lg->Convert(k->c_str(),cmLocalGenerator::HOME_OUTPUT).c_str()
<< "\"\n";
}
cmakefileStream << " )\n\n";
}
this->WriteMainCMakefileLanguageRules(cmakefileStream,
this->LocalGenerators);
}

View File

@ -2657,6 +2657,27 @@ int cmake::CheckBuildSystem()
}
}
// If any byproduct of makefile generation is missing we must re-run.
std::vector<std::string> products;
if(const char* productStr = mf->GetDefinition("CMAKE_MAKEFILE_PRODUCTS"))
{
cmSystemTools::ExpandListArgument(productStr, products);
}
for(std::vector<std::string>::const_iterator pi = products.begin();
pi != products.end(); ++pi)
{
if(!cmSystemTools::FileExists(pi->c_str()))
{
if(verbose)
{
cmOStringStream msg;
msg << "Re-run cmake, missing byproduct: " << *pi << "\n";
cmSystemTools::Stdout(msg.str().c_str());
}
return 1;
}
}
// Get the set of dependencies and outputs.
std::vector<std::string> depends;
std::vector<std::string> outputs;