From 5beb1da7f741c50659204cf1fbd264b5dcb7dd02 Mon Sep 17 00:00:00 2001 From: David Cole Date: Wed, 31 Oct 2007 08:50:17 -0400 Subject: ENH: Add CPACK_SET_DESTDIR handling to enable packaging of installed files in absolute locations. With this setting on, cpack will set the DESTDIR env var when building the package so that files end up in their intended locations. Default behavior is not to set DESTDIR for backwards compatibility. Helps address issue #4993 and issue #5257. Also, remove unused CPACK_USE_DESTDIR variable. ENH: Add variable CPACK_PACKAGING_INSTALL_PREFIX to allow overriding the CPack GetPackagingInstallPrefix from a project's CMakeLists file if necessary. Could be used to remove the annoying /usr prefix still used by default in the Mac PackageMaker generator. --- Modules/CPack.cmake | 2 +- Source/CPack/cmCPackCygwinBinaryGenerator.cxx | 1 + Source/CPack/cmCPackCygwinBinaryGenerator.h | 1 - Source/CPack/cmCPackCygwinSourceGenerator.cxx | 2 +- Source/CPack/cmCPackCygwinSourceGenerator.h | 2 +- Source/CPack/cmCPackDebGenerator.cxx | 8 ++ Source/CPack/cmCPackDebGenerator.h | 2 +- Source/CPack/cmCPackGenericGenerator.cxx | 123 ++++++++++++++++++++------ Source/CPack/cmCPackGenericGenerator.h | 12 ++- Source/CPack/cmCPackOSXX11Generator.cxx | 5 +- Source/CPack/cmCPackOSXX11Generator.h | 2 +- Source/CPack/cmCPackPackageMakerGenerator.cxx | 1 + Source/CPack/cmCPackPackageMakerGenerator.h | 1 - Source/CPack/cmCPackRPMGenerator.cxx | 8 ++ Source/CPack/cmCPackRPMGenerator.h | 2 +- 15 files changed, 128 insertions(+), 44 deletions(-) diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake index 8148aae..eb9ba43 100644 --- a/Modules/CPack.cmake +++ b/Modules/CPack.cmake @@ -179,7 +179,7 @@ cpack_set_if_not_set(CPACK_OUTPUT_CONFIG_FILE cpack_set_if_not_set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackSourceConfig.cmake") -cpack_set_if_not_set(CPACK_USE_DESTDIR ON) +cpack_set_if_not_set(CPACK_SET_DESTDIR OFF) cpack_set_if_not_set(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") cpack_set_if_not_set(CPACK_NSIS_INSTALLER_ICON_CODE "") diff --git a/Source/CPack/cmCPackCygwinBinaryGenerator.cxx b/Source/CPack/cmCPackCygwinBinaryGenerator.cxx index 7d2ffb8..e8e1f7f 100644 --- a/Source/CPack/cmCPackCygwinBinaryGenerator.cxx +++ b/Source/CPack/cmCPackCygwinBinaryGenerator.cxx @@ -41,6 +41,7 @@ cmCPackCygwinBinaryGenerator::~cmCPackCygwinBinaryGenerator() //---------------------------------------------------------------------- int cmCPackCygwinBinaryGenerator::InitializeInternal() { + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "0"); std::vector path; std::string pkgPath = cmSystemTools::FindProgram("bzip2", path, false); diff --git a/Source/CPack/cmCPackCygwinBinaryGenerator.h b/Source/CPack/cmCPackCygwinBinaryGenerator.h index c415f32..25599bb 100644 --- a/Source/CPack/cmCPackCygwinBinaryGenerator.h +++ b/Source/CPack/cmCPackCygwinBinaryGenerator.h @@ -34,7 +34,6 @@ public: cmCPackCygwinBinaryGenerator(); virtual ~cmCPackCygwinBinaryGenerator(); protected: - virtual const char* GetInstallPrefix() { return "/usr"; } virtual int InitializeInternal(); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); diff --git a/Source/CPack/cmCPackCygwinSourceGenerator.cxx b/Source/CPack/cmCPackCygwinSourceGenerator.cxx index c906255..0856452 100644 --- a/Source/CPack/cmCPackCygwinSourceGenerator.cxx +++ b/Source/CPack/cmCPackCygwinSourceGenerator.cxx @@ -166,7 +166,7 @@ int cmCPackCygwinSourceGenerator::CompressFiles(const char* outFileName, return 1; } -const char* cmCPackCygwinSourceGenerator::GetInstallPrefix() +const char* cmCPackCygwinSourceGenerator::GetPackagingInstallPrefix() { this->InstallPrefix = "/"; this->InstallPrefix += this->GetOption("CPACK_PACKAGE_FILE_NAME"); diff --git a/Source/CPack/cmCPackCygwinSourceGenerator.h b/Source/CPack/cmCPackCygwinSourceGenerator.h index a4e4656..6be26a5 100644 --- a/Source/CPack/cmCPackCygwinSourceGenerator.h +++ b/Source/CPack/cmCPackCygwinSourceGenerator.h @@ -34,7 +34,7 @@ public: cmCPackCygwinSourceGenerator(); virtual ~cmCPackCygwinSourceGenerator(); protected: - const char* GetInstallPrefix(); + const char* GetPackagingInstallPrefix(); virtual int InitializeInternal(); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx index 88a4e25..75bf36f 100644 --- a/Source/CPack/cmCPackDebGenerator.cxx +++ b/Source/CPack/cmCPackDebGenerator.cxx @@ -43,6 +43,14 @@ cmCPackDebGenerator::~cmCPackDebGenerator() } //---------------------------------------------------------------------- +int cmCPackDebGenerator::InitializeInternal() +{ + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); + + return this->Superclass::InitializeInternal(); +} + +//---------------------------------------------------------------------- int cmCPackDebGenerator::CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files) diff --git a/Source/CPack/cmCPackDebGenerator.h b/Source/CPack/cmCPackDebGenerator.h index 6683f2b..fd18c9d 100644 --- a/Source/CPack/cmCPackDebGenerator.h +++ b/Source/CPack/cmCPackDebGenerator.h @@ -37,10 +37,10 @@ public: virtual ~cmCPackDebGenerator(); protected: + virtual int InitializeInternal(); virtual int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetOutputExtension() { return ".deb"; } - virtual const char* GetInstallPrefix() { return "/usr"; } }; diff --git a/Source/CPack/cmCPackGenericGenerator.cxx b/Source/CPack/cmCPackGenericGenerator.cxx index 1987a4d..e961357 100644 --- a/Source/CPack/cmCPackGenericGenerator.cxx +++ b/Source/CPack/cmCPackGenericGenerator.cxx @@ -61,6 +61,7 @@ void cmCPackGenericGenerator::DisplayVerboseOutput(const char* msg, int cmCPackGenericGenerator::PrepareNames() { this->SetOption("CPACK_GENERATOR", this->Name.c_str()); + std::string tempDirectory = this->GetOption("CPACK_PACKAGE_DIRECTORY"); tempDirectory += "/_CPack_Packages/"; const char* toplevelTag = this->GetOption("CPACK_TOPLEVEL_TAG"); @@ -80,7 +81,14 @@ int cmCPackGenericGenerator::PrepareNames() destFile += "/" + outName; std::string outFile = topDirectory + "/" + outName; - std::string installPrefix = tempDirectory + this->GetInstallPrefix(); + + bool setDestDir = cmSystemTools::IsOn(this->GetOption("CPACK_SET_DESTDIR")); + std::string installPrefix = tempDirectory; + if (!setDestDir) + { + installPrefix += this->GetPackagingInstallPrefix(); + } + this->SetOptionIfNotSet("CPACK_TOPLEVEL_DIRECTORY", topDirectory.c_str()); this->SetOptionIfNotSet("CPACK_TEMPORARY_DIRECTORY", tempDirectory.c_str()); this->SetOptionIfNotSet("CPACK_OUTPUT_FILE_NAME", outName.c_str()); @@ -147,8 +155,6 @@ int cmCPackGenericGenerator::InstallProject() this->CleanTemporaryDirectory(); std::string tempInstallDirectoryWithPostfix = this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY"); - tempInstallDirectoryWithPostfix - += this->GetTemporaryInstallDirectoryPostfix(); const char* tempInstallDirectory = tempInstallDirectoryWithPostfix.c_str(); int res = 1; if ( !cmsys::SystemTools::MakeDirectory(tempInstallDirectory)) @@ -160,23 +166,23 @@ int cmCPackGenericGenerator::InstallProject() return 0; } - bool movable = true; - if ( movable ) - { - // Make sure there is no destdir - cmSystemTools::PutEnv("DESTDIR="); - } - else + bool setDestDir = cmSystemTools::IsOn(this->GetOption("CPACK_SET_DESTDIR")); + if ( setDestDir ) { std::string destDir = "DESTDIR="; destDir += tempInstallDirectory; cmSystemTools::PutEnv(destDir.c_str()); } + else + { + // Make sure there is no destdir + cmSystemTools::PutEnv("DESTDIR="); + } // If the CPackConfig file sets CPACK_INSTALL_COMMANDS then run them // as listed if ( !this->InstallProjectViaInstallCommands( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } @@ -184,7 +190,7 @@ int cmCPackGenericGenerator::InstallProject() // If the CPackConfig file sets CPACK_INSTALL_SCRIPT then run them // as listed if ( !this->InstallProjectViaInstallScript( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } @@ -193,7 +199,7 @@ int cmCPackGenericGenerator::InstallProject() // then glob it and copy it to CPACK_TEMPORARY_DIRECTORY // This is used in Source packageing if ( !this->InstallProjectViaInstalledDirectories( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } @@ -202,12 +208,12 @@ int cmCPackGenericGenerator::InstallProject() // If the project is a CMAKE project then run pre-install // and then read the cmake_install script to run it if ( !this->InstallProjectViaInstallCMakeProjects( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } - if ( !movable ) + if ( setDestDir ) { cmSystemTools::PutEnv("DESTDIR="); } @@ -217,9 +223,9 @@ int cmCPackGenericGenerator::InstallProject() //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstallCommands( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { - (void)movable; + (void)setDestDir; (void)tempInstallDirectory; const char* installCommands = this->GetOption("CPACK_INSTALL_COMMANDS"); if ( installCommands && *installCommands ) @@ -261,9 +267,9 @@ int cmCPackGenericGenerator::InstallProjectViaInstallCommands( //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { - (void)movable; + (void)setDestDir; (void)tempInstallDirectory; std::vector ignoreFilesRegex; const char* cpackIgnoreFiles = this->GetOption("CPACK_IGNORE_FILES"); @@ -299,7 +305,6 @@ int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories( } std::vector::iterator it; const char* tempDir = tempInstallDirectory; -// this->GetOption("CPACK_TEMPORARY_DIRECTORY"); for ( it = installDirectoriesVector.begin(); it != installDirectoriesVector.end(); ++it ) @@ -362,7 +367,7 @@ int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories( //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstallScript( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { const char* cmakeScripts = this->GetOption("CPACK_INSTALL_SCRIPT"); @@ -384,10 +389,37 @@ int cmCPackGenericGenerator::InstallProjectViaInstallScript( cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Install script: " << installScript << std::endl); - if ( movable ) + + if ( setDestDir ) + { + // For DESTDIR based packaging, use the *project* CMAKE_INSTALL_PREFIX + // underneath the tempInstallDirectory. The value of the project's + // CMAKE_INSTALL_PREFIX is sent in here as the value of the + // CPACK_INSTALL_PREFIX variable. + std::string dir = tempInstallDirectory; + if (this->GetOption("CPACK_INSTALL_PREFIX")) + { + dir += this->GetOption("CPACK_INSTALL_PREFIX"); + } + this->SetOption("CMAKE_INSTALL_PREFIX", dir.c_str()); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using DESTDIR + CPACK_INSTALL_PREFIX... (this->SetOption)" + << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << dir << "'" << std::endl); + } + else { this->SetOption("CMAKE_INSTALL_PREFIX", tempInstallDirectory); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using non-DESTDIR install... (this->SetOption)" << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << tempInstallDirectory + << "'" << std::endl); } + this->SetOptionIfNotSet("CMAKE_CURRENT_BINARY_DIR", tempInstallDirectory); this->SetOptionIfNotSet("CMAKE_CURRENT_SOURCE_DIR", @@ -404,7 +436,7 @@ int cmCPackGenericGenerator::InstallProjectViaInstallScript( //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { const char* cmakeProjects = this->GetOption("CPACK_INSTALL_CMAKE_PROJECTS"); @@ -517,10 +549,37 @@ int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects( { realInstallDirectory += installSubDirectory; } - if ( movable ) + + if ( setDestDir ) + { + // For DESTDIR based packaging, use the *project* CMAKE_INSTALL_PREFIX + // underneath the tempInstallDirectory. The value of the project's + // CMAKE_INSTALL_PREFIX is sent in here as the value of the + // CPACK_INSTALL_PREFIX variable. + std::string dir = tempInstallDirectory; + if (this->GetOption("CPACK_INSTALL_PREFIX")) + { + dir += this->GetOption("CPACK_INSTALL_PREFIX"); + } + mf->AddDefinition("CMAKE_INSTALL_PREFIX", dir.c_str()); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using DESTDIR + CPACK_INSTALL_PREFIX... (mf->AddDefinition)" + << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << dir << "'" << std::endl); + } + else { mf->AddDefinition("CMAKE_INSTALL_PREFIX", tempInstallDirectory); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using non-DESTDIR install... (mf->AddDefinition)" << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << tempInstallDirectory + << "'" << std::endl); } + if ( buildConfig && *buildConfig ) { mf->AddDefinition("BUILD_TYPE", buildConfig); @@ -701,6 +760,11 @@ int cmCPackGenericGenerator::Initialize(const char* name, cmMakefile* mf, return 0; } + // If a generator subclass did not already set this option in its + // InitializeInternal implementation, and the project did not already set + // it, the default value should be: + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/"); + return result; } @@ -928,6 +992,15 @@ const char* cmCPackGenericGenerator::GetInstallPath() } //---------------------------------------------------------------------- +const char* cmCPackGenericGenerator::GetPackagingInstallPrefix() +{ + cmCPackLogger(cmCPackLog::LOG_DEBUG, "GetPackagingInstallPrefix: '" + << this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX") << "'" << std::endl); + + return this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX"); +} + +//---------------------------------------------------------------------- std::string cmCPackGenericGenerator::FindTemplate(const char* name) { cmCPackLogger(cmCPackLog::LOG_DEBUG, "Look for template: " @@ -960,8 +1033,6 @@ int cmCPackGenericGenerator::CleanTemporaryDirectory() { std::string tempInstallDirectoryWithPostfix = this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY"); - tempInstallDirectoryWithPostfix - += this->GetTemporaryInstallDirectoryPostfix(); const char* tempInstallDirectory = tempInstallDirectoryWithPostfix.c_str(); if(cmsys::SystemTools::FileExists(tempInstallDirectory)) { diff --git a/Source/CPack/cmCPackGenericGenerator.h b/Source/CPack/cmCPackGenericGenerator.h index 7e0b10a..ea59a91 100644 --- a/Source/CPack/cmCPackGenericGenerator.h +++ b/Source/CPack/cmCPackGenericGenerator.h @@ -18,7 +18,6 @@ #ifndef cmCPackGenericGenerator_h #define cmCPackGenericGenerator_h - #include "cmObject.h" #define cmCPackTypeMacro(class, superclass) \ @@ -102,8 +101,7 @@ protected: virtual int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetInstallPath(); - virtual const char* GetInstallPrefix() { return "/"; } - virtual const char* GetTemporaryInstallDirectoryPostfix() { return ""; } + virtual const char* GetPackagingInstallPrefix(); virtual std::string FindTemplate(const char* name); virtual bool ConfigureFile(const char* inName, const char* outName, @@ -114,13 +112,13 @@ protected: //! Run install commands if specified virtual int InstallProjectViaInstallCommands( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); virtual int InstallProjectViaInstallScript( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); virtual int InstallProjectViaInstalledDirectories( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); virtual int InstallProjectViaInstallCMakeProjects( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); bool GeneratorVerbose; std::string Name; diff --git a/Source/CPack/cmCPackOSXX11Generator.cxx b/Source/CPack/cmCPackOSXX11Generator.cxx index 27c411f..6d04b6e 100644 --- a/Source/CPack/cmCPackOSXX11Generator.cxx +++ b/Source/CPack/cmCPackOSXX11Generator.cxx @@ -178,8 +178,6 @@ int cmCPackOSXX11Generator::InitializeInternal() this->SetOptionIfNotSet("CPACK_INSTALLER_PROGRAM_DISK_IMAGE", pkgPath.c_str()); - - return this->Superclass::InitializeInternal(); } @@ -228,6 +226,7 @@ bool cmCPackOSXX11Generator::CopyCreateResourceFile(const char* name) } */ +//---------------------------------------------------------------------- bool cmCPackOSXX11Generator::CopyResourcePlistFile(const char* name, const char* dir, const char* outputFileName /* = 0 */, bool copyOnly /* = false */) @@ -259,7 +258,7 @@ bool cmCPackOSXX11Generator::CopyResourcePlistFile(const char* name, } //---------------------------------------------------------------------- -const char* cmCPackOSXX11Generator::GetInstallPrefix() +const char* cmCPackOSXX11Generator::GetPackagingInstallPrefix() { this->InstallPrefix = "/"; this->InstallPrefix += this->GetOption("CPACK_PACKAGE_FILE_NAME"); diff --git a/Source/CPack/cmCPackOSXX11Generator.h b/Source/CPack/cmCPackOSXX11Generator.h index 8d9fef5..c4c5ae9 100644 --- a/Source/CPack/cmCPackOSXX11Generator.h +++ b/Source/CPack/cmCPackOSXX11Generator.h @@ -40,7 +40,7 @@ protected: virtual int InitializeInternal(); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); - virtual const char* GetInstallPrefix(); + virtual const char* GetPackagingInstallPrefix(); virtual const char* GetOutputExtension() { return ".dmg"; } //bool CopyCreateResourceFile(const char* name, const char* dir); diff --git a/Source/CPack/cmCPackPackageMakerGenerator.cxx b/Source/CPack/cmCPackPackageMakerGenerator.cxx index 95c1e1d..79dac06 100644 --- a/Source/CPack/cmCPackPackageMakerGenerator.cxx +++ b/Source/CPack/cmCPackPackageMakerGenerator.cxx @@ -141,6 +141,7 @@ int cmCPackPackageMakerGenerator::InitializeInternal() { cmCPackLogger(cmCPackLog::LOG_DEBUG, "cmCPackPackageMakerGenerator::Initialize()" << std::endl); + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); std::vector path; std::string pkgPath = "/Developer/Applications/Utilities/PackageMaker.app/Contents"; diff --git a/Source/CPack/cmCPackPackageMakerGenerator.h b/Source/CPack/cmCPackPackageMakerGenerator.h index 17adb14..21cb4fc 100644 --- a/Source/CPack/cmCPackPackageMakerGenerator.h +++ b/Source/CPack/cmCPackPackageMakerGenerator.h @@ -44,7 +44,6 @@ protected: const std::vector& files); virtual const char* GetOutputExtension() { return ".dmg"; } virtual const char* GetOutputPostfix() { return "darwin"; } - virtual const char* GetInstallPrefix() { return "/usr"; } bool CopyCreateResourceFile(const char* name); bool CopyResourcePlistFile(const char* name); diff --git a/Source/CPack/cmCPackRPMGenerator.cxx b/Source/CPack/cmCPackRPMGenerator.cxx index 4816570..18544b8 100644 --- a/Source/CPack/cmCPackRPMGenerator.cxx +++ b/Source/CPack/cmCPackRPMGenerator.cxx @@ -28,6 +28,14 @@ cmCPackRPMGenerator::~cmCPackRPMGenerator() } //---------------------------------------------------------------------- +int cmCPackRPMGenerator::InitializeInternal() +{ + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); + + return this->Superclass::InitializeInternal(); +} + +//---------------------------------------------------------------------- int cmCPackRPMGenerator::CompressFiles(const char* /*outFileName*/, const char* /*toplevel*/, const std::vector& /*files*/) diff --git a/Source/CPack/cmCPackRPMGenerator.h b/Source/CPack/cmCPackRPMGenerator.h index 4279c3a..e4ddf97 100644 --- a/Source/CPack/cmCPackRPMGenerator.h +++ b/Source/CPack/cmCPackRPMGenerator.h @@ -41,10 +41,10 @@ public: virtual ~cmCPackRPMGenerator(); protected: + virtual int InitializeInternal(); virtual int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetOutputExtension() { return ".rpm"; } - virtual const char* GetInstallPrefix() { return "/usr"; } }; -- cgit v0.12