mirror of
https://github.com/reactos/CMake.git
synced 2025-01-09 05:00:35 +00:00
882f48e5ba
When CMP0003 was first introduced we wanted to link all libraries by full path. However, some projects had problems on platforms where find_library would find /usr/lib/libfoo.so when the project really wanted to link to /usr/lib/<arch>/libfoo.so and had been working by accident because pre-CMP0003 behavior used -lfoo to link. We first tried to address that in commit v2.6.0~440 (Teach find_library to avoid returning library paths in system directories, 2008-01-23) by returning just "foo" for libraries in implicit link directories. This caused problems for projects expecting find_library to always return a full path. We ended up using the solution in commit v2.6.0~366 (... switch library paths found in implicit link directories to use -l, 2008-01-31). However, the special case for libraries in implicit link directories has also proven problematic and confusing. Introduce policy CMP0060 to switch to linking all libraries by full path even if they are in implicit link directories. Explain in the policy documentation the factors that led to the original approach and now to this approach.
177 lines
7.5 KiB
C++
177 lines
7.5 KiB
C++
/*============================================================================
|
|
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
|
|
CMP0043, ///< Ignore COMPILE_DEFINITIONS_<Config> properties
|
|
CMP0044, ///< Case sensitive <LANG>_COMPILER_ID generator expressions
|
|
CMP0045, ///< Error on non-existent target in get_target_property
|
|
CMP0046, ///< Error on non-existent dependency in add_dependencies
|
|
CMP0047, ///< Use QCC compiler id for the qcc drivers on QNX.
|
|
CMP0048, ///< project() command manages VERSION variables
|
|
CMP0049, ///< Do not expand variables in target source entries
|
|
CMP0050, ///< Disallow add_custom_command SOURCE signatures
|
|
CMP0051, ///< List TARGET_OBJECTS in SOURCES target property
|
|
CMP0052, ///< Reject source and build dirs in installed
|
|
/// INTERFACE_INCLUDE_DIRECTORIES
|
|
|
|
CMP0053, ///< Simplify variable reference and escape sequence evaluation
|
|
CMP0054, ///< Only interpret if() arguments as variables
|
|
/// or keywords when unquoted.
|
|
CMP0055, ///< Strict checking for break() command.
|
|
CMP0056, ///< Honor link flags in try_compile() source-file signature.
|
|
CMP0057, ///< Disallow multiple MAIN_DEPENDENCY specifications
|
|
/// for the same file.
|
|
CMP0058, ///< Ninja requires custom command byproducts to be explicit
|
|
CMP0059, ///< Do not treat ``DEFINITIONS`` as a built-in directory
|
|
/// property.
|
|
CMP0060, ///< Link libraries by full path even in implicit directories.
|
|
|
|
/** \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,
|
|
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
|