mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-10 17:14:10 +00:00
CPack/DEB: use triggers instead of legacy postXXX scripts for ldconfig
This commit is contained in:
@@ -870,8 +870,37 @@ function(cpack_deb_prepare_package_vars)
|
||||
endforeach()
|
||||
|
||||
if(_PACKAGE_HAS_SHARED_LIBS)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTINST 1)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTRM 1)
|
||||
# Expecting a modern distro to generate `debian/triggers` instead
|
||||
# of legacy `ldconfig` calls from postinst/postrm
|
||||
set(_dpkg_is_old FALSE)
|
||||
if(DPKG_EXECUTABLE)
|
||||
execute_process(
|
||||
COMMAND "${DPKG_EXECUTABLE}" --version
|
||||
OUTPUT_VARIABLE DPKG_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
set(_dpkg_version_re "Debian 'dpkg' package management program version ([0-9]+\.[0-9]+\.[0-9]+).*")
|
||||
if(DPKG_VERSION MATCHES "${_dpkg_version_re}")
|
||||
set(DPKG_VERSION "${CMAKE_MATCH_1}")
|
||||
if(DPKG_VERSION VERSION_LESS 1.18.3)
|
||||
set(_dpkg_is_old TRUE)
|
||||
endif()
|
||||
else()
|
||||
set(_dpkg_is_old TRUE)
|
||||
endif()
|
||||
else()
|
||||
set(_dpkg_is_old TRUE)
|
||||
endif()
|
||||
if(_dpkg_is_old)
|
||||
set(CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS 0)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTINST 1)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTRM 1)
|
||||
message(STATUS "CPackDeb: Providing legacy postinst/postrm.")
|
||||
else()
|
||||
set(CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS 1)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTINST 0)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTRM 0)
|
||||
endif()
|
||||
foreach(control_file IN LISTS CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA)
|
||||
cmake_path(GET control_file FILENAME name)
|
||||
if(name STREQUAL "postinst")
|
||||
@@ -880,8 +909,12 @@ function(cpack_deb_prepare_package_vars)
|
||||
if(name STREQUAL "postrm")
|
||||
set(CPACK_DEBIAN_GENERATE_POSTRM 0)
|
||||
endif()
|
||||
if(name STREQUAL "triggers")
|
||||
set(CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS 0)
|
||||
endif()
|
||||
endforeach()
|
||||
else()
|
||||
set(CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS 0)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTINST 0)
|
||||
set(CPACK_DEBIAN_GENERATE_POSTRM 0)
|
||||
endif()
|
||||
@@ -991,6 +1024,8 @@ function(cpack_deb_prepare_package_vars)
|
||||
"${CPACK_DEBIAN_PACKAGE_SOURCE}" PARENT_SCOPE)
|
||||
set(GEN_CPACK_DEBIAN_GENERATE_POSTINST "${CPACK_DEBIAN_GENERATE_POSTINST}" PARENT_SCOPE)
|
||||
set(GEN_CPACK_DEBIAN_GENERATE_POSTRM "${CPACK_DEBIAN_GENERATE_POSTRM}" PARENT_SCOPE)
|
||||
set(GEN_CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS
|
||||
"${CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS}" PARENT_SCOPE)
|
||||
set(GEN_WDIR "${WDIR}" PARENT_SCOPE)
|
||||
|
||||
set(GEN_CPACK_DEBIAN_DEBUGINFO_PACKAGE "${CPACK_DEBIAN_DEBUGINFO_PACKAGE}" PARENT_SCOPE)
|
||||
|
||||
@@ -37,7 +37,8 @@ public:
|
||||
std::map<std::string, std::string> controlValues,
|
||||
bool genShLibs, std::string shLibsFilename, bool genPostInst,
|
||||
std::string postInst, bool genPostRm, std::string postRm,
|
||||
cmValue controlExtra, bool permissionStrctPolicy,
|
||||
bool genTriggers, std::string triggers, cmValue controlExtra,
|
||||
bool permissionStrctPolicy,
|
||||
std::vector<std::string> packageFiles);
|
||||
|
||||
bool generate() const;
|
||||
@@ -65,6 +66,8 @@ private:
|
||||
std::string const PostInst;
|
||||
bool const GenPostRm;
|
||||
std::string const PostRm;
|
||||
bool const GenTriggers;
|
||||
std::string const Triggers;
|
||||
cmValue ControlExtra;
|
||||
bool const PermissionStrictPolicy;
|
||||
std::vector<std::string> const PackageFiles;
|
||||
@@ -78,8 +81,8 @@ DebGenerator::DebGenerator(
|
||||
cmValue debCompressionType, cmValue debCompressionLevel, cmValue numThreads,
|
||||
cmValue debianArchiveType, std::map<std::string, std::string> controlValues,
|
||||
bool genShLibs, std::string shLibsFilename, bool genPostInst,
|
||||
std::string postInst, bool genPostRm, std::string postRm,
|
||||
cmValue controlExtra, bool permissionStrictPolicy,
|
||||
std::string postInst, bool genPostRm, std::string postRm, bool genTriggers,
|
||||
std::string triggers, cmValue controlExtra, bool permissionStrictPolicy,
|
||||
std::vector<std::string> packageFiles)
|
||||
: Logger(logger)
|
||||
, OutputName(std::move(outputName))
|
||||
@@ -94,6 +97,8 @@ DebGenerator::DebGenerator(
|
||||
, PostInst(std::move(postInst))
|
||||
, GenPostRm(genPostRm)
|
||||
, PostRm(std::move(postRm))
|
||||
, GenTriggers(genTriggers)
|
||||
, Triggers(std::move(triggers))
|
||||
, ControlExtra(controlExtra)
|
||||
, PermissionStrictPolicy(permissionStrictPolicy)
|
||||
, PackageFiles(std::move(packageFiles))
|
||||
@@ -429,14 +434,28 @@ bool DebGenerator::generateControlTar(std::string const& md5Filename) const
|
||||
control_tar.SetPermissions(permission644);
|
||||
}
|
||||
|
||||
if (this->GenTriggers) {
|
||||
if (!control_tar.Add(this->Triggers, this->WorkDir.length(), ".")) {
|
||||
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
||||
"Error adding file to tar:\n"
|
||||
"#top level directory: "
|
||||
<< this->WorkDir
|
||||
<< "\n"
|
||||
"#file: \"triggers\"\n"
|
||||
"#error:"
|
||||
<< control_tar.GetError() << std::endl);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// for the other files, we use
|
||||
// -either the original permission on the files
|
||||
// -either a permission strictly defined by the Debian policies
|
||||
if (this->ControlExtra) {
|
||||
// permissions are now controlled by the original file permissions
|
||||
|
||||
static char const* strictFiles[] = { "config", "postinst", "postrm",
|
||||
"preinst", "prerm" };
|
||||
static char const* strictFiles[] = { "config", "postinst", "postrm",
|
||||
"preinst", "prerm", "triggers" };
|
||||
std::set<std::string> setStrictFiles(
|
||||
strictFiles, strictFiles + sizeof(strictFiles) / sizeof(strictFiles[0]));
|
||||
|
||||
@@ -837,6 +856,7 @@ bool cmCPackDebGenerator::createDeb()
|
||||
|
||||
std::string const postinst = strGenWDIR + "/postinst";
|
||||
std::string const postrm = strGenWDIR + "/postrm";
|
||||
std::string const triggers = strGenWDIR + "/triggers";
|
||||
if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST")) {
|
||||
cmGeneratedFileStream out;
|
||||
out.Open(postinst, false, true);
|
||||
@@ -855,6 +875,11 @@ bool cmCPackDebGenerator::createDeb()
|
||||
"\tldconfig\n"
|
||||
"fi\n";
|
||||
}
|
||||
if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS")) {
|
||||
cmGeneratedFileStream out;
|
||||
out.Open(triggers, false, true);
|
||||
out << "activate-noawait ldconfig\n";
|
||||
}
|
||||
|
||||
DebGenerator gen(
|
||||
this->Logger, this->GetOption("GEN_CPACK_OUTPUT_FILE_NAME"), strGenWDIR,
|
||||
@@ -866,6 +891,7 @@ bool cmCPackDebGenerator::createDeb()
|
||||
this->GetOption("GEN_CPACK_DEBIAN_ARCHIVE_TYPE"), controlValues, gen_shibs,
|
||||
shlibsfilename, this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST"), postinst,
|
||||
this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM"), postrm,
|
||||
this->IsOn("GEN_CPACK_DEBIAN_GENERATE_LDCONFIG_TRIGGERS"), triggers,
|
||||
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA"),
|
||||
this->IsSet("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION"),
|
||||
this->packageFiles);
|
||||
@@ -920,7 +946,7 @@ bool cmCPackDebGenerator::createDbgsymDDeb()
|
||||
this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_LEVEL"),
|
||||
this->GetOption("CPACK_THREADS"),
|
||||
this->GetOption("GEN_CPACK_DEBIAN_ARCHIVE_TYPE"), controlValues, false, "",
|
||||
false, "", false, "", nullptr,
|
||||
false, "", false, "", false, "", nullptr,
|
||||
this->IsSet("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION"),
|
||||
this->packageFiles);
|
||||
|
||||
|
||||
@@ -1,8 +1,38 @@
|
||||
find_program(DPKG_EXECUTABLE dpkg)
|
||||
set(_dpkg_is_old FALSE)
|
||||
if(DPKG_EXECUTABLE)
|
||||
execute_process(
|
||||
COMMAND "${DPKG_EXECUTABLE}" --version
|
||||
OUTPUT_VARIABLE DPKG_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
set(_dpkg_version_re "Debian 'dpkg' package management program version ([0-9]+\.[0-9]+\.[0-9]+).*")
|
||||
if(DPKG_VERSION MATCHES "${_dpkg_version_re}")
|
||||
set(DPKG_VERSION "${CMAKE_MATCH_1}")
|
||||
if(DPKG_VERSION VERSION_LESS 1.18.3)
|
||||
set(_dpkg_is_old TRUE)
|
||||
endif()
|
||||
else()
|
||||
set(_dpkg_is_old TRUE)
|
||||
endif()
|
||||
else()
|
||||
set(_dpkg_is_old TRUE)
|
||||
endif()
|
||||
|
||||
set(expected_files shlibs)
|
||||
set(shlibs_shlibs "^libtest_lib 0\\.8 generate_shlibs_ldconfig \\(>\\= 0\\.1\\.1\\)\n$")
|
||||
# NOTE: optional dot at the end of permissions regex is for SELinux enabled systems
|
||||
set(shlibs_shlibs_permissions_regex "-rw-r--r--\.? .*")
|
||||
set(shlibs_postinst ".*ldconfig.*")
|
||||
set(shlibs_postinst_permissions_regex "-rwxr-xr-x\.? .*")
|
||||
set(shlibs_postrm ".*ldconfig.*")
|
||||
set(shlibs_postrm_permissions_regex "-rwxr-xr-x\.? .*")
|
||||
verifyDebControl("${FOUND_FILE_1}" "shlibs" "shlibs;postinst;postrm")
|
||||
if(_dpkg_is_old)
|
||||
list(APPEND expected_files postinst postrm)
|
||||
set(shlibs_postinst ".*ldconfig.*")
|
||||
set(shlibs_postinst_permissions_regex "-rwxr-xr-x\.? .*")
|
||||
|
||||
set(shlibs_postrm ".*ldconfig.*")
|
||||
set(shlibs_postrm_permissions_regex "-rwxr-xr-x\.? .*")
|
||||
else()
|
||||
list(APPEND expected_files triggers)
|
||||
set(triggers_postrm ".*ldconfig.*")
|
||||
set(triggers_postrm_permissions_regex "-rw-r--r--\.? .*")
|
||||
endif()
|
||||
verifyDebControl("${FOUND_FILE_1}" "shlibs" "${expected_files}")
|
||||
|
||||
Reference in New Issue
Block a user