1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00

Utilities/Sphinx: Allow explicit target for genex

Split the genex directive into its own class, allowing a slight
simplification of CMakeObject. Add ability to specify an explicit target
name for the same.

Use this to provide a target for the `$<TARGET_PROPERTY:prop>` generator
expression which is otherwise missing one (due to overlap with
`$<TARGET_PROPERTY:tgt,prop>`).  With this one can write:

    :genex:`$<TARGET_PROPERTY:prop> <TARGET_PROPERTY:prop>`

to link the second variant.

Fixes: #24573
This commit is contained in:
Matthew Woehlke
2023-03-13 15:44:12 -04:00
committed by Brad King
parent bd4616f624
commit 2e37a20f02
3 changed files with 34 additions and 5 deletions

View File

@@ -241,6 +241,10 @@ Document a "genex" object:
The directive requires a single argument, the generator expression name.
The optional ``:target:`` option allows a custom target name to be specified.
Because this will affect the ability to reference the "genex" object using the
``:genex:`` role, this option should be used very sparingly.
``signature`` directive
^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -1418,6 +1418,7 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
expression is being evaluated.
.. genex:: $<TARGET_PROPERTY:prop>
:target: TARGET_PROPERTY:prop
Value of the property ``prop`` on the target for which the expression
is being evaluated. Note that for generator expressions in

View File

@@ -286,19 +286,20 @@ class CMakeTransform(Transform):
domain.note_object(objtype, targetname, targetid, targetid)
class CMakeObject(ObjectDescription):
def __init__(self, *args, **kwargs):
self.targetname = None
super().__init__(*args, **kwargs)
def handle_signature(self, sig, signode):
# called from sphinx.directives.ObjectDescription.run()
signode += addnodes.desc_name(sig, sig)
if self.objtype == 'genex':
m = CMakeXRefRole._re_genex.match(sig)
if m:
sig = m.group(1)
return sig
def add_target_and_index(self, name, sig, signode):
if self.objtype == 'command':
targetname = name.lower()
elif self.targetname:
targetname = self.targetname
else:
targetname = name
targetid = '%s:%s' % (self.objtype, targetname)
@@ -316,6 +317,29 @@ class CMakeObject(ObjectDescription):
if make_index_entry:
self.indexnode['entries'].append(make_index_entry(name, targetid))
class CMakeGenexObject(CMakeObject):
option_spec = {
'target': directives.unchanged,
}
def handle_signature(self, sig, signode):
name = super().handle_signature(sig, signode)
m = CMakeXRefRole._re_genex.match(sig)
if m:
name = m.group(1)
return name
def run(self):
target = self.options.get('target')
if target is not None:
self.targetname = target
return super().run()
class CMakeSignatureObject(CMakeObject):
object_type = 'signature'
@@ -507,7 +531,7 @@ class CMakeDomain(Domain):
directives = {
'command': CMakeObject,
'envvar': CMakeObject,
'genex': CMakeObject,
'genex': CMakeGenexObject,
'signature': CMakeSignatureObject,
'variable': CMakeObject,
# Other `object_types` cannot be created except by the `CMakeTransform`