diff options
Diffstat (limited to 'Source/cmDependsFortran.h')
-rw-r--r-- | Source/cmDependsFortran.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/Source/cmDependsFortran.h b/Source/cmDependsFortran.h new file mode 100644 index 0000000..0485115 --- /dev/null +++ b/Source/cmDependsFortran.h @@ -0,0 +1,94 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmFortran_h +#define cmFortran_h + +#include "cmConfigure.h" // IWYU pragma: keep + +#include <iosfwd> +#include <set> +#include <string> +#include <vector> + +#include "cmDepends.h" + +class cmDependsFortranInternals; +class cmFortranSourceInfo; +class cmLocalGenerator; + +/** \class cmDependsFortran + * \brief Dependency scanner for Fortran object files. + */ +class cmDependsFortran : public cmDepends +{ +public: + /** Checking instances need to know the build directory name and the + relative path from the build directory to the target file. */ + cmDependsFortran(); + + /** Scanning need to know the build directory name, the relative + path from the build directory to the target file, the source + file from which to start scanning, the include file search + path, and the target directory. */ + cmDependsFortran(cmLocalGenerator* lg); + + /** Virtual destructor to cleanup subclasses properly. */ + ~cmDependsFortran() override; + + cmDependsFortran(cmDependsFortran const&) = delete; + cmDependsFortran& operator=(cmDependsFortran const&) = delete; + + /** Callback from build system after a .mod file has been generated + by a Fortran90 compiler to copy the .mod file to the + corresponding stamp file. */ + static bool CopyModule(const std::vector<std::string>& args); + + /** Determine if a mod file and the corresponding mod.stamp file + are representing different module information. */ + static bool ModulesDiffer(const std::string& modFile, + const std::string& stampFile, + const std::string& compilerId); + +protected: + // Finalize the dependency information for the target. + bool Finalize(std::ostream& makeDepends, + std::ostream& internalDepends) override; + + // Find all the modules required by the target. + void LocateModules(); + void MatchLocalModules(); + void MatchRemoteModules(std::istream& fin, const std::string& stampDir); + void ConsiderModule(const std::string& name, const std::string& stampDir); + bool FindModule(std::string const& name, std::string& module); + + // Implement writing/checking methods required by superclass. + bool WriteDependencies(const std::set<std::string>& sources, + const std::string& file, std::ostream& makeDepends, + std::ostream& internalDepends) override; + + // Actually write the dependencies to the streams. + bool WriteDependenciesReal(std::string const& obj, + cmFortranSourceInfo const& info, + std::string const& mod_dir, + std::string const& stamp_dir, + std::ostream& makeDepends, + std::ostream& internalDepends); + + // The source file from which to start scanning. + std::string SourceFile; + + std::string CompilerId; + std::string SModSep; + std::string SModExt; + + std::set<std::string> PPDefinitions; + + // Internal implementation details. + cmDependsFortranInternals* Internal = nullptr; + +private: + std::string MaybeConvertToRelativePath(std::string const& base, + std::string const& path); +}; + +#endif |