summaryrefslogtreecommitdiffstats
path: root/Source/cmPolicies.h
blob: 66eaf875718ee5ed6814da89fff3d413158e3675 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*============================================================================
  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.
============================================================================*/
#ifndef cmPolicies_h
#define cmPolicies_h

#include "cmCustomCommand.h"

class cmake;
class cmMakefile;
class cmPolicy;

/** \class cmPolicies
 * \brief Handles changes in CMake behavior and policies
 *
 * See the cmake wiki section on
 * <a href="http://www.cmake.org/Wiki/CMake/Policies">policies</a>
 * for an overview of this class's purpose
 */
class cmPolicies
{
public:
  cmPolicies();
  ~cmPolicies();

  /// Status of a policy
  enum PolicyStatus {
    OLD, ///< Use old behavior
    WARN, ///< Use old behavior but issue a warning
    NEW, ///< Use new behavior
    /// Issue an error if user doesn't set policy status to NEW and hits the
    /// check
    REQUIRED_IF_USED,
    REQUIRED_ALWAYS ///< Issue an error unless user sets policy status to NEW.
  };
  static const char* PolicyStatusNames[];

  /// Policy identifiers
  enum PolicyID
  {
    CMP0000, ///< Policy version specification
    CMP0001, ///< Ignore old compatibility variable
    CMP0002, ///< Target names must be unique
    CMP0003, ///< Linking does not include extra -L paths
    CMP0004, ///< Libraries linked may not have leading or trailing whitespace
    CMP0005, ///< Definition value escaping
    CMP0006, ///< BUNDLE install rules needed for MACOSX_BUNDLE targets
    CMP0007, ///< list command handling of empty elements
    CMP0008, ///< Full-path libraries must be a valid library file name
    CMP0009, ///< GLOB_RECURSE should not follow symlinks by default
    CMP0010, ///< Bad variable reference syntax is an error
    CMP0011, ///< Strong policy scope for include and find_package
    CMP0012, ///< Recognize numbers and boolean constants in if()
    CMP0013, ///< Duplicate binary directories not allowed
    CMP0014, ///< Input directories must have CMakeLists.txt
    CMP0015, ///< link_directories() treats paths relative to source dir
    /// target_link_libraries() fails if only argument is not a target
    CMP0016,
    CMP0017, ///< Prefer files in CMAKE_ROOT when including from CMAKE_ROOT
    CMP0018, ///< Ignore language flags for shared libs, and adhere to
    /// POSITION_INDEPENDENT_CODE property and *_COMPILE_OPTIONS_PI{E,C}
    /// instead.
    CMP0019, ///< No variable re-expansion in include and link info
    CMP0020, ///< Automatically link Qt executables to qtmain target
    CMP0021, ///< Fatal error on relative paths in INCLUDE_DIRECTORIES
    /// target property
    CMP0022, ///< INTERFACE_LINK_LIBRARIES defines the link interface
    CMP0023, ///< Disallow mixing keyword and plain tll signatures
    CMP0024, ///< Disallow including export() result.
    CMP0025, ///< Compiler id for Apple Clang is now AppleClang
    CMP0026, ///< Disallow use of the LOCATION target property.
    CMP0027, ///< Conditionally linked imported targets with missing include
    /// directories.
    CMP0028, ///< Double colon in target name means ALIAS or IMPORTED target.
    CMP0029, ///< Disallow command: subdir_depends
    CMP0030, ///< Disallow command: use_mangled_mesa
    CMP0031, ///< Disallow command: load_command
    CMP0032, ///< Disallow command: output_required_files
    CMP0033, ///< Disallow command: export_library_dependencies
    CMP0034, ///< Disallow command: utility_source
    CMP0035, ///< Disallow command: variable_requires
    CMP0036, ///< Disallow command: build_name
    CMP0037, ///< Target names should not be reserved and
    /// should match a validity pattern.
    CMP0038, ///< Targets may not link directly to themselves
    CMP0039, ///< Utility targets may not have link dependencies
    CMP0040, ///< The target in the TARGET signature of
    /// add_custom_command() must exist.
    CMP0041, ///< Error on relative include with generator expression
    CMP0042, ///< Enable MACOSX_RPATH by default

    /** \brief Always the last entry.
     *
     * Useful mostly to avoid adding a comma the last policy when adding a new
     * one.
     */
    CMPCOUNT
  };

  ///! convert a string policy ID into a number
  bool GetPolicyID(const char *id, /* out */ cmPolicies::PolicyID &pid);
  std::string GetPolicyIDString(cmPolicies::PolicyID pid);

  ///! Get the default status for a policy
  cmPolicies::PolicyStatus GetPolicyStatus(cmPolicies::PolicyID id);

  ///! Define a Policy for CMake
  void DefinePolicy(cmPolicies::PolicyID id,
                    const char *stringID,
                    const char *shortDescription,
                    unsigned int majorVersionIntroduced,
                    unsigned int minorVersionIntroduced,
                    unsigned int patchVersionIntroduced,
                    unsigned int tweakVersionIntroduced,
                    cmPolicies::PolicyStatus status);

  ///! Set a policy level for this listfile
  bool ApplyPolicyVersion(cmMakefile *mf, const char *version);

  ///! return a warning string for a given policy
  std::string GetPolicyWarning(cmPolicies::PolicyID id);

  ///! return an error string for when a required policy is unspecified
  std::string GetRequiredPolicyError(cmPolicies::PolicyID id);

  ///! return an error string for when a required policy is unspecified
  std::string GetRequiredAlwaysPolicyError(cmPolicies::PolicyID id);

  /** Represent a set of policy values.  */
  typedef std::map<PolicyID, PolicyStatus> PolicyMap;

  private:
  // might have to make these internal for VS6 not sure yet
  std::map<PolicyID,cmPolicy *> Policies;
  std::map<std::string,PolicyID> PolicyStringMap;

  void DiagnoseAncientPolicies(std::vector<PolicyID> const& ancient,
                               unsigned int majorVer, unsigned int minorVer,
                               unsigned int patchVer, cmMakefile* mf);

  bool GetPolicyDefault(cmMakefile* mf, std::string const& policy,
                        cmPolicies::PolicyStatus* defaultStatus);

};

#endif