cmScriptGenerator.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #ifndef cmScriptGenerator_h
  4. #define cmScriptGenerator_h
  5. #include "cmConfigure.h" // IWYU pragma: keep
  6. #include <ostream>
  7. #include <string>
  8. #include <vector>
  9. class cmScriptGeneratorIndent
  10. {
  11. public:
  12. cmScriptGeneratorIndent()
  13. : Level(0)
  14. {
  15. }
  16. cmScriptGeneratorIndent(int level)
  17. : Level(level)
  18. {
  19. }
  20. void Write(std::ostream& os) const
  21. {
  22. for (int i = 0; i < this->Level; ++i) {
  23. os << " ";
  24. }
  25. }
  26. cmScriptGeneratorIndent Next(int step = 2) const
  27. {
  28. return cmScriptGeneratorIndent(this->Level + step);
  29. }
  30. private:
  31. int Level;
  32. };
  33. inline std::ostream& operator<<(std::ostream& os,
  34. cmScriptGeneratorIndent indent)
  35. {
  36. indent.Write(os);
  37. return os;
  38. }
  39. /** \class cmScriptGenerator
  40. * \brief Support class for generating install and test scripts.
  41. *
  42. */
  43. class cmScriptGenerator
  44. {
  45. CM_DISABLE_COPY(cmScriptGenerator)
  46. public:
  47. cmScriptGenerator(const std::string& config_var,
  48. std::vector<std::string> const& configurations);
  49. virtual ~cmScriptGenerator();
  50. void Generate(std::ostream& os, const std::string& config,
  51. std::vector<std::string> const& configurationTypes);
  52. protected:
  53. typedef cmScriptGeneratorIndent Indent;
  54. virtual void GenerateScript(std::ostream& os);
  55. virtual void GenerateScriptConfigs(std::ostream& os, Indent indent);
  56. virtual void GenerateScriptActions(std::ostream& os, Indent indent);
  57. virtual void GenerateScriptForConfig(std::ostream& os,
  58. const std::string& config,
  59. Indent indent);
  60. virtual void GenerateScriptNoConfig(std::ostream&, Indent) {}
  61. virtual bool NeedsScriptNoConfig() const { return false; }
  62. // Test if this generator does something for a given configuration.
  63. bool GeneratesForConfig(const std::string&);
  64. std::string CreateConfigTest(const std::string& config);
  65. std::string CreateConfigTest(std::vector<std::string> const& configs);
  66. std::string CreateComponentTest(const char* component);
  67. // Information shared by most generator types.
  68. std::string RuntimeConfigVariable;
  69. std::vector<std::string> const Configurations;
  70. // Information used during generation.
  71. std::string ConfigurationName;
  72. std::vector<std::string> const* ConfigurationTypes;
  73. // True if the subclass needs to generate an explicit rule for each
  74. // configuration. False if the subclass only generates one rule for
  75. // all enabled configurations.
  76. bool ActionsPerConfig;
  77. private:
  78. void GenerateScriptActionsOnce(std::ostream& os, Indent indent);
  79. void GenerateScriptActionsPerConfig(std::ostream& os, Indent indent);
  80. };
  81. #endif