mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-31 02:39:48 -06:00
In order to support generation of Common Package Specifications, the mechanisms CMake uses to export package information need to be made more abstract. The prior commits began this refactoring; this continues by (actually) restructuring the classes used to generate the actual export files. To minimize churn, this introduces virtual base classes and diamond inheritance in order to separate logic which is format-agnostic but depends on the export mode (build-tree versus install-tree) from logic which is format-specific but mode-agnostic. This could probably be refactored further to use helper classes instead, and a future commit may do that, however an initial attempt to do that was proving even more invasive, such that this approach was deemed more manageable. While we're at it, add 'const' in more places where possible.
171 lines
6.2 KiB
C++
171 lines
6.2 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <functional>
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include <cm/string_view>
|
|
|
|
#include "cmExportFileGenerator.h"
|
|
#include "cmGeneratorExpression.h"
|
|
#include "cmInstallExportGenerator.h"
|
|
#include "cmStateTypes.h"
|
|
|
|
class cmExportSet;
|
|
class cmGeneratorTarget;
|
|
class cmGlobalGenerator;
|
|
class cmInstallTargetGenerator;
|
|
class cmTargetExport;
|
|
|
|
/** \class cmExportInstallFileGenerator
|
|
* \brief Generate a file exporting targets from an install tree.
|
|
*
|
|
* cmExportInstallFileGenerator is the generic interface class for generating
|
|
* export files for an install tree.
|
|
*/
|
|
class cmExportInstallFileGenerator : virtual public cmExportFileGenerator
|
|
{
|
|
public:
|
|
/** Construct with the export installer that will install the
|
|
files. */
|
|
cmExportInstallFileGenerator(cmInstallExportGenerator* iegen);
|
|
|
|
/** Get the per-config file generated for each configuration. This
|
|
maps from the configuration name to the file temporary location
|
|
for installation. */
|
|
std::map<std::string, std::string> const& GetConfigImportFiles()
|
|
{
|
|
return this->ConfigImportFiles;
|
|
}
|
|
|
|
/** Get the temporary location of the config-agnostic C++ module file. */
|
|
std::string GetCxxModuleFile() const;
|
|
|
|
/** Get the per-config C++ module file generated for each configuration.
|
|
This maps from the configuration name to the file temporary location
|
|
for installation. */
|
|
std::map<std::string, std::string> const& GetConfigCxxModuleFiles()
|
|
{
|
|
return this->ConfigCxxModuleFiles;
|
|
}
|
|
|
|
/** Get the per-config C++ module file generated for each configuration.
|
|
This maps from the configuration name to the file temporary location
|
|
for installation for each target in the export set. */
|
|
std::map<std::string, std::vector<std::string>> const&
|
|
GetConfigCxxModuleTargetFiles()
|
|
{
|
|
return this->ConfigCxxModuleTargetFiles;
|
|
}
|
|
|
|
/** Compute the globbing expression used to load per-config import
|
|
files from the main file. */
|
|
virtual std::string GetConfigImportFileGlob() const = 0;
|
|
|
|
protected:
|
|
cmStateEnums::TargetType GetExportTargetType(
|
|
cmTargetExport const* targetExport) const;
|
|
|
|
virtual std::string const& GetExportName() const;
|
|
|
|
std::string GetInstallPrefix() const
|
|
{
|
|
cm::string_view const& prefixWithSlash = this->GetImportPrefixWithSlash();
|
|
return std::string(prefixWithSlash.data(), prefixWithSlash.length() - 1);
|
|
}
|
|
|
|
void HandleMissingTarget(std::string& link_libs,
|
|
cmGeneratorTarget const* depender,
|
|
cmGeneratorTarget* dependee) override;
|
|
|
|
void ReplaceInstallPrefix(std::string& input) const override;
|
|
|
|
void ComplainAboutMissingTarget(
|
|
cmGeneratorTarget const* depender, cmGeneratorTarget const* dependee,
|
|
std::vector<std::string> const& exportFiles) const;
|
|
|
|
void ComplainAboutDuplicateTarget(
|
|
std::string const& targetName) const override;
|
|
|
|
std::pair<std::vector<std::string>, std::string> FindNamespaces(
|
|
cmGlobalGenerator* gg, std::string const& name) const;
|
|
|
|
void ReportError(std::string const& errorMessage) const override;
|
|
|
|
/** Fill in properties indicating installed file locations. */
|
|
void SetImportLocationProperty(std::string const& config,
|
|
std::string const& suffix,
|
|
cmInstallTargetGenerator* itgen,
|
|
ImportPropertyMap& properties,
|
|
std::set<std::string>& importedLocations);
|
|
|
|
std::string InstallNameDir(cmGeneratorTarget const* target,
|
|
std::string const& config) override;
|
|
|
|
using cmExportFileGenerator::GetCxxModuleFile;
|
|
|
|
/** Walk the list of targets to be exported. Returns true iff no duplicates
|
|
are found. */
|
|
bool CollectExports(
|
|
std::function<void(cmTargetExport const*)> const& visitor);
|
|
|
|
cmExportSet* GetExportSet() const override
|
|
{
|
|
return this->IEGen->GetExportSet();
|
|
}
|
|
|
|
std::string GetImportXcFrameworkLocation(
|
|
std::string const& config, cmTargetExport const* targetExport) const;
|
|
|
|
using cmExportFileGenerator::PopulateInterfaceProperties;
|
|
bool PopulateInterfaceProperties(cmTargetExport const* targetExport,
|
|
ImportPropertyMap& properties);
|
|
|
|
void PopulateImportProperties(std::string const& config,
|
|
std::string const& suffix,
|
|
cmTargetExport const* targetExport,
|
|
ImportPropertyMap& properties,
|
|
std::set<std::string>& importedLocations);
|
|
|
|
cmInstallExportGenerator* IEGen;
|
|
|
|
// The import file generated for each configuration.
|
|
std::map<std::string, std::string> ConfigImportFiles;
|
|
// The C++ module property file generated for each configuration.
|
|
std::map<std::string, std::string> ConfigCxxModuleFiles;
|
|
// The C++ module property target files generated for each configuration.
|
|
std::map<std::string, std::vector<std::string>> ConfigCxxModuleTargetFiles;
|
|
|
|
private:
|
|
void PopulateCompatibleInterfaceProperties(cmGeneratorTarget const* target,
|
|
ImportPropertyMap& properties);
|
|
void PopulateCustomTransitiveInterfaceProperties(
|
|
cmGeneratorTarget const* target,
|
|
cmGeneratorExpression::PreprocessContext preprocessRule,
|
|
ImportPropertyMap& properties);
|
|
void PopulateIncludeDirectoriesInterface(
|
|
cmGeneratorTarget const* target,
|
|
cmGeneratorExpression::PreprocessContext preprocessRule,
|
|
ImportPropertyMap& properties, cmTargetExport const& te,
|
|
std::string& includesDestinationDirs);
|
|
void PopulateSourcesInterface(
|
|
cmGeneratorTarget const* target,
|
|
cmGeneratorExpression::PreprocessContext preprocessRule,
|
|
ImportPropertyMap& properties);
|
|
void PopulateLinkDirectoriesInterface(
|
|
cmGeneratorTarget const* target,
|
|
cmGeneratorExpression::PreprocessContext preprocessRule,
|
|
ImportPropertyMap& properties);
|
|
void PopulateLinkDependsInterface(
|
|
cmGeneratorTarget const* target,
|
|
cmGeneratorExpression::PreprocessContext preprocessRule,
|
|
ImportPropertyMap& properties);
|
|
};
|