cmScriptGenerator.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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() = default;
  13. cmScriptGeneratorIndent(int level)
  14. : Level(level)
  15. {
  16. }
  17. void Write(std::ostream& os) const
  18. {
  19. for (int i = 0; i < this->Level; ++i) {
  20. os << " ";
  21. }
  22. }
  23. cmScriptGeneratorIndent Next(int step = 2) const
  24. {
  25. return { this->Level + step };
  26. }
  27. private:
  28. int Level = 0;
  29. };
  30. inline std::ostream& operator<<(std::ostream& os,
  31. cmScriptGeneratorIndent indent)
  32. {
  33. indent.Write(os);
  34. return os;
  35. }
  36. /** \class cmScriptGenerator
  37. * \brief Support class for generating install and test scripts.
  38. *
  39. */
  40. class cmScriptGenerator
  41. {
  42. public:
  43. cmScriptGenerator(std::string config_var,
  44. std::vector<std::string> configurations);
  45. virtual ~cmScriptGenerator();
  46. cmScriptGenerator(cmScriptGenerator const&) = delete;
  47. cmScriptGenerator& operator=(cmScriptGenerator const&) = delete;
  48. void Generate(std::ostream& os, const std::string& config,
  49. std::vector<std::string> const& configurationTypes);
  50. protected:
  51. using Indent = cmScriptGeneratorIndent;
  52. virtual void GenerateScript(std::ostream& os);
  53. virtual void GenerateScriptConfigs(std::ostream& os, Indent indent);
  54. virtual void GenerateScriptActions(std::ostream& os, Indent indent);
  55. virtual void GenerateScriptForConfig(std::ostream& os,
  56. const std::string& config,
  57. Indent indent);
  58. virtual void GenerateScriptNoConfig(std::ostream&, Indent) {}
  59. virtual bool NeedsScriptNoConfig() const { return false; }
  60. // Test if this generator does something for a given configuration.
  61. bool GeneratesForConfig(const std::string&);
  62. std::string CreateConfigTest(const std::string& config);
  63. std::string CreateConfigTest(std::vector<std::string> const& configs);
  64. std::string CreateComponentTest(const char* component);
  65. // Information shared by most generator types.
  66. std::string RuntimeConfigVariable;
  67. std::vector<std::string> const Configurations;
  68. // Information used during generation.
  69. std::string ConfigurationName;
  70. std::vector<std::string> const* ConfigurationTypes;
  71. // True if the subclass needs to generate an explicit rule for each
  72. // configuration. False if the subclass only generates one rule for
  73. // all enabled configurations.
  74. bool ActionsPerConfig;
  75. private:
  76. void GenerateScriptActionsOnce(std::ostream& os, Indent indent);
  77. void GenerateScriptActionsPerConfig(std::ostream& os, Indent indent);
  78. };
  79. #endif