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[] = {
|
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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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