cmInstallDirs: Factor out helper for install directories

To enable the retrieval of the various default install directories,
introduce functions in the namespace `cm::InstallDirs`.
This commit is contained in:
Marc Chevrier
2026-03-15 09:09:51 +01:00
parent bb5da66f1f
commit 737b1da9fe
5 changed files with 214 additions and 162 deletions
+2
View File
@@ -339,6 +339,8 @@ add_library(
cmInstallAndroidMKExportGenerator.h
cmInstallCMakeConfigExportGenerator.cxx
cmInstallCMakeConfigExportGenerator.h
cmInstallDirs.cxx
cmInstallDirs.h
cmInstallGenerator.h
cmInstallGenerator.cxx
cmInstallGetRuntimeDependenciesGenerator.h
+17 -162
View File
@@ -31,6 +31,7 @@
#include "cmInstallCommandArguments.h"
#include "cmInstallCxxModuleBmiGenerator.h"
#include "cmInstallDirectoryGenerator.h"
#include "cmInstallDirs.h"
#include "cmInstallFileSetGenerator.h"
#include "cmInstallFilesGenerator.h"
#include "cmInstallGenerator.h"
@@ -108,12 +109,8 @@ public:
std::vector<std::string> const& relFiles,
std::vector<std::string>& absFiles);
std::string GetDestination(cmInstallCommandArguments const* args,
std::string const& varName,
std::string const& guess) const;
std::string GetRuntimeDestination(
cmInstallCommandArguments const* args) const;
std::string GetSbinDestination(cmInstallCommandArguments const* args) const;
std::string GetArchiveDestination(
cmInstallCommandArguments const* args) const;
std::string GetLibraryDestination(
@@ -122,24 +119,6 @@ public:
cmInstallCommandArguments const* args) const;
std::string GetIncludeDestination(
cmInstallCommandArguments const* args) const;
std::string GetSysconfDestination(
cmInstallCommandArguments const* args) const;
std::string GetSharedStateDestination(
cmInstallCommandArguments const* args) const;
std::string GetLocalStateDestination(
cmInstallCommandArguments const* args) const;
std::string GetRunStateDestination(
cmInstallCommandArguments const* args) const;
std::string GetDataRootDestination(
cmInstallCommandArguments const* args) const;
std::string GetDataDestination(cmInstallCommandArguments const* args) const;
std::string GetInfoDestination(cmInstallCommandArguments const* args) const;
std::string GetLocaleDestination(
cmInstallCommandArguments const* args) const;
std::string GetManDestination(cmInstallCommandArguments const* args) const;
std::string GetDocDestination(cmInstallCommandArguments const* args) const;
std::string GetProgramExecutablesDestination(
cmInstallCommandArguments const* args) const;
std::string GetDestinationForType(cmInstallCommandArguments const* args,
std::string const& type) const;
@@ -2626,42 +2605,31 @@ bool Helper::MakeFilesFullPath(char const* modeName,
return true;
}
std::string Helper::GetDestination(cmInstallCommandArguments const* args,
std::string const& varName,
std::string const& guess) const
std::string Helper::GetRuntimeDestination(
cmInstallCommandArguments const* args) const
{
if (args && !args->GetDestination().empty()) {
return args->GetDestination();
}
std::string val = this->Makefile->GetSafeDefinition(varName);
if (!val.empty()) {
return val;
}
return guess;
}
std::string Helper::GetRuntimeDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_BINDIR", "bin");
}
std::string Helper::GetSbinDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_SBINDIR", "sbin");
return cm::InstallDirs::GetRuntimeDirectory(this->Makefile);
}
std::string Helper::GetArchiveDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_LIBDIR", "lib");
if (args && !args->GetDestination().empty()) {
return args->GetDestination();
}
return cm::InstallDirs::GetArchiveDirectory(this->Makefile);
}
std::string Helper::GetLibraryDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_LIBDIR", "lib");
if (args && !args->GetDestination().empty()) {
return args->GetDestination();
}
return cm::InstallDirs::GetLibraryDirectory(this->Makefile);
}
std::string Helper::GetCxxModulesBmiDestination(
@@ -2676,81 +2644,10 @@ std::string Helper::GetCxxModulesBmiDestination(
std::string Helper::GetIncludeDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_INCLUDEDIR", "include");
}
std::string Helper::GetSysconfDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_SYSCONFDIR", "etc");
}
std::string Helper::GetSharedStateDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_SHAREDSTATEDIR", "com");
}
std::string Helper::GetLocalStateDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_LOCALSTATEDIR", "var");
}
std::string Helper::GetRunStateDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_RUNSTATEDIR",
this->GetLocalStateDestination(nullptr) +
"/run");
}
std::string Helper::GetDataRootDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_DATAROOTDIR", "share");
}
std::string Helper::GetDataDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_DATADIR",
this->GetDataRootDestination(nullptr));
}
std::string Helper::GetInfoDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_INFODIR",
this->GetDataRootDestination(nullptr) + "/info");
}
std::string Helper::GetLocaleDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_LOCALEDIR",
this->GetDataRootDestination(nullptr) +
"/locale");
}
std::string Helper::GetManDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_MANDIR",
this->GetDataRootDestination(nullptr) + "/man");
}
std::string Helper::GetDocDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_DOCDIR",
this->GetDataRootDestination(nullptr) + "/doc");
}
std::string Helper::GetProgramExecutablesDestination(
cmInstallCommandArguments const* args) const
{
return this->GetDestination(args, "CMAKE_INSTALL_LIBEXECDIR", "libexec");
if (args && !args->GetDestination().empty()) {
return args->GetDestination();
}
return cm::InstallDirs::GetIncludeDirectory(this->Makefile);
}
std::string Helper::GetDestinationForType(
@@ -2759,49 +2656,7 @@ std::string Helper::GetDestinationForType(
if (args && !args->GetDestination().empty()) {
return args->GetDestination();
}
if (type == "BIN") {
return this->GetRuntimeDestination(nullptr);
}
if (type == "SBIN") {
return this->GetSbinDestination(nullptr);
}
if (type == "SYSCONF") {
return this->GetSysconfDestination(nullptr);
}
if (type == "SHAREDSTATE") {
return this->GetSharedStateDestination(nullptr);
}
if (type == "LOCALSTATE") {
return this->GetLocalStateDestination(nullptr);
}
if (type == "RUNSTATE") {
return this->GetRunStateDestination(nullptr);
}
if (type == "LIB") {
return this->GetLibraryDestination(nullptr);
}
if (type == "INCLUDE") {
return this->GetIncludeDestination(nullptr);
}
if (type == "DATA") {
return this->GetDataDestination(nullptr);
}
if (type == "INFO") {
return this->GetInfoDestination(nullptr);
}
if (type == "LOCALE") {
return this->GetLocaleDestination(nullptr);
}
if (type == "MAN") {
return this->GetManDestination(nullptr);
}
if (type == "DOC") {
return this->GetDocDestination(nullptr);
}
if (type == "LIBEXEC") {
return this->GetProgramExecutablesDestination(nullptr);
}
return "";
return cm::InstallDirs::GetDirectoryForType(this->Makefile, type);
}
} // namespace
+160
View File
@@ -0,0 +1,160 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmInstallDirs.h"
#include <cmext/string_view>
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmValue.h"
namespace {
std::string GetDirectory(cmMakefile const* makefile,
std::string const& varName, std::string const& guess)
{
cmValue value = makefile->GetDefinition(varName);
if (!value.IsEmpty()) {
return value;
}
return guess;
}
} // namespace
namespace cm {
namespace InstallDirs {
std::string GetRuntimeDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_BINDIR", "bin");
}
std::string GetSbinDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_SBINDIR", "sbin");
}
std::string GetArchiveDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_LIBDIR", "lib");
}
std::string GetLibraryDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_LIBDIR", "lib");
}
std::string GetIncludeDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_INCLUDEDIR", "include");
}
std::string GetSysconfDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_SYSCONFDIR", "etc");
}
std::string GetSharedStateDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_SHAREDSTATEDIR", "com");
}
std::string GetLocalStateDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_LOCALSTATEDIR", "var");
}
std::string GetRunStateDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_RUNSTATEDIR",
cmStrCat(GetLocalStateDirectory(makefile), "/run"));
}
std::string GetDataRootDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_DATAROOTDIR", "share");
}
std::string GetDataDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_DATADIR",
GetDataRootDirectory(makefile));
}
std::string GetInfoDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_INFODIR",
cmStrCat(GetDataRootDirectory(makefile), "/info"));
}
std::string GetLocaleDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_LOCALEDIR",
cmStrCat(GetDataRootDirectory(makefile), "/locale"));
}
std::string GetManDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_MANDIR",
cmStrCat(GetDataRootDirectory(makefile), "/man"));
}
std::string GetDocDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_DOCDIR",
cmStrCat(GetDataRootDirectory(makefile), "/doc"));
}
std::string GetLibExecDirectory(cmMakefile const* makefile)
{
return GetDirectory(makefile, "CMAKE_INSTALL_LIBEXECDIR", "libexec");
}
std::string GetDirectoryForType(cmMakefile const* makefile,
cm::string_view type)
{
if (type == "BIN"_s) {
return GetRuntimeDirectory(makefile);
}
if (type == "SBIN"_s) {
return GetSbinDirectory(makefile);
}
if (type == "SYSCONF"_s) {
return GetSysconfDirectory(makefile);
}
if (type == "SHAREDSTATE"_s) {
return GetSharedStateDirectory(makefile);
}
if (type == "LOCALSTATE"_s) {
return GetLocalStateDirectory(makefile);
}
if (type == "RUNSTATE"_s) {
return GetRunStateDirectory(makefile);
}
if (type == "LIB"_s) {
return GetLibraryDirectory(makefile);
}
if (type == "INCLUDE"_s) {
return GetIncludeDirectory(makefile);
}
if (type == "DATA"_s) {
return GetDataDirectory(makefile);
}
if (type == "INFO"_s) {
return GetInfoDirectory(makefile);
}
if (type == "LOCALE"_s) {
return GetLocaleDirectory(makefile);
}
if (type == "MAN"_s) {
return GetManDirectory(makefile);
}
if (type == "DOC"_s) {
return GetDocDirectory(makefile);
}
if (type == "LIBEXEC"_s) {
return GetLibExecDirectory(makefile);
}
return std::string{};
}
} // namespace InstallDirs
} // namespace cm
+34
View File
@@ -0,0 +1,34 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include <string>
#include <cm/string_view>
class cmMakefile;
namespace cm {
namespace InstallDirs {
std::string GetRuntimeDirectory(cmMakefile const*);
std::string GetSbinDirectory(cmMakefile const*);
std::string GetArchiveDirectory(cmMakefile const*);
std::string GetLibraryDirectory(cmMakefile const*);
std::string GetIncludeDirectory(cmMakefile const*);
std::string GetSysconfDirectory(cmMakefile const*);
std::string GetSharedStateDirectory(cmMakefile const*);
std::string GetLocalStateDirectory(cmMakefile const*);
std::string GetRunStateDirectory(cmMakefile const*);
std::string GetDataRootDirectory(cmMakefile const*);
std::string GetDataDirectory(cmMakefile const*);
std::string GetInfoDirectory(cmMakefile const*);
std::string GetLocaleDirectory(cmMakefile const*);
std::string GetManDirectory(cmMakefile const*);
std::string GetDocDirectory(cmMakefile const*);
std::string GetLibExecDirectory(cmMakefile const*);
std::string GetDirectoryForType(cmMakefile const*, cm::string_view type);
}
}
+1
View File
@@ -427,6 +427,7 @@ CMAKE_CXX_SOURCES="\
cmInstallGenerator \
cmInstallGetRuntimeDependenciesGenerator \
cmInstallImportedRuntimeArtifactsGenerator \
cmInstallDirs \
cmInstallRuntimeDependencySet \
cmInstallRuntimeDependencySetGenerator \
cmInstallScriptGenerator \