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[] = { static const char* targetPolicyWhitelist[] = {
"CMP0003" 0
, "CMP0004" #define TARGET_POLICY_STRING(POLICY) \
, "CMP0008" , #POLICY
, "CMP0020"
CM_FOR_EACH_TARGET_POLICY(TARGET_POLICY_STRING)
#undef TARGET_POLICY_STRING
}; };
cmPolicies::PolicyStatus statusForTarget(cmTarget *tgt, const char *policy) 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 tgt->GetPolicyStatus ## POLICY (); \
} \ } \
RETURN_POLICY(CMP0003) CM_FOR_EACH_TARGET_POLICY(RETURN_POLICY)
RETURN_POLICY(CMP0004)
RETURN_POLICY(CMP0008)
RETURN_POLICY(CMP0020)
#undef RETURN_POLICY #undef RETURN_POLICY
@ -1066,10 +1066,7 @@ cmPolicies::PolicyID policyForString(const char *policy_id)
return cmPolicies:: POLICY_ID; \ return cmPolicies:: POLICY_ID; \
} \ } \
RETURN_POLICY_ID(CMP0003) CM_FOR_EACH_TARGET_POLICY(RETURN_POLICY_ID)
RETURN_POLICY_ID(CMP0004)
RETURN_POLICY_ID(CMP0008)
RETURN_POLICY_ID(CMP0020)
#undef RETURN_POLICY_ID #undef RETURN_POLICY_ID
@ -1099,7 +1096,7 @@ static const struct TargetPolicyNode : public cmGeneratorExpressionNode
context->HadContextSensitiveCondition = true; context->HadContextSensitiveCondition = true;
for (size_t i = 0; for (size_t i = 1;
i < (sizeof(targetPolicyWhitelist) / i < (sizeof(targetPolicyWhitelist) /
sizeof(*targetPolicyWhitelist)); sizeof(*targetPolicyWhitelist));
++i) ++i)
@ -1125,8 +1122,17 @@ static const struct TargetPolicyNode : public cmGeneratorExpressionNode
} }
reportError(context, content->GetOriginalExpression(), reportError(context, content->GetOriginalExpression(),
"$<TARGET_POLICY:prop> may only be used with a limited number of " "$<TARGET_POLICY:prop> may only be used with a limited number of "
"policies. Currently it may be used with policies CMP0003, CMP0004, " "policies. Currently it may be used with the following policies:\n"
"CMP0008 and CMP0020."
#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(); return std::string();
} }

View File

@ -191,13 +191,14 @@ cmTargetInternals::~cmTargetInternals()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmTarget::cmTarget() 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->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->LinkLibrariesAnalyzed = false;
this->HaveInstallRule = false; this->HaveInstallRule = false;
this->DLLPlatform = false; this->DLLPlatform = false;
@ -1694,18 +1695,13 @@ void cmTarget::SetMakefile(cmMakefile* mf)
this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0); this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0);
// Record current policies for later use. // Record current policies for later use.
this->PolicyStatusCMP0003 = #define CAPTURE_TARGET_POLICY(POLICY) \
this->Makefile->GetPolicyStatus(cmPolicies::CMP0003); this->PolicyStatus ## POLICY = \
this->PolicyStatusCMP0004 = this->Makefile->GetPolicyStatus(cmPolicies::POLICY);
this->Makefile->GetPolicyStatus(cmPolicies::CMP0004);
this->PolicyStatusCMP0008 = CM_FOR_EACH_TARGET_POLICY(CAPTURE_TARGET_POLICY)
this->Makefile->GetPolicyStatus(cmPolicies::CMP0008);
this->PolicyStatusCMP0020 = #undef CAPTURE_TARGET_POLICY
this->Makefile->GetPolicyStatus(cmPolicies::CMP0020);
this->PolicyStatusCMP0021 =
this->Makefile->GetPolicyStatus(cmPolicies::CMP0021);
this->PolicyStatusCMP0022 =
this->Makefile->GetPolicyStatus(cmPolicies::CMP0022);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -19,6 +19,14 @@
#include <cmsys/auto_ptr.hxx> #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 cmake;
class cmMakefile; class cmMakefile;
class cmSourceFile; class cmSourceFile;
@ -91,29 +99,13 @@ public:
void SetMakefile(cmMakefile *mf); void SetMakefile(cmMakefile *mf);
cmMakefile *GetMakefile() const { return this->Makefile;}; cmMakefile *GetMakefile() const { return this->Makefile;};
/** Get the status of policy CMP0003 when the target was created. */ #define DECLARE_TARGET_POLICY(POLICY) \
cmPolicies::PolicyStatus GetPolicyStatusCMP0003() const cmPolicies::PolicyStatus GetPolicyStatus ## POLICY () const \
{ return this->PolicyStatusCMP0003; } { return this->PolicyStatus ## POLICY; }
/** Get the status of policy CMP0004 when the target was created. */ CM_FOR_EACH_TARGET_POLICY(DECLARE_TARGET_POLICY)
cmPolicies::PolicyStatus GetPolicyStatusCMP0004() const
{ return this->PolicyStatusCMP0004; }
/** Get the status of policy CMP0008 when the target was created. */ #undef DECLARE_TARGET_POLICY
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; }
/** /**
* Get the list of the custom commands for this target * Get the list of the custom commands for this target
@ -694,12 +686,12 @@ private:
cmMakefile* Makefile; cmMakefile* Makefile;
// Policy status recorded when target was created. // Policy status recorded when target was created.
cmPolicies::PolicyStatus PolicyStatusCMP0003; #define TARGET_POLICY_MEMBER(POLICY) \
cmPolicies::PolicyStatus PolicyStatusCMP0004; cmPolicies::PolicyStatus PolicyStatus ## POLICY;
cmPolicies::PolicyStatus PolicyStatusCMP0008;
cmPolicies::PolicyStatus PolicyStatusCMP0020; CM_FOR_EACH_TARGET_POLICY(TARGET_POLICY_MEMBER)
cmPolicies::PolicyStatus PolicyStatusCMP0021;
cmPolicies::PolicyStatus PolicyStatusCMP0022; #undef TARGET_POLICY_MEMBER
// Internal representation details. // Internal representation details.
friend class cmTargetInternals; friend class cmTargetInternals;

View File

@ -96,6 +96,7 @@ add_RunCMake_test(list)
add_RunCMake_test(try_compile) add_RunCMake_test(try_compile)
add_RunCMake_test(variable_watch) add_RunCMake_test(variable_watch)
add_RunCMake_test(CMP0004) add_RunCMake_test(CMP0004)
add_RunCMake_test(TargetPolicies)
find_package(Qt4 QUIET) find_package(Qt4 QUIET)
find_package(Qt5Core 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;
}