Genex: Make CMP0021 and CMP0022 usable with TARGET_POLICY
Use preprocessor loops and add a unit test for the appropriate policies. All policies whose value is recorded at target creation time should be part of this list.
This commit is contained in:
parent
3e30d9ed67
commit
484bb888a0
|
@ -1033,10 +1033,13 @@ static const struct TargetNameNode : public cmGeneratorExpressionNode
|
|||
|
||||
//----------------------------------------------------------------------------
|
||||
static const char* targetPolicyWhitelist[] = {
|
||||
"CMP0003"
|
||||
, "CMP0004"
|
||||
, "CMP0008"
|
||||
, "CMP0020"
|
||||
0
|
||||
#define TARGET_POLICY_STRING(POLICY) \
|
||||
, #POLICY
|
||||
|
||||
CM_FOR_EACH_TARGET_POLICY(TARGET_POLICY_STRING)
|
||||
|
||||
#undef TARGET_POLICY_STRING
|
||||
};
|
||||
|
||||
cmPolicies::PolicyStatus statusForTarget(cmTarget *tgt, const char *policy)
|
||||
|
@ -1047,10 +1050,7 @@ cmPolicies::PolicyStatus statusForTarget(cmTarget *tgt, const char *policy)
|
|||
return tgt->GetPolicyStatus ## POLICY (); \
|
||||
} \
|
||||
|
||||
RETURN_POLICY(CMP0003)
|
||||
RETURN_POLICY(CMP0004)
|
||||
RETURN_POLICY(CMP0008)
|
||||
RETURN_POLICY(CMP0020)
|
||||
CM_FOR_EACH_TARGET_POLICY(RETURN_POLICY)
|
||||
|
||||
#undef RETURN_POLICY
|
||||
|
||||
|
@ -1066,10 +1066,7 @@ cmPolicies::PolicyID policyForString(const char *policy_id)
|
|||
return cmPolicies:: POLICY_ID; \
|
||||
} \
|
||||
|
||||
RETURN_POLICY_ID(CMP0003)
|
||||
RETURN_POLICY_ID(CMP0004)
|
||||
RETURN_POLICY_ID(CMP0008)
|
||||
RETURN_POLICY_ID(CMP0020)
|
||||
CM_FOR_EACH_TARGET_POLICY(RETURN_POLICY_ID)
|
||||
|
||||
#undef RETURN_POLICY_ID
|
||||
|
||||
|
@ -1099,7 +1096,7 @@ static const struct TargetPolicyNode : public cmGeneratorExpressionNode
|
|||
|
||||
context->HadContextSensitiveCondition = true;
|
||||
|
||||
for (size_t i = 0;
|
||||
for (size_t i = 1;
|
||||
i < (sizeof(targetPolicyWhitelist) /
|
||||
sizeof(*targetPolicyWhitelist));
|
||||
++i)
|
||||
|
@ -1125,8 +1122,17 @@ static const struct TargetPolicyNode : public cmGeneratorExpressionNode
|
|||
}
|
||||
reportError(context, content->GetOriginalExpression(),
|
||||
"$<TARGET_POLICY:prop> may only be used with a limited number of "
|
||||
"policies. Currently it may be used with policies CMP0003, CMP0004, "
|
||||
"CMP0008 and CMP0020."
|
||||
"policies. Currently it may be used with the following policies:\n"
|
||||
|
||||
#define STRINGIFY_HELPER(X) #X
|
||||
#define STRINGIFY(X) STRINGIFY_HELPER(X)
|
||||
|
||||
#define TARGET_POLICY_LIST_ITEM(POLICY) \
|
||||
" * " STRINGIFY(POLICY) "\n"
|
||||
|
||||
CM_FOR_EACH_TARGET_POLICY(TARGET_POLICY_LIST_ITEM)
|
||||
|
||||
#undef TARGET_POLICY_LIST_ITEM
|
||||
);
|
||||
return std::string();
|
||||
}
|
||||
|
|
|
@ -191,13 +191,14 @@ cmTargetInternals::~cmTargetInternals()
|
|||
//----------------------------------------------------------------------------
|
||||
cmTarget::cmTarget()
|
||||
{
|
||||
#define INITIALIZE_TARGET_POLICY_MEMBER(POLICY) \
|
||||
this->PolicyStatus ## POLICY = cmPolicies::WARN;
|
||||
|
||||
CM_FOR_EACH_TARGET_POLICY(INITIALIZE_TARGET_POLICY_MEMBER)
|
||||
|
||||
#undef INITIALIZE_TARGET_POLICY_MEMBER
|
||||
|
||||
this->Makefile = 0;
|
||||
this->PolicyStatusCMP0003 = cmPolicies::WARN;
|
||||
this->PolicyStatusCMP0004 = cmPolicies::WARN;
|
||||
this->PolicyStatusCMP0008 = cmPolicies::WARN;
|
||||
this->PolicyStatusCMP0020 = cmPolicies::WARN;
|
||||
this->PolicyStatusCMP0021 = cmPolicies::WARN;
|
||||
this->PolicyStatusCMP0022 = cmPolicies::WARN;
|
||||
this->LinkLibrariesAnalyzed = false;
|
||||
this->HaveInstallRule = false;
|
||||
this->DLLPlatform = false;
|
||||
|
@ -1694,18 +1695,13 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0);
|
||||
|
||||
// Record current policies for later use.
|
||||
this->PolicyStatusCMP0003 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0003);
|
||||
this->PolicyStatusCMP0004 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0004);
|
||||
this->PolicyStatusCMP0008 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0008);
|
||||
this->PolicyStatusCMP0020 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0020);
|
||||
this->PolicyStatusCMP0021 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0021);
|
||||
this->PolicyStatusCMP0022 =
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0022);
|
||||
#define CAPTURE_TARGET_POLICY(POLICY) \
|
||||
this->PolicyStatus ## POLICY = \
|
||||
this->Makefile->GetPolicyStatus(cmPolicies::POLICY);
|
||||
|
||||
CM_FOR_EACH_TARGET_POLICY(CAPTURE_TARGET_POLICY)
|
||||
|
||||
#undef CAPTURE_TARGET_POLICY
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
|
@ -19,6 +19,14 @@
|
|||
|
||||
#include <cmsys/auto_ptr.hxx>
|
||||
|
||||
#define CM_FOR_EACH_TARGET_POLICY(F) \
|
||||
F(CMP0003) \
|
||||
F(CMP0004) \
|
||||
F(CMP0008) \
|
||||
F(CMP0020) \
|
||||
F(CMP0021) \
|
||||
F(CMP0022)
|
||||
|
||||
class cmake;
|
||||
class cmMakefile;
|
||||
class cmSourceFile;
|
||||
|
@ -91,29 +99,13 @@ public:
|
|||
void SetMakefile(cmMakefile *mf);
|
||||
cmMakefile *GetMakefile() const { return this->Makefile;};
|
||||
|
||||
/** Get the status of policy CMP0003 when the target was created. */
|
||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0003() const
|
||||
{ return this->PolicyStatusCMP0003; }
|
||||
#define DECLARE_TARGET_POLICY(POLICY) \
|
||||
cmPolicies::PolicyStatus GetPolicyStatus ## POLICY () const \
|
||||
{ return this->PolicyStatus ## POLICY; }
|
||||
|
||||
/** Get the status of policy CMP0004 when the target was created. */
|
||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0004() const
|
||||
{ return this->PolicyStatusCMP0004; }
|
||||
CM_FOR_EACH_TARGET_POLICY(DECLARE_TARGET_POLICY)
|
||||
|
||||
/** Get the status of policy CMP0008 when the target was created. */
|
||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0008() const
|
||||
{ return this->PolicyStatusCMP0008; }
|
||||
|
||||
/** Get the status of policy CMP0020 when the target was created. */
|
||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0020() const
|
||||
{ return this->PolicyStatusCMP0020; }
|
||||
|
||||
/** Get the status of policy CMP0021 when the target was created. */
|
||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0021() const
|
||||
{ return this->PolicyStatusCMP0021; }
|
||||
|
||||
/** Get the status of policy CMP0022 when the target was created. */
|
||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0022() const
|
||||
{ return this->PolicyStatusCMP0022; }
|
||||
#undef DECLARE_TARGET_POLICY
|
||||
|
||||
/**
|
||||
* Get the list of the custom commands for this target
|
||||
|
@ -694,12 +686,12 @@ private:
|
|||
cmMakefile* Makefile;
|
||||
|
||||
// Policy status recorded when target was created.
|
||||
cmPolicies::PolicyStatus PolicyStatusCMP0003;
|
||||
cmPolicies::PolicyStatus PolicyStatusCMP0004;
|
||||
cmPolicies::PolicyStatus PolicyStatusCMP0008;
|
||||
cmPolicies::PolicyStatus PolicyStatusCMP0020;
|
||||
cmPolicies::PolicyStatus PolicyStatusCMP0021;
|
||||
cmPolicies::PolicyStatus PolicyStatusCMP0022;
|
||||
#define TARGET_POLICY_MEMBER(POLICY) \
|
||||
cmPolicies::PolicyStatus PolicyStatus ## POLICY;
|
||||
|
||||
CM_FOR_EACH_TARGET_POLICY(TARGET_POLICY_MEMBER)
|
||||
|
||||
#undef TARGET_POLICY_MEMBER
|
||||
|
||||
// Internal representation details.
|
||||
friend class cmTargetInternals;
|
||||
|
|
|
@ -96,6 +96,7 @@ add_RunCMake_test(list)
|
|||
add_RunCMake_test(try_compile)
|
||||
add_RunCMake_test(variable_watch)
|
||||
add_RunCMake_test(CMP0004)
|
||||
add_RunCMake_test(TargetPolicies)
|
||||
|
||||
find_package(Qt4 QUIET)
|
||||
find_package(Qt5Core QUIET)
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
cmake_minimum_required(VERSION 2.8)
|
||||
project(${RunCMake_TEST} NONE)
|
||||
include(${RunCMake_TEST}.cmake)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,13 @@
|
|||
Error evaluating generator expression:
|
||||
|
||||
\$<TARGET_POLICY:NOT_A_POLICY>
|
||||
|
||||
\$<TARGET_POLICY:prop> may only be used with a limited number of policies.
|
||||
Currently it may be used with the following policies:
|
||||
|
||||
\* CMP0003
|
||||
\* CMP0004
|
||||
\* CMP0008
|
||||
\* CMP0020
|
||||
\* CMP0021
|
||||
\* CMP0022
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
enable_language(CXX)
|
||||
|
||||
add_library(empty empty.cpp)
|
||||
target_compile_definitions(empty
|
||||
PRIVATE
|
||||
$<$<TARGET_POLICY:NOT_A_POLICY>:SOME_DEFINE>
|
||||
)
|
|
@ -0,0 +1,3 @@
|
|||
include(RunCMake)
|
||||
|
||||
run_cmake(PolicyList)
|
|
@ -0,0 +1,7 @@
|
|||
#ifdef _WIN32
|
||||
__declspec(dllexport)
|
||||
#endif
|
||||
int empty(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue