summaryrefslogtreecommitdiffstats
path: root/Source/CPack/cmCPackGenericGenerator.h
blob: f5df78eaecaff940ad1612b4ae017fd08083f01a (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Kitware, Inc. All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

#ifndef cmCPackGenericGenerator_h
#define cmCPackGenericGenerator_h


#include "cmObject.h"

#define cmCPackTypeMacro(class, superclass) \
  cmTypeMacro(class, superclass); \
  static cmCPackGenericGenerator* CreateGenerator() { return new class; }

#define cmCPackLogger(logType, msg) \
  do { \
    cmOStringStream cmCPackLog_msg; \
    cmCPackLog_msg << msg; \
    this->Logger->Log(logType, __FILE__, __LINE__,\
                      cmCPackLog_msg.str().c_str());\
  } while ( 0 )

#ifdef cerr
#  undef cerr
#endif
#define cerr no_cerr_use_cmCPack_Log

#ifdef cout
#  undef cout
#endif
#define cout no_cout_use_cmCPack_Log

class cmMakefile;
class cmCPackLog;

/** \class cmCPackGenericGenerator
 * \brief A superclass of all CPack Generators
 *
 */
class cmCPackGenericGenerator : public cmObject
{
public:
  cmTypeMacro(cmCPackGenericGenerator, cmObject);
  /**
   * If verbose then more informaiton is printed out
   */
  void SetVerbose(bool val) { this->GeneratorVerbose = val; }

  /**
   * Do the actual processing. Subclass has to override it.
   * Return 0 if error.
   */
  virtual int ProcessGenerator();

  /**
   * Initialize generator
   */
  int Initialize(const char* name, cmMakefile* mf, const char* argv0);

  /**
   * Construct generator
   */
  cmCPackGenericGenerator();
  virtual ~cmCPackGenericGenerator();

  //! Set and get the options
  void SetOption(const char* op, const char* value);
  void SetOptionIfNotSet(const char* op, const char* value);
  const char* GetOption(const char* op);

  //! Set all the variables
  int FindRunningCMake(const char* arg0);

  //! Set the logger
  void SetLogger(cmCPackLog* log) { this->Logger = log; }

  //! Display verbose information via logger
  void DisplayVerboseOutput(const char* msg, float progress);

protected:
  int PrepareNames();
  int InstallProject();
  int CleanTemporaryDirectory();
  virtual const char* GetOutputExtension() { return ".cpack"; }
  virtual const char* GetOutputPostfix() { return 0; }
  virtual int CompressFiles(const char* outFileName, const char* toplevel,
    const std::vector<std::string>& files);
  virtual const char* GetInstallPath();
  virtual const char* GetInstallPrefix() { return "/"; }
  virtual const char* GetTemporaryInstallDirectoryPostfix() { return ""; }

  virtual std::string FindTemplate(const char* name);
  virtual bool ConfigureFile(const char* inName, const char* outName,
    bool copyOnly = false);
  virtual bool ConfigureString(const std::string& input, std::string& output);
  virtual int InitializeInternal();


  //! Run install commands if specified
  virtual int InstallProjectViaInstallCommands(
    bool movable, const char* tempInstallDirectory);
  virtual int InstallProjectViaInstallScript(
    bool movable, const char* tempInstallDirectory);
  virtual int InstallProjectViaInstalledDirectories(
    bool movable, const char* tempInstallDirectory);
  virtual int InstallProjectViaInstallCMakeProjects(
    bool movable, const char* tempInstallDirectory);

  bool GeneratorVerbose;
  std::string Name;

  std::string InstallPath;

  std::string CPackSelf;
  std::string CMakeSelf;
  std::string CMakeRoot;

  cmCPackLog* Logger;

  cmMakefile* Makefile;
};

#endif