@ -1140,27 +1140,32 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements(
}
}
for ( auto const & langDDI Files : this - > Configs [ config ] . DDIFiles ) {
std : : string const & language = langDDI Files . first ;
cmNinjaDeps const & ddiFiles = langDDI Files. second ;
for ( auto const & langScanning Files : this - > Configs [ config ] . ScanningInfo ) {
std : : string const & language = langScanning Files . first ;
std : : vector < ScanningFiles > const & scanningFiles = langScanning Files. second ;
cmNinjaBuild build ( this - > LanguageDyndepRule ( language , config ) ) ;
build . Outputs . push_back ( this - > GetDyndepFilePath ( language , config ) ) ;
build . ExplicitDeps = ddiFiles ;
build . ImplicitOuts . push_back (
cmStrCat ( this - > Makefile - > GetCurrentBinaryDirectory ( ) , ' / ' ,
this - > LocalGenerator - > GetTargetDirectory ( this - > GeneratorTarget ) ,
this - > GetGlobalGenerator ( ) - > ConfigDirectory ( config ) , ' / ' ,
language , " Modules.json " ) ) ;
for ( auto const & scanFiles : scanningFiles ) {
if ( ! scanFiles . ScanningOutput . empty ( ) ) {
build . ExplicitDeps . push_back ( scanFiles . ScanningOutput ) ;
}
if ( ! scanFiles . ModuleMapFile . empty ( ) ) {
build . ImplicitOuts . push_back ( scanFiles . ModuleMapFile ) ;
}
}
this - > WriteTargetDependInfo ( language , config ) ;
// Make sure dyndep files for all our dependencies have already
// been generated so that the '<LANG>Modules.json' files they
// produced as side-effects are available for us to read.
// Ideally we should depend on the '<LANG>Modules.json' files
// from our dependencies directly, but we don't know which of
// our dependencies produces them. Fixing this will require
// refactoring the Ninja generator to generate targets in
// dependency order so that we can collect the needed information.
this - > GetLocalGenerator ( ) - > AppendTargetDepends (
this - > GeneratorTarget , build . OrderOnlyDeps , config , fileConfig ,
DependOnTargetArtifact ) ;
for ( std : : string const & l :
this - > GetLinkedTargetDirectories ( language , config ) ) {
build . ImplicitDeps . push_back ( cmStrCat ( l , ' / ' , language , " Modules.json " ) ) ;
}
this - > GetGlobalGenerator ( ) - > WriteBuild ( this - > GetImplFileStream ( fileConfig ) ,
build ) ;
@ -1210,7 +1215,6 @@ cmNinjaBuild GetScanBuildStatement(const std::string& ruleName,
const std : : string & ppFileName ,
bool compilePP , bool compilePPWithDefines ,
cmNinjaBuild & objBuild , cmNinjaVars & vars ,
std : : string const & modmapFormat ,
const std : : string & objectFileName ,
cmLocalGenerator * lg )
{
@ -1279,15 +1283,6 @@ cmNinjaBuild GetScanBuildStatement(const std::string& ruleName,
vars . erase ( " DEP_FILE " ) ;
}
if ( ! modmapFormat . empty ( ) ) {
// XXX(modmap): If changing this path construction, change
// `cmGlobalNinjaGenerator::WriteDyndep` to expect the corresponding
// file path.
std : : string const ddModmapFile = cmStrCat ( objectFileName , " .modmap " ) ;
scanBuild . Variables [ " DYNDEP_MODULE_MAP_FILE " ] = ddModmapFile ;
scanBuild . ImplicitOuts . push_back ( ddModmapFile ) ;
}
return scanBuild ;
}
}
@ -1482,7 +1477,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
cmNinjaBuild ppBuild = GetScanBuildStatement (
scanRuleName , ppFileName , compilePP , compilePPWithDefines , objBuild ,
vars , modmapFormat , objectFileName , this - > LocalGenerator ) ;
vars , objectFileName , this - > LocalGenerator ) ;
if ( compilePP ) {
// In case compilation requires flags that are incompatible with
@ -1503,9 +1498,10 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
vars [ " INCLUDES " ] = cmStrCat ( sourceDirectoryFlag , ' ' , vars [ " INCLUDES " ] ) ;
}
ScanningFiles scanningFiles ;
if ( firstForConfig ) {
std : : string const ddiFile = cmStrCat ( objectFileName , " .ddi " ) ;
this - > Configs [ config ] . DDIFiles [ language ] . push_back ( ddiFile ) ;
scanningFiles . ScanningOutput = cmStrCat ( objectFileName , " .ddi " ) ;
}
this - > addPoolNinjaVariable ( " JOB_POOL_COMPILE " , this - > GetGeneratorTarget ( ) ,
@ -1519,9 +1515,17 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
vars [ " dyndep " ] = dyndep ;
if ( ! modmapFormat . empty ( ) ) {
std : : string const ddModmapFile = cmStrCat ( objectFileName , " .modmap " ) ;
// XXX(modmap): If changing this path construction, change
// `cmGlobalNinjaGenerator::WriteDyndep` to expect the corresponding file
// path.
std : : string ddModmapFile = cmStrCat ( objectFileName , " .modmap " ) ;
vars [ " DYNDEP_MODULE_MAP_FILE " ] = ddModmapFile ;
objBuild . OrderOnlyDeps . push_back ( ddModmapFile ) ;
scanningFiles . ModuleMapFile = std : : move ( ddModmapFile ) ;
}
if ( ! scanningFiles . IsEmpty ( ) ) {
this - > Configs [ config ] . ScanningInfo [ language ] . emplace_back ( scanningFiles ) ;
}
}