cmScriptGenerator.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. public:
  46. cmScriptGenerator(const std::string& config_var,
  47. std::vector<std::string> const& configurations);
  48. virtual ~cmScriptGenerator();
  49. void Generate(std::ostream& os, const std::string& config,
  50. std::vector<std::string> const& configurationTypes);
  51. protected:
  52. typedef cmScriptGeneratorIndent Indent;
  53. virtual void GenerateScript(std::ostream& os);
  54. virtual void GenerateScriptConfigs(std::ostream& os, Indent indent);
  55. virtual void GenerateScriptActions(std::ostream& os, Indent indent);
  56. virtual void GenerateScriptForConfig(std::ostream& os,
  57. const std::string& config,
  58. Indent indent);
  59. virtual void GenerateScriptNoConfig(std::ostream&, Indent) {}
  60. virtual bool NeedsScriptNoConfig() const { return false; }
  61. // Test if this generator does something for a given configuration.
  62. bool GeneratesForConfig(const std::string&);
  63. std::string CreateConfigTest(const std::string& config);
  64. std::string CreateConfigTest(std::vector<std::string> const& configs);
  65. std::string CreateComponentTest(const char* component);
  66. // Information shared by most generator types.
  67. std::string RuntimeConfigVariable;
  68. std::vector<std::string> const Configurations;
  69. // Information used during generation.
  70. std::string ConfigurationName;
  71. std::vector<std::string> const* ConfigurationTypes;
  72. // True if the subclass needs to generate an explicit rule for each
  73. // configuration. False if the subclass only generates one rule for
  74. // all enabled configurations.
  75. bool ActionsPerConfig;
  76. private:
  77. cmScriptGenerator(cmScriptGenerator const&);
  78. cmScriptGenerator& operator=(cmScriptGenerator const&);
  79. void GenerateScriptActionsOnce(std::ostream& os, Indent indent);
  80. void GenerateScriptActionsPerConfig(std::ostream& os, Indent indent);
  81. };
  82. #endif