/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#ifndef cmExportTryCompileFileGenerator_h
#define cmExportTryCompileFileGenerator_h

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

#include "cmExportFileGenerator.h"

#include <iosfwd>
#include <set>
#include <string>
#include <vector>

class cmGeneratorTarget;
class cmGlobalGenerator;
class cmMakefile;

class cmExportTryCompileFileGenerator : public cmExportFileGenerator
{
public:
    cmExportTryCompileFileGenerator(cmGlobalGenerator*              gg,
                                    std::vector<std::string> const& targets,
                                    cmMakefile*                     mf,
                                    std::set<std::string> const&    langs);

    /** Set the list of targets to export.  */
    void SetConfig(const std::string& config) { this->Config = config; }

protected:
    // Implement virtual methods from the superclass.
    bool GenerateMainFile(std::ostream& os) override;

    void GenerateImportTargetsConfig(std::ostream&, const std::string&,
                                     std::string const&,
                                     std::vector<std::string>&) override
    {}
    void HandleMissingTarget(std::string&, std::vector<std::string>&,
                             cmGeneratorTarget*, cmGeneratorTarget*) override
    {}

    void PopulateProperties(cmGeneratorTarget const*            target,
                            ImportPropertyMap&                  properties,
                            std::set<const cmGeneratorTarget*>& emitted);

    std::string InstallNameDir(cmGeneratorTarget* target,
                               const std::string& config) override;

private:
    std::string FindTargets(const std::string&                  prop,
                            const cmGeneratorTarget*            tgt,
                            std::string const&                  language,
                            std::set<const cmGeneratorTarget*>& emitted);

    std::vector<cmGeneratorTarget const*> Exports;
    std::string                           Config;
    std::vector<std::string>              Languages;
};

#endif
