cmCommonTargetGenerator: Adopt AddFortranFlags and friends
Move AddFortranFlags, GetFortranModuleDirectory, and supporting members up from cmMakefileTargetGenerator.
This commit is contained in:
parent
b2f51aef0d
commit
0b22c0b815
|
@ -15,6 +15,7 @@
|
||||||
#include "cmGlobalCommonGenerator.h"
|
#include "cmGlobalCommonGenerator.h"
|
||||||
#include "cmLocalCommonGenerator.h"
|
#include "cmLocalCommonGenerator.h"
|
||||||
#include "cmMakefile.h"
|
#include "cmMakefile.h"
|
||||||
|
#include "cmSystemTools.h"
|
||||||
#include "cmTarget.h"
|
#include "cmTarget.h"
|
||||||
|
|
||||||
cmCommonTargetGenerator::cmCommonTargetGenerator(cmGeneratorTarget* gt)
|
cmCommonTargetGenerator::cmCommonTargetGenerator(cmGeneratorTarget* gt)
|
||||||
|
@ -26,6 +27,7 @@ cmCommonTargetGenerator::cmCommonTargetGenerator(cmGeneratorTarget* gt)
|
||||||
gt->LocalGenerator->GetGlobalGenerator()))
|
gt->LocalGenerator->GetGlobalGenerator()))
|
||||||
, ConfigName(LocalGenerator->GetConfigName())
|
, ConfigName(LocalGenerator->GetConfigName())
|
||||||
, ModuleDefinitionFile(GeneratorTarget->GetModuleDefinitionFile(ConfigName))
|
, ModuleDefinitionFile(GeneratorTarget->GetModuleDefinitionFile(ConfigName))
|
||||||
|
, FortranModuleDirectoryComputed(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,3 +97,98 @@ void cmCommonTargetGenerator::AddModuleDefinitionFlag(std::string& flags)
|
||||||
this->ModuleDefinitionFile));
|
this->ModuleDefinitionFile));
|
||||||
this->LocalGenerator->AppendFlags(flags, flag);
|
this->LocalGenerator->AppendFlags(flags, flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
const char* cmCommonTargetGenerator::GetFortranModuleDirectory()
|
||||||
|
{
|
||||||
|
// Compute the module directory.
|
||||||
|
if(!this->FortranModuleDirectoryComputed)
|
||||||
|
{
|
||||||
|
const char* target_mod_dir =
|
||||||
|
this->Target->GetProperty("Fortran_MODULE_DIRECTORY");
|
||||||
|
const char* moddir_flag =
|
||||||
|
this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_FLAG");
|
||||||
|
if(target_mod_dir && moddir_flag)
|
||||||
|
{
|
||||||
|
// Compute the full path to the module directory.
|
||||||
|
if(cmSystemTools::FileIsFullPath(target_mod_dir))
|
||||||
|
{
|
||||||
|
// Already a full path.
|
||||||
|
this->FortranModuleDirectory = target_mod_dir;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Interpret relative to the current output directory.
|
||||||
|
this->FortranModuleDirectory =
|
||||||
|
this->Makefile->GetCurrentBinaryDirectory();
|
||||||
|
this->FortranModuleDirectory += "/";
|
||||||
|
this->FortranModuleDirectory += target_mod_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the module output directory exists.
|
||||||
|
cmSystemTools::MakeDirectory(this->FortranModuleDirectory.c_str());
|
||||||
|
}
|
||||||
|
this->FortranModuleDirectoryComputed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the computed directory.
|
||||||
|
if(this->FortranModuleDirectory.empty())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return this->FortranModuleDirectory.c_str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmCommonTargetGenerator::AddFortranFlags(std::string& flags)
|
||||||
|
{
|
||||||
|
// Enable module output if necessary.
|
||||||
|
if(const char* modout_flag =
|
||||||
|
this->Makefile->GetDefinition("CMAKE_Fortran_MODOUT_FLAG"))
|
||||||
|
{
|
||||||
|
this->LocalGenerator->AppendFlags(flags, modout_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a module output directory flag if necessary.
|
||||||
|
const char* mod_dir = this->GetFortranModuleDirectory();
|
||||||
|
if(!mod_dir)
|
||||||
|
{
|
||||||
|
mod_dir = this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_DEFAULT");
|
||||||
|
}
|
||||||
|
if(mod_dir)
|
||||||
|
{
|
||||||
|
const char* moddir_flag =
|
||||||
|
this->Makefile->GetRequiredDefinition("CMAKE_Fortran_MODDIR_FLAG");
|
||||||
|
std::string modflag = moddir_flag;
|
||||||
|
modflag += this->Convert(mod_dir,
|
||||||
|
cmLocalGenerator::START_OUTPUT,
|
||||||
|
cmLocalGenerator::SHELL);
|
||||||
|
this->LocalGenerator->AppendFlags(flags, modflag);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is a separate module path flag then duplicate the
|
||||||
|
// include path with it. This compiler does not search the include
|
||||||
|
// path for modules.
|
||||||
|
if(const char* modpath_flag =
|
||||||
|
this->Makefile->GetDefinition("CMAKE_Fortran_MODPATH_FLAG"))
|
||||||
|
{
|
||||||
|
std::vector<std::string> includes;
|
||||||
|
const std::string& config =
|
||||||
|
this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
||||||
|
this->LocalGenerator->GetIncludeDirectories(includes,
|
||||||
|
this->GeneratorTarget,
|
||||||
|
"C", config);
|
||||||
|
for(std::vector<std::string>::const_iterator idi = includes.begin();
|
||||||
|
idi != includes.end(); ++idi)
|
||||||
|
{
|
||||||
|
std::string flg = modpath_flag;
|
||||||
|
flg += this->Convert(*idi,
|
||||||
|
cmLocalGenerator::NONE,
|
||||||
|
cmLocalGenerator::SHELL);
|
||||||
|
this->LocalGenerator->AppendFlags(flags, flg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -55,6 +55,14 @@ protected:
|
||||||
// The windows module definition source file (.def), if any.
|
// The windows module definition source file (.def), if any.
|
||||||
std::string ModuleDefinitionFile;
|
std::string ModuleDefinitionFile;
|
||||||
|
|
||||||
|
// Target-wide Fortran module output directory.
|
||||||
|
bool FortranModuleDirectoryComputed;
|
||||||
|
std::string FortranModuleDirectory;
|
||||||
|
const char* GetFortranModuleDirectory();
|
||||||
|
|
||||||
|
// Compute target-specific Fortran language flags.
|
||||||
|
void AddFortranFlags(std::string& flags);
|
||||||
|
|
||||||
std::string Convert(std::string const& source,
|
std::string Convert(std::string const& source,
|
||||||
cmLocalGenerator::RelativeRoot relative,
|
cmLocalGenerator::RelativeRoot relative,
|
||||||
cmLocalGenerator::OutputFormat output =
|
cmLocalGenerator::OutputFormat output =
|
||||||
|
|
|
@ -41,7 +41,6 @@ cmMakefileTargetGenerator::cmMakefileTargetGenerator(cmGeneratorTarget* target)
|
||||||
this->InfoFileStream = 0;
|
this->InfoFileStream = 0;
|
||||||
this->FlagFileStream = 0;
|
this->FlagFileStream = 0;
|
||||||
this->CustomCommandDriver = OnBuild;
|
this->CustomCommandDriver = OnBuild;
|
||||||
this->FortranModuleDirectoryComputed = false;
|
|
||||||
this->LocalGenerator =
|
this->LocalGenerator =
|
||||||
static_cast<cmLocalUnixMakefileGenerator3*>(target->GetLocalGenerator());
|
static_cast<cmLocalUnixMakefileGenerator3*>(target->GetLocalGenerator());
|
||||||
this->GlobalGenerator =
|
this->GlobalGenerator =
|
||||||
|
@ -1977,98 +1976,3 @@ void cmMakefileTargetGenerator::AddIncludeFlags(std::string& flags,
|
||||||
this->LocalGenerator->AppendFlags(flags, includeFlags);
|
this->LocalGenerator->AppendFlags(flags, includeFlags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
const char* cmMakefileTargetGenerator::GetFortranModuleDirectory()
|
|
||||||
{
|
|
||||||
// Compute the module directory.
|
|
||||||
if(!this->FortranModuleDirectoryComputed)
|
|
||||||
{
|
|
||||||
const char* target_mod_dir =
|
|
||||||
this->Target->GetProperty("Fortran_MODULE_DIRECTORY");
|
|
||||||
const char* moddir_flag =
|
|
||||||
this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_FLAG");
|
|
||||||
if(target_mod_dir && moddir_flag)
|
|
||||||
{
|
|
||||||
// Compute the full path to the module directory.
|
|
||||||
if(cmSystemTools::FileIsFullPath(target_mod_dir))
|
|
||||||
{
|
|
||||||
// Already a full path.
|
|
||||||
this->FortranModuleDirectory = target_mod_dir;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Interpret relative to the current output directory.
|
|
||||||
this->FortranModuleDirectory =
|
|
||||||
this->Makefile->GetCurrentBinaryDirectory();
|
|
||||||
this->FortranModuleDirectory += "/";
|
|
||||||
this->FortranModuleDirectory += target_mod_dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure the module output directory exists.
|
|
||||||
cmSystemTools::MakeDirectory(this->FortranModuleDirectory.c_str());
|
|
||||||
}
|
|
||||||
this->FortranModuleDirectoryComputed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the computed directory.
|
|
||||||
if(this->FortranModuleDirectory.empty())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return this->FortranModuleDirectory.c_str();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
void cmMakefileTargetGenerator::AddFortranFlags(std::string& flags)
|
|
||||||
{
|
|
||||||
// Enable module output if necessary.
|
|
||||||
if(const char* modout_flag =
|
|
||||||
this->Makefile->GetDefinition("CMAKE_Fortran_MODOUT_FLAG"))
|
|
||||||
{
|
|
||||||
this->LocalGenerator->AppendFlags(flags, modout_flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a module output directory flag if necessary.
|
|
||||||
const char* mod_dir = this->GetFortranModuleDirectory();
|
|
||||||
if(!mod_dir)
|
|
||||||
{
|
|
||||||
mod_dir = this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_DEFAULT");
|
|
||||||
}
|
|
||||||
if(mod_dir)
|
|
||||||
{
|
|
||||||
const char* moddir_flag =
|
|
||||||
this->Makefile->GetRequiredDefinition("CMAKE_Fortran_MODDIR_FLAG");
|
|
||||||
std::string modflag = moddir_flag;
|
|
||||||
modflag += this->Convert(mod_dir,
|
|
||||||
cmLocalGenerator::START_OUTPUT,
|
|
||||||
cmLocalGenerator::SHELL);
|
|
||||||
this->LocalGenerator->AppendFlags(flags, modflag);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is a separate module path flag then duplicate the
|
|
||||||
// include path with it. This compiler does not search the include
|
|
||||||
// path for modules.
|
|
||||||
if(const char* modpath_flag =
|
|
||||||
this->Makefile->GetDefinition("CMAKE_Fortran_MODPATH_FLAG"))
|
|
||||||
{
|
|
||||||
std::vector<std::string> includes;
|
|
||||||
const std::string& config =
|
|
||||||
this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
|
||||||
this->LocalGenerator->GetIncludeDirectories(includes,
|
|
||||||
this->GeneratorTarget,
|
|
||||||
"C", config);
|
|
||||||
for(std::vector<std::string>::const_iterator idi = includes.begin();
|
|
||||||
idi != includes.end(); ++idi)
|
|
||||||
{
|
|
||||||
std::string flg = modpath_flag;
|
|
||||||
flg += this->Convert(*idi,
|
|
||||||
cmLocalGenerator::NONE,
|
|
||||||
cmLocalGenerator::SHELL);
|
|
||||||
this->LocalGenerator->AppendFlags(flags, flg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -246,14 +246,6 @@ protected:
|
||||||
ByLanguageMap FlagsByLanguage;
|
ByLanguageMap FlagsByLanguage;
|
||||||
std::string GetDefines(const std::string &l);
|
std::string GetDefines(const std::string &l);
|
||||||
ByLanguageMap DefinesByLanguage;
|
ByLanguageMap DefinesByLanguage;
|
||||||
|
|
||||||
// Target-wide Fortran module output directory.
|
|
||||||
bool FortranModuleDirectoryComputed;
|
|
||||||
std::string FortranModuleDirectory;
|
|
||||||
const char* GetFortranModuleDirectory();
|
|
||||||
|
|
||||||
// Compute target-specific Fortran language flags.
|
|
||||||
void AddFortranFlags(std::string& flags);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue