cmLocalCommonGenerator.cxx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmLocalCommonGenerator.h"
  4. #include <utility>
  5. #include <vector>
  6. #include "cmGeneratorTarget.h"
  7. #include "cmMakefile.h"
  8. #include "cmOutputConverter.h"
  9. class cmGlobalGenerator;
  10. cmLocalCommonGenerator::cmLocalCommonGenerator(cmGlobalGenerator* gg,
  11. cmMakefile* mf, std::string wd)
  12. : cmLocalGenerator(gg, mf)
  13. , WorkingDirectory(std::move(wd))
  14. {
  15. // Store the configuration name that will be generated.
  16. if (const char* config = this->Makefile->GetDefinition("CMAKE_BUILD_TYPE")) {
  17. // Use the build type given by the user.
  18. this->ConfigName = config;
  19. } else {
  20. // No configuration type given.
  21. this->ConfigName.clear();
  22. }
  23. }
  24. cmLocalCommonGenerator::~cmLocalCommonGenerator()
  25. {
  26. }
  27. std::string cmLocalCommonGenerator::GetTargetFortranFlags(
  28. cmGeneratorTarget const* target, std::string const& config)
  29. {
  30. std::string flags;
  31. // Enable module output if necessary.
  32. if (const char* modout_flag =
  33. this->Makefile->GetDefinition("CMAKE_Fortran_MODOUT_FLAG")) {
  34. this->AppendFlags(flags, modout_flag);
  35. }
  36. // Add a module output directory flag if necessary.
  37. std::string mod_dir =
  38. target->GetFortranModuleDirectory(this->WorkingDirectory);
  39. if (!mod_dir.empty()) {
  40. mod_dir = this->ConvertToOutputFormat(
  41. this->ConvertToRelativePath(this->WorkingDirectory, mod_dir),
  42. cmOutputConverter::SHELL);
  43. } else {
  44. mod_dir =
  45. this->Makefile->GetSafeDefinition("CMAKE_Fortran_MODDIR_DEFAULT");
  46. }
  47. if (!mod_dir.empty()) {
  48. std::string modflag =
  49. this->Makefile->GetRequiredDefinition("CMAKE_Fortran_MODDIR_FLAG");
  50. modflag += mod_dir;
  51. this->AppendFlags(flags, modflag);
  52. }
  53. // If there is a separate module path flag then duplicate the
  54. // include path with it. This compiler does not search the include
  55. // path for modules.
  56. if (const char* modpath_flag =
  57. this->Makefile->GetDefinition("CMAKE_Fortran_MODPATH_FLAG")) {
  58. std::vector<std::string> includes;
  59. this->GetIncludeDirectories(includes, target, "C", config);
  60. for (std::string const& id : includes) {
  61. std::string flg = modpath_flag;
  62. flg += this->ConvertToOutputFormat(id, cmOutputConverter::SHELL);
  63. this->AppendFlags(flags, flg);
  64. }
  65. }
  66. return flags;
  67. }
  68. void cmLocalCommonGenerator::ComputeObjectFilenames(
  69. std::map<cmSourceFile const*, std::string>& mapping,
  70. cmGeneratorTarget const* gt)
  71. {
  72. // Determine if these object files should use a custom extension
  73. char const* custom_ext = gt->GetCustomObjectExtension();
  74. for (auto& si : mapping) {
  75. cmSourceFile const* sf = si.first;
  76. bool keptSourceExtension;
  77. si.second = this->GetObjectFileNameWithoutTarget(
  78. *sf, gt->ObjectDirectory, &keptSourceExtension, custom_ext);
  79. }
  80. }