From d5ae2f97545bb599151d0d6fa818d3e84867514f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 27 Feb 2021 17:35:56 +0100 Subject: FreeBSD: fix up the package name When using libpkg, the output filename is determined by libpkg itself, based on information in the manifest: package name and version, basically. This doesn't necessarily match the name that CMake has determined via CPACK_TEMPORARY_PACKAGE_FILE_NAME or CPACK_PACKAGE_FILE_NAME. So reset the CMake-determined list to match what libpkg will do. --- Modules/Internal/CPack/CPackFreeBSD.cmake | 2 +- Source/CPack/cmCPackFreeBSDGenerator.cxx | 41 ++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Modules/Internal/CPack/CPackFreeBSD.cmake b/Modules/Internal/CPack/CPackFreeBSD.cmake index ae40532..c35089c 100644 --- a/Modules/Internal/CPack/CPackFreeBSD.cmake +++ b/Modules/Internal/CPack/CPackFreeBSD.cmake @@ -34,7 +34,7 @@ function(_cpack_freebsd_fallback_var OUTPUT_VAR_NAME) endif() endforeach() if(NOT VALUE) - message(WARNING "Variable ${OUTPUT_VAR_NAME} could not be given a fallback value from any variable ${FALLBACK_VAR_NAMES}.") + message(WARNING "Variable ${OUTPUT_VAR_NAME} could not be given a fallback value from (any of) ${FALLBACK_VAR_NAMES}.") endif() endfunction() diff --git a/Source/CPack/cmCPackFreeBSDGenerator.cxx b/Source/CPack/cmCPackFreeBSDGenerator.cxx index 5876fb9..5e91214 100644 --- a/Source/CPack/cmCPackFreeBSDGenerator.cxx +++ b/Source/CPack/cmCPackFreeBSDGenerator.cxx @@ -21,8 +21,12 @@ #include +// Suffix including the '.', used to tell libpkg what compression to use +static const char FreeBSDPackageSuffix[] = ".txz"; + cmCPackFreeBSDGenerator::cmCPackFreeBSDGenerator() - : cmCPackArchiveGenerator(cmArchiveWrite::CompressXZ, "paxr", ".txz") + : cmCPackArchiveGenerator(cmArchiveWrite::CompressXZ, "paxr", + FreeBSDPackageSuffix) { } @@ -57,7 +61,7 @@ public: { if (d) { - pkg_create_set_format(d, "txz"); + pkg_create_set_format(d, FreeBSDPackageSuffix + 1); // Skip over the '.' pkg_create_set_compression_level(d, 0); // Explicitly set default pkg_create_set_overwrite(d, false); pkg_create_set_rootdir(d, toplevel_dir.c_str()); @@ -321,7 +325,7 @@ void write_manifest_files(cmGeneratedFileStream& s, s << "\"files\": {\n"; for (std::string const& file : files) { s << " \"/" << cmSystemTools::RelativePath(toplevel, file) << "\": \"" - << "" + << "" // this gets replaced by libpkg by the actual SHA256 << "\",\n"; } s << " },\n"; @@ -335,7 +339,6 @@ int cmCPackFreeBSDGenerator::PackageFiles() return 0; } - std::vector::const_iterator fileIt; cmWorkingDirectory wd(toplevel); files.erase(std::remove_if(files.begin(), files.end(), ignore_file), @@ -367,6 +370,32 @@ int cmCPackFreeBSDGenerator::PackageFiles() ONE_PACKAGE_PER_COMPONENT); } + // There should be one name in the packageFileNames (already, see comment + // in cmCPackGenerator::DoPackage(), which holds what CPack guesses + // will be the package filename. libpkg does something else, though, + // so update the single filename to what we know will be right. + if (this->packageFileNames.size() == 1) { + std::string currentPackage = this->packageFileNames[0]; + int lastSlash = currentPackage.rfind('/'); + + // If there is a pathname, preserve that; libpkg will write out + // a file with the package name and version as specified in the + // manifest, so we look those up (again). lastSlash is the slash + // itself, we need that as path separator to the calculated package name. + std::string actualPackage = + ((lastSlash != std::string::npos) + ? std::string(currentPackage, 0, lastSlash + 1) + : std::string()) + + var_lookup("CPACK_FREEBSD_PACKAGE_NAME") + '-' + + var_lookup("CPACK_FREEBSD_PACKAGE_VERSION") + FreeBSDPackageSuffix; + + this->packageFileNames.clear(); + this->packageFileNames.emplace_back(actualPackage); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "Real filename:" << this->packageFileNames[0] << std::endl); + } + if (!pkg_initialized() && pkg_init(NULL, NULL) != EPKG_OK) { cmCPackLogger(cmCPackLog::LOG_ERROR, "Can not initialize FreeBSD libpkg." << std::endl); @@ -388,12 +417,12 @@ int cmCPackFreeBSDGenerator::PackageFiles() } std::string broken_suffix = - cmStrCat('-', var_lookup("CPACK_TOPLEVEL_TAG"), ".txz"); + cmStrCat('-', var_lookup("CPACK_TOPLEVEL_TAG"), FreeBSDPackageSuffix); for (std::string& name : packageFileNames) { cmCPackLogger(cmCPackLog::LOG_DEBUG, "Packagefile " << name << std::endl); if (cmHasSuffix(name, broken_suffix)) { name.replace(name.size() - broken_suffix.size(), std::string::npos, - ".txz"); + FreeBSDPackageSuffix); break; } } -- cgit v0.12