CPack allow RPM and DEB generator to be used on OSX.

More generally add the check for possible generator "activation" at
runtime depending on a generator specific check.
The dynamic behavior is currently implemented only for MacOS
and should be fully backward compatible for other system.

Inspired-By Tom Hughes <tomtheengineer@gmail.com>
This commit is contained in:
Eric NOULARD 2012-03-30 17:07:06 +02:00
parent 77ec098b44
commit 2a34b57938
5 changed files with 140 additions and 42 deletions

View File

@ -31,6 +31,17 @@ public:
cmCPackDebGenerator(); cmCPackDebGenerator();
virtual ~cmCPackDebGenerator(); virtual ~cmCPackDebGenerator();
static bool CanGenerate()
{
#ifdef __APPLE__
// on MacOS enable CPackDeb iff dpkg is found
return cmSystemTools::FindProgram("dpkg") != "" ? true : false;
#else
// legacy behavior on other systems
return true;
#endif
}
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
/** /**

View File

@ -62,6 +62,16 @@ public:
{ this->GeneratorVerbose = val ? { this->GeneratorVerbose = val ?
cmSystemTools::OUTPUT_MERGE : cmSystemTools::OUTPUT_NONE; } cmSystemTools::OUTPUT_MERGE : cmSystemTools::OUTPUT_NONE; }
/**
* Returns true if the generator may work on this system.
* Rational:
* Some CPack generator may run on some host and may not on others
* (with the same system) because some tools are missing. If the tool
* is missing then CPack won't activate (in the CPackGeneratorFactory)
* this particular generator.
*/
static bool CanGenerate() { return true; }
/** /**
* Do the actual whole package processing. * Do the actual whole package processing.
* Subclass may redefine it but its usually enough * Subclass may redefine it but its usually enough

View File

@ -31,7 +31,7 @@
# include "cmCPackCygwinSourceGenerator.h" # include "cmCPackCygwinSourceGenerator.h"
#endif #endif
#if !defined(_WIN32) && !defined(__APPLE__) \ #if !defined(_WIN32) \
&& !defined(__QNXNTO__) && !defined(__BEOS__) && !defined(__QNXNTO__) && !defined(__BEOS__)
# include "cmCPackDebGenerator.h" # include "cmCPackDebGenerator.h"
# include "cmCPackRPMGenerator.h" # include "cmCPackRPMGenerator.h"
@ -43,41 +43,83 @@
//---------------------------------------------------------------------- //----------------------------------------------------------------------
cmCPackGeneratorFactory::cmCPackGeneratorFactory() cmCPackGeneratorFactory::cmCPackGeneratorFactory()
{ {
this->RegisterGenerator("TGZ", "Tar GZip compression", if (cmCPackTGZGenerator::CanGenerate())
cmCPackTGZGenerator::CreateGenerator); {
this->RegisterGenerator("STGZ", "Self extracting Tar GZip compression", this->RegisterGenerator("TGZ", "Tar GZip compression",
cmCPackSTGZGenerator::CreateGenerator); cmCPackTGZGenerator::CreateGenerator);
this->RegisterGenerator("NSIS", "Null Soft Installer", }
cmCPackNSISGenerator::CreateGenerator); if (cmCPackSTGZGenerator::CanGenerate())
{
this->RegisterGenerator("STGZ", "Self extracting Tar GZip compression",
cmCPackSTGZGenerator::CreateGenerator);
}
if (cmCPackNSISGenerator::CanGenerate())
{
this->RegisterGenerator("NSIS", "Null Soft Installer",
cmCPackNSISGenerator::CreateGenerator);
}
#ifdef __CYGWIN__ #ifdef __CYGWIN__
this->RegisterGenerator("CygwinBinary", "Cygwin Binary Installer", if (cmCPackCygwinBinaryGenerator::CanGenerate())
cmCPackCygwinBinaryGenerator::CreateGenerator); {
this->RegisterGenerator("CygwinSource", "Cygwin Source Installer", this->RegisterGenerator("CygwinBinary", "Cygwin Binary Installer",
cmCPackCygwinSourceGenerator::CreateGenerator); cmCPackCygwinBinaryGenerator::CreateGenerator);
}
if (cmCPackCygwinSourceGenerator::CanGenerate())
{
this->RegisterGenerator("CygwinSource", "Cygwin Source Installer",
cmCPackCygwinSourceGenerator::CreateGenerator);
}
#endif #endif
this->RegisterGenerator("ZIP", "ZIP file format", if (cmCPackZIPGenerator::CanGenerate())
cmCPackZIPGenerator::CreateGenerator); {
this->RegisterGenerator("TBZ2", "Tar BZip2 compression", this->RegisterGenerator("ZIP", "ZIP file format",
cmCPackTarBZip2Generator::CreateGenerator); cmCPackZIPGenerator::CreateGenerator);
this->RegisterGenerator("TZ", "Tar Compress compression", }
cmCPackTarCompressGenerator::CreateGenerator); if (cmCPackTarBZip2Generator::CanGenerate())
{
this->RegisterGenerator("TBZ2", "Tar BZip2 compression",
cmCPackTarBZip2Generator::CreateGenerator);
}
if (cmCPackTarCompressGenerator::CanGenerate())
{
this->RegisterGenerator("TZ", "Tar Compress compression",
cmCPackTarCompressGenerator::CreateGenerator);
}
#ifdef __APPLE__ #ifdef __APPLE__
this->RegisterGenerator("DragNDrop", "Mac OSX Drag And Drop", if (cmCPackDragNDropGenerator::CanGenerate())
cmCPackDragNDropGenerator::CreateGenerator); {
this->RegisterGenerator("Bundle", "Mac OSX bundle", this->RegisterGenerator("DragNDrop", "Mac OSX Drag And Drop",
cmCPackBundleGenerator::CreateGenerator); cmCPackDragNDropGenerator::CreateGenerator);
this->RegisterGenerator("PackageMaker", "Mac OSX Package Maker installer", }
cmCPackPackageMakerGenerator::CreateGenerator); if (cmCPackBundleGenerator::CanGenerate())
this->RegisterGenerator("OSXX11", "Mac OSX X11 bundle", {
cmCPackOSXX11Generator::CreateGenerator); this->RegisterGenerator("Bundle", "Mac OSX bundle",
cmCPackBundleGenerator::CreateGenerator);
}
if (cmCPackPackageMakerGenerator::CanGenerate())
{
this->RegisterGenerator("PackageMaker", "Mac OSX Package Maker installer",
cmCPackPackageMakerGenerator::CreateGenerator);
}
if (cmCPackOSXX11Generator::CanGenerate())
{
this->RegisterGenerator("OSXX11", "Mac OSX X11 bundle",
cmCPackOSXX11Generator::CreateGenerator);
}
#endif #endif
#if !defined(_WIN32) && !defined(__APPLE__) \ #if !defined(_WIN32) \
&& !defined(__QNXNTO__) && !defined(__BEOS__) && !defined(__QNXNTO__) && !defined(__BEOS__)
this->RegisterGenerator("DEB", "Debian packages", if (cmCPackDebGenerator::CanGenerate())
cmCPackDebGenerator::CreateGenerator); {
this->RegisterGenerator("RPM", "RPM packages", this->RegisterGenerator("DEB", "Debian packages",
cmCPackRPMGenerator::CreateGenerator); cmCPackDebGenerator::CreateGenerator);
}
if (cmCPackRPMGenerator::CanGenerate())
{
this->RegisterGenerator("RPM", "RPM packages",
cmCPackRPMGenerator::CreateGenerator);
}
#endif #endif
} }

View File

@ -35,6 +35,17 @@ public:
cmCPackRPMGenerator(); cmCPackRPMGenerator();
virtual ~cmCPackRPMGenerator(); virtual ~cmCPackRPMGenerator();
static bool CanGenerate()
{
#ifdef __APPLE__
// on MacOS enable CPackRPM iff rpmbuild is found
return cmSystemTools::FindProgram("rpmbuild") != "" ? true : false;
#else
// legacy behavior on other systems
return true;
#endif
}
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
virtual int PackageFiles(); virtual int PackageFiles();

View File

@ -699,6 +699,31 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
ENDIF(CTEST_RUN_CPackComponents) ENDIF(CTEST_RUN_CPackComponents)
IF(CTEST_RUN_CPackComponentsForAll) IF(CTEST_RUN_CPackComponentsForAll)
# Analyze 'cpack --help' output for list of available generators:
execute_process(COMMAND ${CMAKE_CPACK_COMMAND} --help
RESULT_VARIABLE result
OUTPUT_VARIABLE stdout
ERROR_VARIABLE stderr)
string(REPLACE ";" "\\;" stdout "${stdout}")
string(REPLACE "\n" "E;" stdout "${stdout}")
set(collecting 0)
set(ACTIVE_CPACK_GENERATORS)
foreach(eline ${stdout})
string(REGEX REPLACE "^(.*)E$" "\\1" line "${eline}")
if(collecting AND NOT line STREQUAL "")
string(REGEX REPLACE "^ ([^ ]+) += (.*)$" "\\1" gen "${line}")
string(REGEX REPLACE "^ ([^ ]+) += (.*)$" "\\2" doc "${line}")
list(APPEND ACTIVE_CPACK_GENERATORS ${gen})
endif()
if(line STREQUAL "Generators")
set(collecting 1)
endif()
endforeach()
# ACTIVE_CPACK_GENERATORS variable
# now contains the list of 'active generators'
set(CPackComponentsForAll_EXTRA_OPTIONS) set(CPackComponentsForAll_EXTRA_OPTIONS)
set(CPackRun_CPackCommand "-DCPackCommand=${CMAKE_CPACK_COMMAND}") set(CPackRun_CPackCommand "-DCPackCommand=${CMAKE_CPACK_COMMAND}")
# set up list of CPack generators # set up list of CPack generators
@ -706,18 +731,17 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
if(APPLE) if(APPLE)
list(APPEND GENLST "DragNDrop") list(APPEND GENLST "DragNDrop")
endif(APPLE) endif(APPLE)
if (CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT CMAKE_CURRENT_BINARY_DIR MATCHES ".* .*") if (NOT CMAKE_CURRENT_BINARY_DIR MATCHES ".* .*")
find_program(RPMBUILD NAMES rpmbuild) list(FIND ACTIVE_CPACK_GENERATORS "RPM" RPM_ACTIVE)
endif(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT CMAKE_CURRENT_BINARY_DIR MATCHES ".* .*") if (NOT ${RPM_ACTIVE} EQUAL -1)
if (RPMBUILD) list(APPEND GENLST "RPM")
list(APPEND GENLST "RPM") endif(NOT ${RPM_ACTIVE} EQUAL -1)
endif(RPMBUILD) endif(NOT CMAKE_CURRENT_BINARY_DIR MATCHES ".* .*")
if (CMAKE_SYSTEM_NAME MATCHES "Linux") list(FIND ACTIVE_CPACK_GENERATORS "DEB" DEB_ACTIVE)
find_program(DPKG NAMES dpkg) if (NOT ${DEB_ACTIVE} EQUAL -1)
if (DPKG) list(APPEND GENLST "DEB")
list(APPEND GENLST "DEB") endif(NOT ${DEB_ACTIVE} EQUAL -1)
endif(DPKG)
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
# set up list of component packaging ways # set up list of component packaging ways
list(APPEND CWAYLST "default") list(APPEND CWAYLST "default")
list(APPEND CWAYLST "OnePackPerGroup") list(APPEND CWAYLST "OnePackPerGroup")