summaryrefslogtreecommitdiffstats
path: root/Source/CPack/cmCPackRPMGenerator.cxx
blob: 34e93d3fca00b5fe166f57c256f467cc4ab96e74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmCPackRPMGenerator.h"
#include "cmCPackLog.h"
#include "cmSystemTools.h"

//----------------------------------------------------------------------
cmCPackRPMGenerator::cmCPackRPMGenerator()
{
}

//----------------------------------------------------------------------
cmCPackRPMGenerator::~cmCPackRPMGenerator()
{
}

//----------------------------------------------------------------------
int cmCPackRPMGenerator::InitializeInternal()
{
  this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr");
  if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR")))
    {
    this->SetOption("CPACK_SET_DESTDIR", "I_ON");
    }
  return this->Superclass::InitializeInternal();
}

//----------------------------------------------------------------------
int cmCPackRPMGenerator::PackageFiles()
{
  int retval = 1;
  /* Digest Component grouping specification */
  retval = PrepareGroupingKind();
  cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: "
                  << toplevel << std::endl);

  /* Are we in the component packaging case */
  if (SupportsComponentInstallation() & (!this->ComponentGroups.empty()))
    {
    /* Reset package file name list it will be populated during the
     * component packaging run*/
    packageFileNames.clear();
    std::string initialTopLevel(this->GetOption("CPACK_TEMPORARY_DIRECTORY"));
    /* One Package per component CASE */
    /* Iterate over components */
    std::map<std::string, cmCPackComponent>::iterator compIt;
    for (compIt=this->Components.begin();
        compIt!=this->Components.end(); ++compIt )
      {
      std::string localToplevel(initialTopLevel);
      std::string packageFileName(
          cmSystemTools::GetParentDirectory(toplevel.c_str())
                                 );
      std::string outputFileName(
          std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")
                                )
        +"-"+compIt->first + this->GetOutputExtension());

      localToplevel += "/"+ compIt->first;
      /* replace the TEMP DIRECTORY with the component one */
      this->SetOption("CPACK_TEMPORARY_DIRECTORY",localToplevel.c_str());
      packageFileName += "/"+ outputFileName;
      /* replace proposed CPACK_OUTPUT_FILE_NAME */
      this->SetOption("CPACK_OUTPUT_FILE_NAME",outputFileName.c_str());
      /* replace the TEMPORARY package file name */
      this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME",
                      packageFileName.c_str());

      this->SetOption("CPACK_RPM_PACKAGE_COMPONENT",compIt->first.c_str());
      if (!this->ReadListFile("CPackRPM.cmake"))
        {
        cmCPackLogger(cmCPackLog::LOG_ERROR,
                      "Error while execution CPackRPM.cmake" << std::endl);
        retval = 0;
        }

      // add the generated package to package file names list
      packageFileNames.push_back(packageFileName);
      }
    }
  /* This is the non component case */
  else
    {
    if (!this->ReadListFile("CPackRPM.cmake"))
      {
      cmCPackLogger(cmCPackLog::LOG_ERROR,
                    "Error while execution CPackRPM.cmake" << std::endl);
      retval = 0;
      }
    }

  if (!this->IsSet("RPMBUILD_EXECUTABLE")) 
    {
    cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find rpmbuild" << std::endl);
    retval = 0;
    }
  return retval;
}

bool cmCPackRPMGenerator::SupportsComponentInstallation() const
  {
  if (IsSet("CPACK_RPM_COMPONENT_INSTALL"))
    {
      return true;
    }
  else
    {
      return false;
    }
  }