/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <iosfwd>
#include <string>

#include "cmInstallGenerator.h"
#include "cmListFileCache.h"

class cmLocalGenerator;

/** \class cmInstallScriptGenerator
 * \brief Generate target installation rules.
 */
class cmInstallScriptGenerator : public cmInstallGenerator
{
public:
  cmInstallScriptGenerator(
    std::string script, bool code, std::string const& component,
    bool exclude_from_all, bool all_components,
    cmListFileBacktrace backtrace = cmListFileBacktrace());
  ~cmInstallScriptGenerator() override;

  bool Compute(cmLocalGenerator* lg) override;

  bool IsCode() const { return this->Code; }

  std::string GetScript(std::string const& config) const;

protected:
  void GenerateScriptActions(std::ostream& os, Indent indent) override;
  void GenerateScriptForConfig(std::ostream& os, std::string const& config,
                               Indent indent) override;
  void AddScriptInstallRule(std::ostream& os, Indent indent,
                            std::string const& script) const;

  std::string const Script;
  bool const Code;
  cmLocalGenerator* LocalGenerator;
  bool AllowGenex = false;
};
