diff options
author | Ken Martin <ken.martin@kitware.com> | 2007-10-24 18:43:10 (GMT) |
---|---|---|
committer | Ken Martin <ken.martin@kitware.com> | 2007-10-24 18:43:10 (GMT) |
commit | f72d666a7bd7a1b58db5f08b5ee9124f6768fa2a (patch) | |
tree | 60e30ec34afc9bf475546d35689b4e18144956bd /Source | |
parent | c2f0aac146f6b990940240891b959dc1f394e80c (diff) | |
download | CMake-f72d666a7bd7a1b58db5f08b5ee9124f6768fa2a.zip CMake-f72d666a7bd7a1b58db5f08b5ee9124f6768fa2a.tar.gz CMake-f72d666a7bd7a1b58db5f08b5ee9124f6768fa2a.tar.bz2 |
ENH: add ability to get documentaiton of a property from a script
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGetPropertyCommand.cxx | 61 | ||||
-rw-r--r-- | Source/cmGetPropertyCommand.h | 10 | ||||
-rw-r--r-- | Source/cmPropertyDefinition.h | 6 | ||||
-rw-r--r-- | Source/cmake.cxx | 11 | ||||
-rw-r--r-- | Source/cmake.h | 4 |
5 files changed, 83 insertions, 9 deletions
diff --git a/Source/cmGetPropertyCommand.cxx b/Source/cmGetPropertyCommand.cxx index 44ad26e..273cfd6 100644 --- a/Source/cmGetPropertyCommand.cxx +++ b/Source/cmGetPropertyCommand.cxx @@ -18,6 +18,7 @@ #include "cmake.h" #include "cmTest.h" +#include "cmPropertyDefinition.h" // cmGetPropertyCommand bool cmGetPropertyCommand::InitialPass( @@ -31,33 +32,51 @@ bool cmGetPropertyCommand::InitialPass( // the last argument in the property to get const char *property = args[args.size()-1].c_str(); + bool get_brief = false; + if (!strcmp(property,"BRIEF_DOCS")) + { + get_brief = true; + property = args[args.size()-2].c_str(); + } + bool get_full = false; + if (!strcmp(property,"FULL_DOCS")) + { + get_full = true; + property = args[args.size()-2].c_str(); + } + std::string output = "NOTFOUND"; cmProperty::ScopeType scope; const char *scopeName = 0; - if (args[1] == "GLOBAL" && args.size() == 3) + if (args[1] == "GLOBAL") { scope = cmProperty::GLOBAL; } + else if (args[1] == "VARIABLE") + { + scope = cmProperty::VARIABLE; + } else if (args[1] == "DIRECTORY" && args.size() >= 3) { scope = cmProperty::DIRECTORY; - if (args.size() >= 4) + if ((args.size() == 4 && !get_brief && !get_full) || + (args.size() == 5 && (get_brief || get_full))) { scopeName = args[2].c_str(); } } - else if (args[1] == "TARGET" && args.size() == 4) + else if (args[1] == "TARGET" && args.size() >= 4) { scope = cmProperty::TARGET; scopeName = args[2].c_str(); } - else if (args[1] == "TEST" && args.size() == 4) + else if (args[1] == "TEST" && args.size() >= 4) { scope = cmProperty::TEST; scopeName = args[2].c_str(); } - else if (args[1] == "SOURCE_FILE" && args.size() == 4) + else if (args[1] == "SOURCE_FILE" && args.size() >= 4) { scope = cmProperty::SOURCE_FILE; scopeName = args[2].c_str(); @@ -68,8 +87,37 @@ bool cmGetPropertyCommand::InitialPass( return false; } - switch (scope) + if (get_brief) + { + cmPropertyDefinition *def = + this->Makefile->GetCMakeInstance()-> + GetPropertyDefinition(property,scope); + if (def) + { + output = def->GetShortDescription(); + } + } + else if (get_full) { + cmPropertyDefinition *def = + this->Makefile->GetCMakeInstance()-> + GetPropertyDefinition(property,scope); + if (def) + { + output = def->GetFullDescription(); + } + } + + else switch (scope) + { + case cmProperty::VARIABLE: + { + if (this->Makefile->GetDefinition(property)) + { + output = this->Makefile->GetDefinition(property); + } + } + break; case cmProperty::TARGET: { cmTarget *tgt = this->Makefile->GetLocalGenerator()->GetGlobalGenerator() @@ -152,7 +200,6 @@ bool cmGetPropertyCommand::InitialPass( } } break; - case cmProperty::VARIABLE: case cmProperty::CACHED_VARIABLE: // not handled by GetProperty break; diff --git a/Source/cmGetPropertyCommand.h b/Source/cmGetPropertyCommand.h index 8f2d368..f7155e1 100644 --- a/Source/cmGetPropertyCommand.h +++ b/Source/cmGetPropertyCommand.h @@ -58,11 +58,17 @@ public: { return " get_property(VAR scope_value property)\n" + " get_property(VAR scope_value property \n" + " BRIEF_DOCS)\n" + " get_property(VAR scope_value property \n" + " FULL_DOCS)\n" "Get a property from cmake. The scope_value is either GLOBAL, " "DIRECTORY dir_name, TARGET tgt_name, SOURCE_FILE src_name, " - "or TEST test_name. The resulting value is " + "TEST test_name or VARIABLE var_name. The resulting value is " "stored in the variable VAR. If the property is not found, " - "CMake will report an error."; + "CMake will report an error. The second and third signatures " + "return the documentation for a property or variable instead of " + "its value."; } cmTypeMacro(cmGetPropertyCommand, cmCommand); diff --git a/Source/cmPropertyDefinition.h b/Source/cmPropertyDefinition.h index a299cb3..b2b42de 100644 --- a/Source/cmPropertyDefinition.h +++ b/Source/cmPropertyDefinition.h @@ -46,6 +46,12 @@ public: cmProperty::ScopeType GetScope() const { return this->Scope; }; + // get the docs + const std::string &GetShortDescription() const { + return this->ShortDescription; }; + const std::string &GetFullDescription() const { + return this->FullDescription; }; + protected: std::string Name; std::string ShortDescription; diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 01fcae6..7dade6f 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -3093,6 +3093,17 @@ void cmake::DefineProperty(const char *name, cmProperty::ScopeType scope, chained); } +cmPropertyDefinition *cmake +::GetPropertyDefinition(const char *name, + cmProperty::ScopeType scope) +{ + if (this->IsPropertyDefined(name,scope)) + { + return &(this->PropertyDefinitions[scope][name]); + } + return 0; +} + bool cmake::IsPropertyDefined(const char *name, cmProperty::ScopeType scope) { return this->PropertyDefinitions[scope].IsPropertyDefined(name); diff --git a/Source/cmake.h b/Source/cmake.h index c0a29b6..bbf2c31 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -312,6 +312,10 @@ class cmake bool chain = false, const char *variableGroup = 0); + // get property definition + cmPropertyDefinition *GetPropertyDefinition + (const char *name, cmProperty::ScopeType scope); + // Is a property defined? bool IsPropertyDefined(const char *name, cmProperty::ScopeType scope); bool IsPropertyChained(const char *name, cmProperty::ScopeType scope); |