summaryrefslogtreecommitdiff
path: root/Source/cmMakeDepend.h
blob: c6b9a3465b56a93553671e07ddccde12b61ab48c (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
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$


  Copyright (c) 2000 National Library of Medicine
  All rights reserved.

  See COPYRIGHT.txt for copyright details.

=========================================================================*/
/**
 * cmMakeDepend 
 */
#ifndef cmMakeDepend_h
#define cmMakeDepend_h

#include "cmMakefile.h"
#include "cmClassFile.h"
#include "cmRegularExpression.h"
#include <vector>
#include <string>


// This structure stores the depend information 
// for a single source file
struct cmDependInformation
{
  cmDependInformation() 
    {
      m_DependDone = false;
      m_ClassFileIndex = -1;
    }
// index into m_DependInformation array of cmMakeDepend 
// class, represents the files that this file depends on
  std::vector<int> m_Indices;	

// full path to file
  std::string m_FullPath;	

// name as include directive uses
  std::string m_IncludeName;

// refers back to the index of the  cmMakefile's array
// of cmClassFile objects which this class class describes,
// -1 for files not in the array
  int m_ClassFileIndex;	
  
// flag to determine if depends have
// been done for this file
  bool m_DependDone;
  
// function to add the depends of another file to this one
  void MergeInfo(cmDependInformation*);
  
// remove duplicate depends from the index list
  void RemoveDuplicateIndices();
};


// cmMakeDepend is used to generate dependancy information for
// the classes in a makefile
class cmMakeDepend
{
public:
  cmMakeDepend();
  ~cmMakeDepend();
  
  /** 
   * Set the makefile that is used as a source of classes.
   */
  void SetMakefile(cmMakefile* makefile); 
  /** 
   * Generate the depend information
   */
  void DoDepends();
  /** 
   * Set a regular expression that include files must match
   * in order to be considered as part of the depend information
   */
  void SetIncludeRegularExpression(const char* regex);
  /**
   * Add a directory to the search path for include files
   */
  void AddSearchPath(const char*);
private: 
  void AddFileToSearchPath(const char* filepath);
  /**
   * Find the index into the m_DependInformation array
   * that matches the given m_IncludeName
   */
  int FindInformation(const char* includeName);
  /**
   * Compute the depend information for this class
   */
  void Depend(cmDependInformation* info);
  /** 
   * Find the full path name for the given file name.
   * This uses the include directories
   */
  std::string FullPath(const char*);
private:
  cmMakefile* m_Makefile;
  bool m_Verbose;
  cmRegularExpression m_IncludeFileRegularExpression;
  typedef std::vector<cmDependInformation*> DependArray;
  DependArray m_DependInformation;
  std::vector<std::string> m_IncludeDirectories;
};

#endif