ENH: deb generator can now generate deb packages

-remove the unscriptable commands also from the cpack cmake
-use CPACK_PACKAGE_CONTACT in CMakeCPack.cmake, it's used in the nsis and
the deb generator
-make set_properties() scriptable
-use a non-const char array for adding the python modules

Alex
This commit is contained in:
Alexander Neundorf 2007-07-27 08:59:59 -04:00
parent e2aeecc294
commit d6a0c330bc
9 changed files with 104 additions and 43 deletions

View File

@ -31,6 +31,7 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
IF(NOT DEFINED CPACK_PACKAGE_FILE_NAME)
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}-${CPACK_SYSTEM_NAME}")
ENDIF(NOT DEFINED CPACK_PACKAGE_FILE_NAME)
SET(CPACK_PACKAGE_CONTACT "cmake@cmake.org")
IF(WIN32 AND NOT UNIX)
# There is a bug in NSI that does not handle full unix paths properly. Make
# sure there is at least one set of four (4) backlasshes.
@ -40,7 +41,7 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} a cross-platform, open-source build system")
SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.cmake.org")
SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.kitware.com")
SET(CPACK_NSIS_CONTACT "cmake@cmake.org")
SET(CPACK_NSIS_CONTACT ${CPACK_PACKAGE_CONTACT})
SET(CPACK_NSIS_MODIFY_PATH ON)
ELSE(WIN32 AND NOT UNIX)
SET(CPACK_STRIP_FILES "bin/ccmake;bin/cmake;bin/cpack;bin/ctest")

View File

@ -8,3 +8,53 @@ ENDIF(NOT UNIX)
FIND_PROGRAM(AR_EXECUTABLE ar)
IF(NOT AR_EXECUTABLE)
# Is there a *NIX out there without ar ?
MESSAGE(FATAL_ERROR "debian package require a ar executable")
ENDIF(NOT AR_EXECUTABLE)
# Let's define the control file found in debian package:
# Package:
# debian policy enforce lower case for package name
IF(NOT DEBIAN_PACKAGE_NAME)
STRING(TOLOWER ${CPACK_PACKAGE_NAME} DEBIAN_PACKAGE_NAME)
ENDIF(NOT DEBIAN_PACKAGE_NAME)
# Version:
IF(NOT DEBIAN_PACKAGE_VERSION)
IF(NOT CPACK_PACKAGE_VERSION)
MESSAGE(FATAL_ERROR "debian package require a package version")
ENDIF(NOT CPACK_PACKAGE_VERSION)
SET(DEBIAN_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
ENDIF(NOT DEBIAN_PACKAGE_VERSION)
# Architecture:
IF(NOT DEBIAN_PACKAGE_ARCHITECTURE)
# There is no such thing as i686 architecture on debian, you should use i386 instead
# $ dpkg --print-architecture
SET(DEBIAN_PACKAGE_ARCHITECTURE i386)
ENDIF(NOT DEBIAN_PACAKGE_ARCHITECTURE)
# Depends:
IF(NOT DEBIAN_PACKAGE_DEPENDS)
SET(DEBIAN_PACKAGE_DEPENDS
"libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-12)"
)
ENDIF(NOT DEBIAN_PACKAGE_DEPENDS)
# Maintainer:
IF(NOT DEBIAN_PACKAGE_MAINTAINER)
IF(NOT CPACK_PACKAGE_CONTACT)
MESSAGE(FATAL_ERROR "debian package require a maintainer for a package")
ENDIF(NOT CPACK_PACKAGE_CONTACT)
SET(DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
ENDIF(NOT DEBIAN_PACKAGE_MAINTAINER)
# Description:
IF(NOT DEBIAN_PACKAGE_DESCRIPTION)
IF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
MESSAGE(FATAL_ERROR "debian package require a summary for a package")
ENDIF(NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY)
SET(DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
ENDIF(NOT DEBIAN_PACKAGE_DESCRIPTION)

View File

@ -127,7 +127,7 @@ MACRO(PYTHON_WRITE_MODULES_HEADER _filename)
ENDFOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filename} "int CMakeLoadPythonModule_${_currentModule}(void) \n{\n return PyImport_AppendInittab(\"${_currentModule}\", init${_currentModule});\n}\n\n")
FILE(APPEND ${_filename} "int CMakeLoadPythonModule_${_currentModule}(void) \n{\n char name[]=\"${PYTHON_MODULE_PREFIX}${_currentModule}\"; return PyImport_AppendInittab(name, init${PYTHON_MODULE_PREFIX}${_currentModule});\n}\n\n")
ENDFOREACH(_currentModule ${PY_STATIC_MODULES_LIST})
FILE(APPEND ${_filename} "#ifndef EXCLUDE_LOAD_ALL_FUNCTION\nvoid CMakeLoadAllPythonModules(void)\n{\n")

View File

@ -52,39 +52,36 @@ int cmCPackDebGenerator::CompressFiles(const char* outFileName,
out << std::endl; // required for valid debian package
}
// debian policy enforce lower case for package name
// IF(NOT DEBIAN_PACKAGE_NAME)
// STRING(TOLOWER
// ${CPACK_PACKAGE_NAME}
// DEBIAN_PACKAGE_NAME
// )
// control file
std::string ctlfilename;
ctlfilename = toplevel;
ctlfilename += "/control";
// debian policy enforce lower case for package name
std::string debian_pkg_name = cmsys::SystemTools::LowerCase( this->GetOption("DEBIAN_PACKAGE_NAME") );
const char* debian_pkg_version = this->GetOption("DEBIAN_PACKAGE_VERSION");
const char* debian_pkg_arch = this->GetOption("DEBIAN_PACKAGE_ARCHITECTURE");
const char* debian_pkg_dep = this->GetOption("DEBIAN_PACKAGE_DEPENDS");
const char* maintainer = this->GetOption("DEBIAN_PACKAGE_MAINTAINER");
const char* desc = this->GetOption("DEBIAN_PACKAGE_DESCRIPTION");
{ // the scope is needed for cmGeneratedFileStream
cmGeneratedFileStream out(ctlfilename.c_str());
out << "Package: ${DEBIAN_PACKAGE_NAME}\n";
out << "Version: ${CPACK_PACKAGE_VERSION}\n";
out << "Package: " << debian_pkg_name << "\n";
out << "Version: " << debian_pkg_version << "\n";
out << "Section: devel\n";
out << "Priority: optional\n";
out << "Architecture: ${DEBIAN_ARCHITECTURE}\n";
out << "Depends: ${DEBIAN_PACKAGE_DEPENDS}\n";
out << "Maintainer: ${CPACK_NSIS_CONTACT}\n";
out << "Description: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}\n";
out << "${DEBIAN_PACKAGE_NAME} was packaged by UseDebian and CMake.\n";
out << "Architecture: " << debian_pkg_arch << "\n";
out << "Depends: " << debian_pkg_dep << " \n";
out << "Maintainer: " << maintainer << "\n";
out << "Description: " << desc << "\n";
out << " " << debian_pkg_name << " was packaged by CMake.\n";
out << std::endl;
}
std::string output;
std::string cmd;
// cmd = this->GetOption("CPACK_DEB_COMMAND");
// cmsys::SystemTools::ReplaceString(cmd, "<ARCHIVE>", outFileName);
// cmsys::SystemTools::ReplaceString(cmd, "<FILELIST>", "deb.filelist");
cmd = cmakeExecutable;
std::string cmd = cmakeExecutable;
cmd += " -E tar cfz data.tar.gz ./usr";
std::string output;
int retVal = -1;
int res = cmSystemTools::RunSingleCommand(cmd.c_str(), &output,
&retVal, toplevel, this->GeneratorVerbose, 0);
@ -151,6 +148,7 @@ int cmCPackDebGenerator::CompressFiles(const char* outFileName,
cmd += "\" debian-binary control.tar.gz data.tar.gz";
res = cmSystemTools::RunSingleCommand(cmd.c_str(), &output,
&retVal, toplevel, this->GeneratorVerbose, 0);
return 1;
}

View File

@ -218,6 +218,7 @@ int main (int argc, char *argv[])
"Read CPack config file: " << cpackConfigFile.c_str() << std::endl);
cmake cminst;
cminst.RemoveUnscriptableCommands();
cmGlobalGenerator cmgg;
cmgg.SetCMakeInstance(&cminst);
cmLocalGenerator* cmlg = cmgg.CreateLocalGenerator();

View File

@ -303,25 +303,7 @@ void cmCTestScriptHandler::CreateCMake()
// remove all cmake commands which are not scriptable, since they can't be
// used in ctest scripts
std::vector<std::string> unscriptableCommands;
cmake::RegisteredCommandsMap* commands = this->CMake->GetCommands();
for (cmake::RegisteredCommandsMap::const_iterator pos = commands->begin();
pos != commands->end();
++pos)
{
if (!pos->second->IsScriptable())
{
unscriptableCommands.push_back(pos->first);
}
}
for(std::vector<std::string>::const_iterator it=unscriptableCommands.begin();
it != unscriptableCommands.end();
++it)
{
// fprintf(stderr, "Removing %s\n", it->c_str());
this->CMake->RemoveCommand(it->c_str());
}
this->CMake->RemoveUnscriptableCommands();
// add any ctest specific commands, probably should have common superclass
// for ctest commands to clean this up. If a couple more commands are

View File

@ -60,7 +60,12 @@ public:
"or TEST test_name."
;
}
/**
* This determines if the command is invoked when in script mode.
*/
virtual bool IsScriptable() { return true; }
cmTypeMacro(cmSetPropertiesCommand, cmCommand);
};

View File

@ -290,6 +290,29 @@ void cmake::AddCommand(cmCommand* wg)
this->Commands.insert( RegisteredCommandsMap::value_type(name, wg));
}
void cmake::RemoveUnscriptableCommands()
{
std::vector<std::string> unscriptableCommands;
cmake::RegisteredCommandsMap* commands = this->GetCommands();
for (cmake::RegisteredCommandsMap::const_iterator pos = commands->begin();
pos != commands->end();
++pos)
{
if (!pos->second->IsScriptable())
{
unscriptableCommands.push_back(pos->first);
}
}
for(std::vector<std::string>::const_iterator it=unscriptableCommands.begin();
it != unscriptableCommands.end();
++it)
{
this->RemoveCommand(it->c_str());
}
}
// Parse the args
bool cmake::SetCacheArgs(const std::vector<std::string>& args)
{

View File

@ -197,6 +197,7 @@ class cmake
void AddCommand(cmCommand* );
void RenameCommand(const char* oldName, const char* newName);
void RemoveCommand(const char* name);
void RemoveUnscriptableCommands();
/**
* Get a command by its name