From 5beb1da7f741c50659204cf1fbd264b5dcb7dd02 Mon Sep 17 00:00:00 2001 From: David Cole Date: Wed, 31 Oct 2007 08:50:17 -0400 Subject: [PATCH] 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 8148aaeae..eb9ba4349 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 7d2ffb819..e8e1f7f79 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 c415f3292..25599bbf6 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 c9062550a..0856452a4 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 a4e4656e3..6be26a597 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 88a4e25e9..75bf36fec 100644 --- a/Source/CPack/cmCPackDebGenerator.cxx +++ b/Source/CPack/cmCPackDebGenerator.cxx @@ -42,6 +42,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, diff --git a/Source/CPack/cmCPackDebGenerator.h b/Source/CPack/cmCPackDebGenerator.h index 6683f2b4b..fd18c9d6c 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 1987a4dfd..e961357f5 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; } @@ -927,6 +991,15 @@ const char* cmCPackGenericGenerator::GetInstallPath() return this->InstallPath.c_str(); } +//---------------------------------------------------------------------- +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) { @@ -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 7e0b10a3d..ea59a913e 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 27c411f4e..6d04b6e76 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 8d9fef5da..c4c5ae94f 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 95c1e1d7c..79dac067e 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 17adb148a..21cb4fca2 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 4816570f0..18544b85f 100644 --- a/Source/CPack/cmCPackRPMGenerator.cxx +++ b/Source/CPack/cmCPackRPMGenerator.cxx @@ -27,6 +27,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*/, diff --git a/Source/CPack/cmCPackRPMGenerator.h b/Source/CPack/cmCPackRPMGenerator.h index 4279c3a82..e4ddf97b1 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"; } };