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:
Stephen Kelly 2013-06-28 11:25:40 +02:00
parent 3e30d9ed67
commit 484bb888a0
10 changed files with 90 additions and 60 deletions

View File

@ -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();
}

View File

@ -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
}
//----------------------------------------------------------------------------

View File

@ -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;

View File

@ -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)

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 2.8)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@ -0,0 +1 @@
1

View File

@ -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

View File

@ -0,0 +1,8 @@
enable_language(CXX)
add_library(empty empty.cpp)
target_compile_definitions(empty
PRIVATE
$<$<TARGET_POLICY:NOT_A_POLICY>:SOME_DEFINE>
)

View File

@ -0,0 +1,3 @@
include(RunCMake)
run_cmake(PolicyList)

View File

@ -0,0 +1,7 @@
#ifdef _WIN32
__declspec(dllexport)
#endif
int empty(void)
{
return 0;
}