summaryrefslogtreecommitdiffstats
path: root/Source/cmSourceFile.h
blob: 7f00483d3c1cc55833d7b7e8d1df15430a9f6011 (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., Insight Consortium.  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 cmSourceFile_h
#define cmSourceFile_h

#include "cmCustomCommand.h"
#include "cmPropertyMap.h"

class cmake;
class cmMakefile;

/** \class cmSourceFile
 * \brief Represent a class loaded from a makefile.
 *
 * cmSourceFile is represents a class loaded from 
 * a makefile.
 */
class cmSourceFile
{
public:
  /**
   * Construct instance as a concrete class with both a
   * .h and .cxx file.
   */
  cmSourceFile();
  ~cmSourceFile()
    {
      this->SetCustomCommand(0);
    }
  
  /**
   * Set the name of the file, given the directory the file should be
   * in.  The various extensions provided are tried on the name
   * (e.g., cxx, cpp) in the directory to find the actual file.
   */
  bool SetName(const char* name, const char* dir,
               const std::vector<std::string>& sourceExts,
               const std::vector<std::string>& headerExts,
               const char* target = 0);

  /**
   * Get the list of the custom commands for this source file
   */
  const cmCustomCommand *GetCustomCommand() const 
    {return this->CustomCommand;}
  cmCustomCommand *GetCustomCommand() {return this->CustomCommand;}
  void SetCustomCommand(cmCustomCommand *cc);
    
  /**
   * Set the name of the file, given the directory the file should be in.  IN
   * this version the extension is provided in the call. This is useful for
   * generated files that do not exist prior to the build.  
   */
  void SetName(const char* name, const char* dir, const char *ext, 
               bool headerFileOnly);

  /**
   * Print the structure to std::cout.
   */
  void Print() const;

  ///! Set/Get a property of this source file
  void SetProperty(const char *prop, const char *value);
  const char *GetProperty(const char *prop) const;
  bool GetPropertyAsBool(const char *prop) const;
    
  /**
   * The full path to the file.
   */
  const std::string &GetFullPath() const {return this->FullPath;}
  void SetFullPath(const char *name) {this->FullPath = name;}

  /**
   * The file name associated with stripped off directory and extension.
   * (In most cases this is the name of the class.)
   */
  const std::string &GetSourceName() const {return this->SourceName;}
  void SetSourceName(const char *name) {this->SourceName = name;}

  /**
   * The file extension associated with source file
   */
  const std::string &GetSourceExtension() const {
    return this->SourceExtension;}
  void SetSourceExtension(const char *name) {this->SourceExtension = name;}

  /**
   * Return the vector that holds the list of dependencies
   */
  const std::vector<std::string> &GetDepends() const {return this->Depends;}
  std::vector<std::string> &GetDepends() {return this->Depends;}

  /**
   * Get the source name without last extension
   */
  const std::string& GetSourceNameWithoutLastExtension();

  // Get the properties
  cmPropertyMap &GetProperties() { return this->Properties; };

  // Define the properties
  static void DefineProperties(cmake *cm);

  ///! Set the cmMakefile that owns this target
  void SetMakefile(cmMakefile *mf);
  cmMakefile *GetMakefile() { return this->Makefile;};

private:
  cmPropertyMap Properties;
  cmCustomCommand *CustomCommand;
  std::string FullPath;
  std::string SourceName;
  std::string SourceExtension;
  std::vector<std::string> Depends;
  std::string SourceNameWithoutLastExtension;

  // The cmMakefile instance that owns this source file.  This should
  // always be set.
  cmMakefile* Makefile;
};

#endif