Fortran: Use module dir flag if needed for default module directory
Our buildsystem model says that the default Fortran module output directory is the build tree directory corresponding to the source tree `CMakeLists.txt` file adding the current target. Extend `cmGeneratorTarget::GetFortranModuleDirectory` to allow generators to pass in the compiler working directory. If the working directory does not match the default Fortran module output directory then we need an explicit module directory flag (e.g. `-J`) to tell the compiler to put/use modules in the latter. This does not affect the Makefile generator but will be useful for future introduction of Fortran support to the Ninja generator.
This commit is contained in:
parent
1777570fe5
commit
7b5f85677c
|
@ -3883,22 +3883,31 @@ void cmGeneratorTarget::GetTargetVersion(bool soversion, int& major,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string cmGeneratorTarget::GetFortranModuleDirectory() const
|
std::string cmGeneratorTarget::GetFortranModuleDirectory(
|
||||||
|
std::string const& working_dir) const
|
||||||
{
|
{
|
||||||
if (!this->FortranModuleDirectoryCreated) {
|
if (!this->FortranModuleDirectoryCreated) {
|
||||||
this->FortranModuleDirectory = true;
|
this->FortranModuleDirectory = true;
|
||||||
this->FortranModuleDirectory = this->CreateFortranModuleDirectory();
|
this->FortranModuleDirectory =
|
||||||
|
this->CreateFortranModuleDirectory(working_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this->FortranModuleDirectory;
|
return this->FortranModuleDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string cmGeneratorTarget::CreateFortranModuleDirectory() const
|
std::string cmGeneratorTarget::CreateFortranModuleDirectory(
|
||||||
|
std::string const& working_dir) const
|
||||||
{
|
{
|
||||||
std::string mod_dir;
|
std::string mod_dir;
|
||||||
std::string target_mod_dir;
|
std::string target_mod_dir;
|
||||||
if (const char* prop = this->GetProperty("Fortran_MODULE_DIRECTORY")) {
|
if (const char* prop = this->GetProperty("Fortran_MODULE_DIRECTORY")) {
|
||||||
target_mod_dir = prop;
|
target_mod_dir = prop;
|
||||||
|
} else {
|
||||||
|
std::string const& default_mod_dir =
|
||||||
|
this->LocalGenerator->GetCurrentBinaryDirectory();
|
||||||
|
if (default_mod_dir != working_dir) {
|
||||||
|
target_mod_dir = default_mod_dir;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const char* moddir_flag =
|
const char* moddir_flag =
|
||||||
this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_FLAG");
|
this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_FLAG");
|
||||||
|
|
|
@ -537,12 +537,13 @@ public:
|
||||||
void GetTargetVersion(bool soversion, int& major, int& minor,
|
void GetTargetVersion(bool soversion, int& major, int& minor,
|
||||||
int& patch) const;
|
int& patch) const;
|
||||||
|
|
||||||
std::string GetFortranModuleDirectory() const;
|
std::string GetFortranModuleDirectory(std::string const& working_dir) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void AddSourceCommon(const std::string& src);
|
void AddSourceCommon(const std::string& src);
|
||||||
|
|
||||||
std::string CreateFortranModuleDirectory() const;
|
std::string CreateFortranModuleDirectory(
|
||||||
|
std::string const& working_dir) const;
|
||||||
mutable bool FortranModuleDirectoryCreated;
|
mutable bool FortranModuleDirectoryCreated;
|
||||||
mutable std::string FortranModuleDirectory;
|
mutable std::string FortranModuleDirectory;
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,8 @@ std::string cmLocalCommonGenerator::GetTargetFortranFlags(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a module output directory flag if necessary.
|
// Add a module output directory flag if necessary.
|
||||||
std::string mod_dir = target->GetFortranModuleDirectory();
|
std::string mod_dir =
|
||||||
|
target->GetFortranModuleDirectory(this->WorkingDirectory);
|
||||||
if (!mod_dir.empty()) {
|
if (!mod_dir.empty()) {
|
||||||
mod_dir = this->ConvertToOutputFormat(
|
mod_dir = this->ConvertToOutputFormat(
|
||||||
this->ConvertToRelativePath(this->WorkingDirectory, mod_dir),
|
this->ConvertToRelativePath(this->WorkingDirectory, mod_dir),
|
||||||
|
|
|
@ -993,12 +993,16 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
|
||||||
*this->InfoFileStream << " )\n";
|
*this->InfoFileStream << " )\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string const& working_dir =
|
||||||
|
this->LocalGenerator->GetCurrentBinaryDirectory();
|
||||||
|
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
*this->InfoFileStream
|
*this->InfoFileStream
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< "# Fortran module output directory.\n"
|
<< "# Fortran module output directory.\n"
|
||||||
<< "set(CMAKE_Fortran_TARGET_MODULE_DIR \""
|
<< "set(CMAKE_Fortran_TARGET_MODULE_DIR \""
|
||||||
<< this->GeneratorTarget->GetFortranModuleDirectory() << "\")\n";
|
<< this->GeneratorTarget->GetFortranModuleDirectory(working_dir)
|
||||||
|
<< "\")\n";
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
|
||||||
// and now write the rule to use it
|
// and now write the rule to use it
|
||||||
|
|
Loading…
Reference in New Issue