CMake/Source/cmInstallCommandArguments.h
Craig Scott 6a1fac1450
install: Normalize DESTINATION paths
The file generated by install(EXPORT) computes _IMPORT_PREFIX
in a way that assumes a normalized path. If the DESTINATION
contains any ../ components, the computed _IMPORT_PREFIX
would be wrong. Force the DESTINATION path to be normalized,
subject to the new CMP0176 policy.

Also normalize all other DESTINATION paths for consistency,
except for INCLUDES DESTINATION, which is not strictly a
destination but rather a search path to add.

Fixes: #26252
2024-09-19 20:31:47 +10:00

95 lines
2.6 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 <string>
#include <vector>
#include "cmArgumentParser.h"
#include "cmArgumentParserTypes.h"
class cmMakefile;
class cmInstallCommandArguments : public cmArgumentParser<void>
{
public:
cmInstallCommandArguments(std::string defaultComponent,
cmMakefile& makefile);
void SetGenericArguments(cmInstallCommandArguments* args)
{
this->GenericArguments = args;
}
// Compute destination path.and check permissions
bool Finalize();
const std::string& GetDestination() const;
const std::string& GetComponent() const;
const std::string& GetNamelinkComponent() const;
bool GetExcludeFromAll() const;
const std::string& GetRename() const;
const std::string& GetPermissions() const;
const std::vector<std::string>& GetConfigurations() const;
bool GetOptional() const;
bool GetNamelinkOnly() const;
bool GetNamelinkSkip() const;
bool HasNamelinkComponent() const;
const std::string& GetType() const;
const std::string& GetDefaultComponent() const;
static bool CheckPermissions(const std::string& onePerm, std::string& perm);
private:
std::string Destination;
std::string Component;
std::string NamelinkComponent;
bool ExcludeFromAll = false;
std::string Rename;
ArgumentParser::MaybeEmpty<std::vector<std::string>> Permissions;
ArgumentParser::MaybeEmpty<std::vector<std::string>> Configurations;
bool Optional = false;
bool NamelinkOnly = false;
bool NamelinkSkip = false;
std::string Type;
std::string DestinationString;
std::string PermissionsString;
cmInstallCommandArguments* GenericArguments = nullptr;
static const char* PermissionsTable[];
static const std::string EmptyString;
std::string DefaultComponentName;
bool CheckPermissions();
};
class cmInstallCommandIncludesArgument
{
public:
cmInstallCommandIncludesArgument();
void Parse(const std::vector<std::string>* args,
std::vector<std::string>* unconsumedArgs);
const std::vector<std::string>& GetIncludeDirs() const;
private:
std::vector<std::string> IncludeDirs;
};
class cmInstallCommandFileSetArguments : public cmInstallCommandArguments
{
public:
cmInstallCommandFileSetArguments(std::string defaultComponent,
cmMakefile& makefile);
void Parse(std::vector<std::string> args,
std::vector<std::string>* unconsumedArgs);
const std::string& GetFileSet() const { return this->FileSet; }
private:
std::string FileSet;
};