Commit d80ecba5 authored by Brad King's avatar Brad King

Fortran: Fix submodule file names across compilers

The naming convention for submodule files varies across compilers.  Add
a table to the compiler information modules and thread the information
through to the Fortran module dependency parser.  Fill out the table for
compiler ids known to support Fortran submodules.

Fixes: #18746
parent 72057d9c
include(Compiler/Clang) include(Compiler/Clang)
__compiler_clang(Fortran) __compiler_clang(Fortran)
set(CMAKE_Fortran_SUBMODULE_SEP "-")
set(CMAKE_Fortran_SUBMODULE_EXT ".mod")
set(CMAKE_Fortran_PREPROCESS_SOURCE set(CMAKE_Fortran_PREPROCESS_SOURCE
"<CMAKE_Fortran_COMPILER> -cpp <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>") "<CMAKE_Fortran_COMPILER> -cpp <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
......
include(Compiler/GNU) include(Compiler/GNU)
__compiler_gnu(Fortran) __compiler_gnu(Fortran)
set(CMAKE_Fortran_SUBMODULE_SEP "@")
set(CMAKE_Fortran_SUBMODULE_EXT ".smod")
set(CMAKE_Fortran_PREPROCESS_SOURCE set(CMAKE_Fortran_PREPROCESS_SOURCE
"<CMAKE_Fortran_COMPILER> -cpp <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> -o <PREPROCESSED_SOURCE>") "<CMAKE_Fortran_COMPILER> -cpp <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> -o <PREPROCESSED_SOURCE>")
......
include(Compiler/Intel) include(Compiler/Intel)
__compiler_intel(Fortran) __compiler_intel(Fortran)
set(CMAKE_Fortran_SUBMODULE_SEP "@")
set(CMAKE_Fortran_SUBMODULE_EXT ".smod")
set(CMAKE_Fortran_MODDIR_FLAG "-module ") set(CMAKE_Fortran_MODDIR_FLAG "-module ")
set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-fixed") set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-fixed")
set(CMAKE_Fortran_FORMAT_FREE_FLAG "-free") set(CMAKE_Fortran_FORMAT_FREE_FLAG "-free")
......
include(Compiler/PGI) include(Compiler/PGI)
__compiler_pgi(Fortran) __compiler_pgi(Fortran)
set(CMAKE_Fortran_SUBMODULE_SEP "-")
set(CMAKE_Fortran_SUBMODULE_EXT ".mod")
set(CMAKE_Fortran_PREPROCESS_SOURCE set(CMAKE_Fortran_PREPROCESS_SOURCE
"<CMAKE_Fortran_COMPILER> -Mpreprocess <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>") "<CMAKE_Fortran_COMPILER> -Mpreprocess <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
......
include(Compiler/XL) include(Compiler/XL)
__compiler_xl(Fortran) __compiler_xl(Fortran)
set(CMAKE_Fortran_SUBMODULE_SEP "_")
set(CMAKE_Fortran_SUBMODULE_EXT ".smod")
set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-qfixed") # [=<right_margin>] set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-qfixed") # [=<right_margin>]
set(CMAKE_Fortran_FORMAT_FREE_FLAG "-qfree") # [=f90|ibm] set(CMAKE_Fortran_FORMAT_FREE_FLAG "-qfree") # [=f90|ibm]
......
...@@ -96,6 +96,8 @@ cmDependsFortran::cmDependsFortran(cmLocalGenerator* lg) ...@@ -96,6 +96,8 @@ cmDependsFortran::cmDependsFortran(cmLocalGenerator* lg)
} }
this->CompilerId = mf->GetSafeDefinition("CMAKE_Fortran_COMPILER_ID"); this->CompilerId = mf->GetSafeDefinition("CMAKE_Fortran_COMPILER_ID");
this->SModSep = mf->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_SEP");
this->SModExt = mf->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_EXT");
} }
cmDependsFortran::~cmDependsFortran() cmDependsFortran::~cmDependsFortran()
...@@ -120,6 +122,8 @@ bool cmDependsFortran::WriteDependencies(const std::set<std::string>& sources, ...@@ -120,6 +122,8 @@ bool cmDependsFortran::WriteDependencies(const std::set<std::string>& sources,
cmFortranCompiler fc; cmFortranCompiler fc;
fc.Id = this->CompilerId; fc.Id = this->CompilerId;
fc.SModSep = this->SModSep;
fc.SModExt = this->SModExt;
bool okay = true; bool okay = true;
for (std::string const& src : sources) { for (std::string const& src : sources) {
......
...@@ -78,6 +78,8 @@ protected: ...@@ -78,6 +78,8 @@ protected:
std::string SourceFile; std::string SourceFile;
std::string CompilerId; std::string CompilerId;
std::string SModSep;
std::string SModExt;
std::set<std::string> PPDefinitions; std::set<std::string> PPDefinitions;
......
...@@ -131,6 +131,8 @@ struct cmFortranFile ...@@ -131,6 +131,8 @@ struct cmFortranFile
struct cmFortranCompiler struct cmFortranCompiler
{ {
std::string Id; std::string Id;
std::string SModSep;
std::string SModExt;
}; };
struct cmFortranParser_s struct cmFortranParser_s
......
...@@ -79,7 +79,7 @@ std::string cmFortranParser_s::ModName(std::string const& mod_name) const ...@@ -79,7 +79,7 @@ std::string cmFortranParser_s::ModName(std::string const& mod_name) const
std::string cmFortranParser_s::SModName(std::string const& mod_name, std::string cmFortranParser_s::SModName(std::string const& mod_name,
std::string const& sub_name) const std::string const& sub_name) const
{ {
return mod_name + "@" + sub_name + ".smod"; return mod_name + this->Compiler.SModSep + sub_name + this->Compiler.SModExt;
} }
bool cmFortranParser_FilePush(cmFortranParser* parser, const char* fname) bool cmFortranParser_FilePush(cmFortranParser* parser, const char* fname)
......
...@@ -1704,6 +1704,12 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg, ...@@ -1704,6 +1704,12 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
Json::Value const& tdi_compiler_id = tdi["compiler-id"]; Json::Value const& tdi_compiler_id = tdi["compiler-id"];
fc.Id = tdi_compiler_id.asString(); fc.Id = tdi_compiler_id.asString();
Json::Value const& tdi_submodule_sep = tdi["submodule-sep"];
fc.SModSep = tdi_submodule_sep.asString();
Json::Value const& tdi_submodule_ext = tdi["submodule-ext"];
fc.SModExt = tdi_submodule_ext.asString();
} }
cmFortranSourceInfo info; cmFortranSourceInfo info;
......
...@@ -1808,6 +1808,17 @@ void cmLocalUnixMakefileGenerator3::WriteDependLanguageInfo( ...@@ -1808,6 +1808,17 @@ void cmLocalUnixMakefileGenerator3::WriteDependLanguageInfo(
<< "_COMPILER_ID \"" << cid << "\")\n"; << "_COMPILER_ID \"" << cid << "\")\n";
} }
if (implicitLang.first == "Fortran") {
std::string smodSep =
this->Makefile->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_SEP");
std::string smodExt =
this->Makefile->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_EXT");
cmakefileStream << "set(CMAKE_Fortran_SUBMODULE_SEP \"" << smodSep
<< "\")\n";
cmakefileStream << "set(CMAKE_Fortran_SUBMODULE_EXT \"" << smodExt
<< "\")\n";
}
// Build a list of preprocessor definitions for the target. // Build a list of preprocessor definitions for the target.
std::set<std::string> defines; std::set<std::string> defines;
this->GetTargetDefines(target, this->ConfigName, implicitLang.first, this->GetTargetDefines(target, this->ConfigName, implicitLang.first,
......
...@@ -1144,6 +1144,10 @@ void cmNinjaTargetGenerator::WriteTargetDependInfo(std::string const& lang) ...@@ -1144,6 +1144,10 @@ void cmNinjaTargetGenerator::WriteTargetDependInfo(std::string const& lang)
mod_dir = this->Makefile->GetCurrentBinaryDirectory(); mod_dir = this->Makefile->GetCurrentBinaryDirectory();
} }
tdi["module-dir"] = mod_dir; tdi["module-dir"] = mod_dir;
tdi["submodule-sep"] =
this->Makefile->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_SEP");
tdi["submodule-ext"] =
this->Makefile->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_EXT");
} }
tdi["dir-cur-bld"] = this->Makefile->GetCurrentBinaryDirectory(); tdi["dir-cur-bld"] = this->Makefile->GetCurrentBinaryDirectory();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment