ENH: Added provides/requires output for modules.
This commit is contained in:
parent
7ceafbfc7a
commit
c16aca0643
|
@ -124,10 +124,9 @@ bool cmDependsFortran::WriteDependencies(std::ostream& os)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the dependencies to the output stream.
|
// Write the include dependencies to the output stream.
|
||||||
const std::set<cmStdString>& dependencies = parser.Includes;
|
for(std::set<cmStdString>::const_iterator i = parser.Includes.begin();
|
||||||
for(std::set<cmStdString>::const_iterator i=dependencies.begin();
|
i != parser.Includes.end(); ++i)
|
||||||
i != dependencies.end(); ++i)
|
|
||||||
{
|
{
|
||||||
os << m_TargetFile.c_str() << ": "
|
os << m_TargetFile.c_str() << ": "
|
||||||
<< cmSystemTools::ConvertToOutputPath(i->c_str()).c_str()
|
<< cmSystemTools::ConvertToOutputPath(i->c_str()).c_str()
|
||||||
|
@ -135,6 +134,89 @@ bool cmDependsFortran::WriteDependencies(std::ostream& os)
|
||||||
}
|
}
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
|
|
||||||
|
// Write module requirements to the output stream.
|
||||||
|
for(std::set<cmStdString>::const_iterator i = parser.Requires.begin();
|
||||||
|
i != parser.Requires.end(); ++i)
|
||||||
|
{
|
||||||
|
// Require only modules not provided in the same source.
|
||||||
|
if(parser.Provides.find(*i) == parser.Provides.end())
|
||||||
|
{
|
||||||
|
os << m_TargetFile.c_str() << ": " << i->c_str() << ".mod.stamp"
|
||||||
|
<< std::endl;
|
||||||
|
os << m_TargetFile.c_str() << ".requires: " << i->c_str() << ".mod.proxy"
|
||||||
|
<< std::endl;
|
||||||
|
os << i->c_str() << ".mod.proxy:" << std::endl;
|
||||||
|
std::string stampName = m_Directory;
|
||||||
|
stampName += "/";
|
||||||
|
stampName += *i;
|
||||||
|
stampName += ".mod.stamp";
|
||||||
|
if(!cmSystemTools::FileExists(stampName.c_str()))
|
||||||
|
{
|
||||||
|
std::ofstream stamp(stampName.c_str());
|
||||||
|
stamp << "# Dummy stamp file in case nothing provides it."
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write provided modules to the output stream.
|
||||||
|
for(std::set<cmStdString>::const_iterator i = parser.Provides.begin();
|
||||||
|
i != parser.Provides.end(); ++i)
|
||||||
|
{
|
||||||
|
os << i->c_str() << ".mod.proxy: " << m_TargetFile.c_str()
|
||||||
|
<< ".requires" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If any modules are provided then they must be converted to stamp files.
|
||||||
|
if(!parser.Provides.empty())
|
||||||
|
{
|
||||||
|
os << m_TargetFile.c_str() << ".provides:\n";
|
||||||
|
for(std::set<cmStdString>::const_iterator i = parser.Provides.begin();
|
||||||
|
i != parser.Provides.end(); ++i)
|
||||||
|
{
|
||||||
|
os << "\t@$(CMAKE_COMMAND) -E copy_if_different "
|
||||||
|
<< i->c_str() << ".mod " << i->c_str() << ".mod.stamp\n";
|
||||||
|
}
|
||||||
|
os << "\t@touch " << m_TargetFile.c_str() << ".provides\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// TODO:
|
||||||
|
What about .mod files provided in another directory and found with a
|
||||||
|
-M search path? The stamp file will not be updated, so things might
|
||||||
|
not rebuild. Possible solutions (not all thought through):
|
||||||
|
|
||||||
|
Solution 1: Have all the .o.requires in a directory depend on a
|
||||||
|
single .outside.requires that searches for .mod files in another
|
||||||
|
directory of the build tree and uses copy-if-different to produce
|
||||||
|
the local directory's stamp files. (won't work because the single
|
||||||
|
rule cannot know about the modules)
|
||||||
|
|
||||||
|
Solution 2: When the dependency is detected search the module
|
||||||
|
include path for a mark file indicating the module is provided. If
|
||||||
|
not found just write the dummy stamp file. If found, we need a rule
|
||||||
|
to copy-if-different the module file. When a module is provided,
|
||||||
|
write this mark file.
|
||||||
|
|
||||||
|
Solution 3: Use a set of make rules like this:
|
||||||
|
|
||||||
|
# When required:
|
||||||
|
foo.mod.proxy: foo.mod.default
|
||||||
|
foo.mod.default:: foo.mod.hack
|
||||||
|
@echo foo.mod.default2 # Search for and copy-if-different the mod file.
|
||||||
|
foo.mod.hack:
|
||||||
|
|
||||||
|
# When provided:
|
||||||
|
foo.mod.proxy: foo.o.requires
|
||||||
|
@rm -f foo.mod.hack foo.mod.default
|
||||||
|
foo.o.requires: foo.mod.hack
|
||||||
|
@echo foo.o.requires
|
||||||
|
foo.mod.hack:
|
||||||
|
@touch foo.mod.hack
|
||||||
|
@touch foo.mod.default
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue