564 lines
19 KiB
ReStructuredText
564 lines
19 KiB
ReStructuredText
.. include:: ../disclaimer-ita.rst
|
|
|
|
.. note:: Per leggere la documentazione originale in inglese:
|
|
:ref:`Documentation/doc-guide/index.rst <doc_guide>`
|
|
|
|
.. title:: Commenti in kernel-doc
|
|
|
|
.. _it_kernel_doc:
|
|
|
|
=================================
|
|
Scrivere i commenti in kernel-doc
|
|
=================================
|
|
|
|
Nei file sorgenti del kernel Linux potrete trovare commenti di documentazione
|
|
strutturanti secondo il formato kernel-doc. Essi possono descrivere funzioni,
|
|
tipi di dati, e l'architettura del codice.
|
|
|
|
.. note:: Il formato kernel-doc può sembrare simile a gtk-doc o Doxygen ma
|
|
in realtà è molto differente per ragioni storiche. I sorgenti del kernel
|
|
contengono decine di migliaia di commenti kernel-doc. Siete pregati
|
|
d'attenervi allo stile qui descritto.
|
|
|
|
La struttura kernel-doc è estratta a partire dai commenti; da questi viene
|
|
generato il `dominio Sphinx per il C`_ con un'adeguata descrizione per le
|
|
funzioni ed i tipi di dato con i loro relativi collegamenti. Le descrizioni
|
|
vengono filtrare per cercare i riferimenti ed i marcatori.
|
|
|
|
Vedere di seguito per maggiori dettagli.
|
|
|
|
.. _`dominio Sphinx per il C`: http://www.sphinx-doc.org/en/stable/domains.html
|
|
|
|
Tutte le funzioni esportate verso i moduli esterni utilizzando
|
|
``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` dovrebbero avere un commento
|
|
kernel-doc. Quando l'intenzione è di utilizzarle nei moduli, anche le funzioni
|
|
e le strutture dati nei file d'intestazione dovrebbero avere dei commenti
|
|
kernel-doc.
|
|
|
|
È considerata una buona pratica quella di fornire una documentazione formattata
|
|
secondo kernel-doc per le funzioni che sono visibili da altri file del kernel
|
|
(ovvero, che non siano dichiarate utilizzando ``static``). Raccomandiamo,
|
|
inoltre, di fornire una documentazione kernel-doc anche per procedure private
|
|
(ovvero, dichiarate "static") al fine di fornire una struttura più coerente
|
|
dei sorgenti. Quest'ultima raccomandazione ha una priorità più bassa ed è a
|
|
discrezione dal manutentore (MAINTAINER) del file sorgente.
|
|
|
|
|
|
|
|
Sicuramente la documentazione formattata con kernel-doc è necessaria per
|
|
le funzioni che sono esportate verso i moduli esterni utilizzando
|
|
``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL``.
|
|
|
|
Cerchiamo anche di fornire una documentazione formattata secondo kernel-doc
|
|
per le funzioni che sono visibili da altri file del kernel (ovvero, che non
|
|
siano dichiarate utilizzando "static")
|
|
|
|
Raccomandiamo, inoltre, di fornire una documentazione formattata con kernel-doc
|
|
anche per procedure private (ovvero, dichiarate "static") al fine di fornire
|
|
una struttura più coerente dei sorgenti. Questa raccomandazione ha una priorità
|
|
più bassa ed è a discrezione dal manutentore (MAINTAINER) del file sorgente.
|
|
|
|
Le strutture dati visibili nei file di intestazione dovrebbero essere anch'esse
|
|
documentate utilizzando commenti formattati con kernel-doc.
|
|
|
|
Come formattare i commenti kernel-doc
|
|
-------------------------------------
|
|
|
|
I commenti kernel-doc iniziano con il marcatore ``/**``. Il programma
|
|
``kernel-doc`` estrarrà i commenti marchiati in questo modo. Il resto
|
|
del commento è formattato come un normale commento multilinea, ovvero
|
|
con un asterisco all'inizio d'ogni riga e che si conclude con ``*/``
|
|
su una riga separata.
|
|
|
|
I commenti kernel-doc di funzioni e tipi dovrebbero essere posizionati
|
|
appena sopra la funzione od il tipo che descrivono. Questo allo scopo di
|
|
aumentare la probabilità che chi cambia il codice si ricordi di aggiornare
|
|
anche la documentazione. I commenti kernel-doc di tipo più generale possono
|
|
essere posizionati ovunque nel file.
|
|
|
|
Al fine di verificare che i commenti siano formattati correttamente, potete
|
|
eseguire il programma ``kernel-doc`` con un livello di verbosità alto e senza
|
|
che questo produca alcuna documentazione. Per esempio::
|
|
|
|
scripts/kernel-doc -v -none drivers/foo/bar.c
|
|
|
|
Il formato della documentazione è verificato della procedura di generazione
|
|
del kernel quando viene richiesto di effettuare dei controlli extra con GCC::
|
|
|
|
make W=n
|
|
|
|
Documentare le funzioni
|
|
------------------------
|
|
|
|
Generalmente il formato di un commento kernel-doc per funzioni e
|
|
macro simil-funzioni è il seguente::
|
|
|
|
/**
|
|
* function_name() - Brief description of function.
|
|
* @arg1: Describe the first argument.
|
|
* @arg2: Describe the second argument.
|
|
* One can provide multiple line descriptions
|
|
* for arguments.
|
|
*
|
|
* A longer description, with more discussion of the function function_name()
|
|
* that might be useful to those using or modifying it. Begins with an
|
|
* empty comment line, and may include additional embedded empty
|
|
* comment lines.
|
|
*
|
|
* The longer description may have multiple paragraphs.
|
|
*
|
|
* Context: Describes whether the function can sleep, what locks it takes,
|
|
* releases, or expects to be held. It can extend over multiple
|
|
* lines.
|
|
* Return: Describe the return value of function_name.
|
|
*
|
|
* The return value description can also have multiple paragraphs, and should
|
|
* be placed at the end of the comment block.
|
|
*/
|
|
|
|
La descrizione introduttiva (*brief description*) che segue il nome della
|
|
funzione può continuare su righe successive e termina con la descrizione di
|
|
un argomento, una linea di commento vuota, oppure la fine del commento.
|
|
|
|
Parametri delle funzioni
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Ogni argomento di una funzione dovrebbe essere descritto in ordine, subito
|
|
dopo la descrizione introduttiva. Non lasciare righe vuote né fra la
|
|
descrizione introduttiva e quella degli argomenti, né fra gli argomenti.
|
|
|
|
Ogni ``@argument:`` può estendersi su più righe.
|
|
|
|
.. note::
|
|
|
|
Se la descrizione di ``@argument:`` si estende su più righe,
|
|
la continuazione dovrebbe iniziare alla stessa colonna della riga
|
|
precedente::
|
|
|
|
* @argument: some long description
|
|
* that continues on next lines
|
|
|
|
or::
|
|
|
|
* @argument:
|
|
* some long description
|
|
* that continues on next lines
|
|
|
|
Se una funzione ha un numero variabile di argomento, la sua descrizione
|
|
dovrebbe essere scritta con la notazione kernel-doc::
|
|
|
|
* @...: description
|
|
|
|
Contesto delle funzioni
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Il contesto in cui le funzioni vengono chiamate viene descritto in una
|
|
sezione chiamata ``Context``. Questo dovrebbe informare sulla possibilità
|
|
che una funzione dorma (*sleep*) o che possa essere chiamata in un contesto
|
|
d'interruzione, così come i *lock* che prende, rilascia e che si aspetta che
|
|
vengano presi dal chiamante.
|
|
|
|
Esempi::
|
|
|
|
* Context: Any context.
|
|
* Context: Any context. Takes and releases the RCU lock.
|
|
* Context: Any context. Expects <lock> to be held by caller.
|
|
* Context: Process context. May sleep if @gfp flags permit.
|
|
* Context: Process context. Takes and releases <mutex>.
|
|
* Context: Softirq or process context. Takes and releases <lock>, BH-safe.
|
|
* Context: Interrupt context.
|
|
|
|
Valore di ritorno
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
Il valore di ritorno, se c'è, viene descritto in una sezione dedicata di nome
|
|
``Return``.
|
|
|
|
.. note::
|
|
|
|
#) La descrizione multiriga non riconosce il termine d'una riga, per cui
|
|
se provate a formattare bene il vostro testo come nel seguente esempio::
|
|
|
|
* Return:
|
|
* 0 - OK
|
|
* -EINVAL - invalid argument
|
|
* -ENOMEM - out of memory
|
|
|
|
le righe verranno unite e il risultato sarà::
|
|
|
|
Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory
|
|
|
|
Quindi, se volete che le righe vengano effettivamente generate, dovete
|
|
utilizzare una lista ReST, ad esempio::
|
|
|
|
* Return:
|
|
* * 0 - OK to runtime suspend the device
|
|
* * -EBUSY - Device should not be runtime suspended
|
|
|
|
#) Se il vostro testo ha delle righe che iniziano con una frase seguita dai
|
|
due punti, allora ognuna di queste frasi verrà considerata come il nome
|
|
di una nuova sezione, e probabilmente non produrrà gli effetti desiderati.
|
|
|
|
Documentare strutture, unioni ed enumerazioni
|
|
---------------------------------------------
|
|
|
|
Generalmente il formato di un commento kernel-doc per struct, union ed enum è::
|
|
|
|
/**
|
|
* struct struct_name - Brief description.
|
|
* @member1: Description of member1.
|
|
* @member2: Description of member2.
|
|
* One can provide multiple line descriptions
|
|
* for members.
|
|
*
|
|
* Description of the structure.
|
|
*/
|
|
|
|
Nell'esempio qui sopra, potete sostituire ``struct`` con ``union`` o ``enum``
|
|
per descrivere unioni ed enumerati. ``member`` viene usato per indicare i
|
|
membri di strutture ed unioni, ma anche i valori di un tipo enumerato.
|
|
|
|
La descrizione introduttiva (*brief description*) che segue il nome della
|
|
funzione può continuare su righe successive e termina con la descrizione di
|
|
un argomento, una linea di commento vuota, oppure la fine del commento.
|
|
|
|
Membri
|
|
~~~~~~
|
|
|
|
I membri di strutture, unioni ed enumerati devo essere documentati come i
|
|
parametri delle funzioni; seguono la descrizione introduttiva e possono
|
|
estendersi su più righe.
|
|
|
|
All'interno d'una struttura o d'un unione, potete utilizzare le etichette
|
|
``private:`` e ``public:``. I campi che sono nell'area ``private:`` non
|
|
verranno inclusi nella documentazione finale.
|
|
|
|
Le etichette ``private:`` e ``public:`` devono essere messe subito dopo
|
|
il marcatore di un commento ``/*``. Opzionalmente, possono includere commenti
|
|
fra ``:`` e il marcatore di fine commento ``*/``.
|
|
|
|
Esempio::
|
|
|
|
/**
|
|
* struct my_struct - short description
|
|
* @a: first member
|
|
* @b: second member
|
|
* @d: fourth member
|
|
*
|
|
* Longer description
|
|
*/
|
|
struct my_struct {
|
|
int a;
|
|
int b;
|
|
/* private: internal use only */
|
|
int c;
|
|
/* public: the next one is public */
|
|
int d;
|
|
};
|
|
|
|
Strutture ed unioni annidate
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
È possibile documentare strutture ed unioni annidate, ad esempio::
|
|
|
|
/**
|
|
* struct nested_foobar - a struct with nested unions and structs
|
|
* @memb1: first member of anonymous union/anonymous struct
|
|
* @memb2: second member of anonymous union/anonymous struct
|
|
* @memb3: third member of anonymous union/anonymous struct
|
|
* @memb4: fourth member of anonymous union/anonymous struct
|
|
* @bar: non-anonymous union
|
|
* @bar.st1: struct st1 inside @bar
|
|
* @bar.st2: struct st2 inside @bar
|
|
* @bar.st1.memb1: first member of struct st1 on union bar
|
|
* @bar.st1.memb2: second member of struct st1 on union bar
|
|
* @bar.st2.memb1: first member of struct st2 on union bar
|
|
* @bar.st2.memb2: second member of struct st2 on union bar
|
|
*/
|
|
struct nested_foobar {
|
|
/* Anonymous union/struct*/
|
|
union {
|
|
struct {
|
|
int memb1;
|
|
int memb2;
|
|
}
|
|
struct {
|
|
void *memb3;
|
|
int memb4;
|
|
}
|
|
}
|
|
union {
|
|
struct {
|
|
int memb1;
|
|
int memb2;
|
|
} st1;
|
|
struct {
|
|
void *memb1;
|
|
int memb2;
|
|
} st2;
|
|
} bar;
|
|
};
|
|
|
|
.. note::
|
|
|
|
#) Quando documentate una struttura od unione annidata, ad esempio
|
|
di nome ``foo``, il suo campo ``bar`` dev'essere documentato
|
|
usando ``@foo.bar:``
|
|
#) Quando la struttura od unione annidata è anonima, il suo campo
|
|
``bar`` dev'essere documentato usando ``@bar:``
|
|
|
|
Commenti in linea per la documentazione dei membri
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
I membri d'una struttura possono essere documentati in linea all'interno
|
|
della definizione stessa. Ci sono due stili: una singola riga di commento
|
|
che inizia con ``/**`` e finisce con ``*/``; commenti multi riga come
|
|
qualsiasi altro commento kernel-doc::
|
|
|
|
/**
|
|
* struct foo - Brief description.
|
|
* @foo: The Foo member.
|
|
*/
|
|
struct foo {
|
|
int foo;
|
|
/**
|
|
* @bar: The Bar member.
|
|
*/
|
|
int bar;
|
|
/**
|
|
* @baz: The Baz member.
|
|
*
|
|
* Here, the member description may contain several paragraphs.
|
|
*/
|
|
int baz;
|
|
union {
|
|
/** @foobar: Single line description. */
|
|
int foobar;
|
|
};
|
|
/** @bar2: Description for struct @bar2 inside @foo */
|
|
struct {
|
|
/**
|
|
* @bar2.barbar: Description for @barbar inside @foo.bar2
|
|
*/
|
|
int barbar;
|
|
} bar2;
|
|
};
|
|
|
|
|
|
Documentazione dei tipi di dato
|
|
-------------------------------
|
|
Generalmente il formato di un commento kernel-doc per typedef è
|
|
il seguente::
|
|
|
|
/**
|
|
* typedef type_name - Brief description.
|
|
*
|
|
* Description of the type.
|
|
*/
|
|
|
|
Anche i tipi di dato per prototipi di funzione possono essere documentati::
|
|
|
|
/**
|
|
* typedef type_name - Brief description.
|
|
* @arg1: description of arg1
|
|
* @arg2: description of arg2
|
|
*
|
|
* Description of the type.
|
|
*
|
|
* Context: Locking context.
|
|
* Return: Meaning of the return value.
|
|
*/
|
|
typedef void (*type_name)(struct v4l2_ctrl *arg1, void *arg2);
|
|
|
|
Marcatori e riferimenti
|
|
-----------------------
|
|
|
|
All'interno dei commenti di tipo kernel-doc vengono riconosciuti i seguenti
|
|
*pattern* che vengono convertiti in marcatori reStructuredText ed in riferimenti
|
|
del `dominio Sphinx per il C`_.
|
|
|
|
.. attention:: Questi sono riconosciuti **solo** all'interno di commenti
|
|
kernel-doc, e **non** all'interno di documenti reStructuredText.
|
|
|
|
``funcname()``
|
|
Riferimento ad una funzione.
|
|
|
|
``@parameter``
|
|
Nome di un parametro di una funzione (nessun riferimento, solo formattazione).
|
|
|
|
``%CONST``
|
|
Il nome di una costante (nessun riferimento, solo formattazione)
|
|
|
|
````literal````
|
|
Un blocco di testo che deve essere riportato così com'è. La rappresentazione
|
|
finale utilizzerà caratteri a ``spaziatura fissa``.
|
|
|
|
Questo è utile se dovete utilizzare caratteri speciali che altrimenti
|
|
potrebbero assumere un significato diverso in kernel-doc o in reStructuredText
|
|
|
|
Questo è particolarmente utile se dovete scrivere qualcosa come ``%ph``
|
|
all'interno della descrizione di una funzione.
|
|
|
|
``$ENVVAR``
|
|
Il nome di una variabile d'ambiente (nessun riferimento, solo formattazione).
|
|
|
|
``&struct name``
|
|
Riferimento ad una struttura.
|
|
|
|
``&enum name``
|
|
Riferimento ad un'enumerazione.
|
|
|
|
``&typedef name``
|
|
Riferimento ad un tipo di dato.
|
|
|
|
``&struct_name->member`` or ``&struct_name.member``
|
|
Riferimento ad un membro di una struttura o di un'unione. Il riferimento sarà
|
|
la struttura o l'unione, non il memembro.
|
|
|
|
``&name``
|
|
Un generico riferimento ad un tipo. Usate, preferibilmente, il riferimento
|
|
completo come descritto sopra. Questo è dedicato ai commenti obsoleti.
|
|
|
|
Riferimenti usando reStructuredText
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Nei documenti reStructuredText non serve alcuna sintassi speciale per
|
|
fare riferimento a funzioni e tipi definiti nei commenti
|
|
kernel-doc. Sarà sufficiente terminare i nomi di funzione con ``()``,
|
|
e scrivere ``struct``, ``union``, ``enum``, o ``typedef`` prima di un
|
|
tipo. Per esempio::
|
|
|
|
See foo()
|
|
See struct foo.
|
|
See union bar.
|
|
See enum baz.
|
|
See typedef meh.
|
|
|
|
Tuttavia, la personalizzazione dei collegamenti è possibile solo con
|
|
la seguente sintassi::
|
|
|
|
See :c:func:`my custom link text for function foo <foo>`.
|
|
See :c:type:`my custom link text for struct bar <bar>`.
|
|
|
|
|
|
Commenti per una documentazione generale
|
|
----------------------------------------
|
|
|
|
Al fine d'avere il codice ed i commenti nello stesso file, potete includere
|
|
dei blocchi di documentazione kernel-doc con un formato libero invece
|
|
che nel formato specifico per funzioni, strutture, unioni, enumerati o tipi
|
|
di dato. Per esempio, questo tipo di commento potrebbe essere usato per la
|
|
spiegazione delle operazioni di un driver o di una libreria
|
|
|
|
Questo s'ottiene utilizzando la parola chiave ``DOC:`` a cui viene associato
|
|
un titolo.
|
|
|
|
Generalmente il formato di un commento generico o di visione d'insieme è
|
|
il seguente::
|
|
|
|
/**
|
|
* DOC: Theory of Operation
|
|
*
|
|
* The whizbang foobar is a dilly of a gizmo. It can do whatever you
|
|
* want it to do, at any time. It reads your mind. Here's how it works.
|
|
*
|
|
* foo bar splat
|
|
*
|
|
* The only drawback to this gizmo is that is can sometimes damage
|
|
* hardware, software, or its subject(s).
|
|
*/
|
|
|
|
Il titolo che segue ``DOC:`` funziona da intestazione all'interno del file
|
|
sorgente, ma anche come identificatore per l'estrazione di questi commenti di
|
|
documentazione. Quindi, il titolo dev'essere unico all'interno del file.
|
|
|
|
=======================================
|
|
Includere i commenti di tipo kernel-doc
|
|
=======================================
|
|
|
|
I commenti di documentazione possono essere inclusi in un qualsiasi documento
|
|
di tipo reStructuredText mediante l'apposita direttiva nell'estensione
|
|
kernel-doc per Sphinx.
|
|
|
|
Le direttive kernel-doc sono nel formato::
|
|
|
|
.. kernel-doc:: source
|
|
:option:
|
|
|
|
Il campo *source* è il percorso ad un file sorgente, relativo alla cartella
|
|
principale dei sorgenti del kernel. La direttiva supporta le seguenti opzioni:
|
|
|
|
export: *[source-pattern ...]*
|
|
Include la documentazione per tutte le funzioni presenti nel file sorgente
|
|
(*source*) che sono state esportate utilizzando ``EXPORT_SYMBOL`` o
|
|
``EXPORT_SYMBOL_GPL`` in *source* o in qualsiasi altro *source-pattern*
|
|
specificato.
|
|
|
|
Il campo *source-patter* è utile quando i commenti kernel-doc sono stati
|
|
scritti nei file d'intestazione, mentre ``EXPORT_SYMBOL`` e
|
|
``EXPORT_SYMBOL_GPL`` si trovano vicino alla definizione delle funzioni.
|
|
|
|
Esempi::
|
|
|
|
.. kernel-doc:: lib/bitmap.c
|
|
:export:
|
|
|
|
.. kernel-doc:: include/net/mac80211.h
|
|
:export: net/mac80211/*.c
|
|
|
|
internal: *[source-pattern ...]*
|
|
Include la documentazione per tutte le funzioni ed i tipi presenti nel file
|
|
sorgente (*source*) che **non** sono stati esportati utilizzando
|
|
``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` né in *source* né in qualsiasi
|
|
altro *source-pattern* specificato.
|
|
|
|
Esempio::
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
|
|
:internal:
|
|
|
|
identifiers: *[ function/type ...]*
|
|
Include la documentazione per ogni *function* e *type* in *source*.
|
|
Se non vengono esplicitamente specificate le funzioni da includere, allora
|
|
verranno incluse tutte quelle disponibili in *source*.
|
|
|
|
Esempi::
|
|
|
|
.. kernel-doc:: lib/bitmap.c
|
|
:identifiers: bitmap_parselist bitmap_parselist_user
|
|
|
|
.. kernel-doc:: lib/idr.c
|
|
:identifiers:
|
|
|
|
functions: *[ function ...]*
|
|
Questo è uno pseudonimo, deprecato, per la direttiva 'identifiers'.
|
|
|
|
doc: *title*
|
|
Include la documentazione del paragrafo ``DOC:`` identificato dal titolo
|
|
(*title*) all'interno del file sorgente (*source*). Gli spazi in *title* sono
|
|
permessi; non virgolettate *title*. Il campo *title* è utilizzato per
|
|
identificare un paragrafo e per questo non viene incluso nella documentazione
|
|
finale. Verificate d'avere l'intestazione appropriata nei documenti
|
|
reStructuredText.
|
|
|
|
Esempio::
|
|
|
|
.. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
|
|
:doc: High Definition Audio over HDMI and Display Port
|
|
|
|
Senza alcuna opzione, la direttiva kernel-doc include tutti i commenti di
|
|
documentazione presenti nel file sorgente (*source*).
|
|
|
|
L'estensione kernel-doc fa parte dei sorgenti del kernel, la si può trovare
|
|
in ``Documentation/sphinx/kerneldoc.py``. Internamente, viene utilizzato
|
|
lo script ``scripts/kernel-doc`` per estrarre i commenti di documentazione
|
|
dai file sorgenti.
|
|
|
|
Come utilizzare kernel-doc per generare pagine man
|
|
--------------------------------------------------
|
|
|
|
Se volete utilizzare kernel-doc solo per generare delle pagine man, potete
|
|
farlo direttamente dai sorgenti del kernel::
|
|
|
|
$ scripts/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^tools) | scripts/split-man.pl /tmp/man
|