Back to home page

OSCL-LXR

 
 

    


0001 .. include:: ../disclaimer-ita.rst
0002 
0003 .. note:: Per leggere la documentazione originale in inglese:
0004           :ref:`Documentation/doc-guide/index.rst <doc_guide>`
0005 
0006 .. _it_kernel_doc:
0007 
0008 =================================
0009 Scrivere i commenti in kernel-doc
0010 =================================
0011 
0012 Nei file sorgenti del kernel Linux potrete trovare commenti di documentazione
0013 strutturanti secondo il formato kernel-doc. Essi possono descrivere funzioni,
0014 tipi di dati, e l'architettura del codice.
0015 
0016 .. note:: Il formato kernel-doc può sembrare simile a gtk-doc o Doxygen ma
0017    in realtà è molto differente per ragioni storiche. I sorgenti del kernel
0018    contengono decine di migliaia di commenti kernel-doc. Siete pregati
0019    d'attenervi allo stile qui descritto.
0020 
0021 La struttura kernel-doc è estratta a partire dai commenti; da questi viene
0022 generato il `dominio Sphinx per il C`_ con un'adeguata descrizione per le
0023 funzioni ed i tipi di dato con i loro relativi collegamenti. Le descrizioni
0024 vengono filtrare per cercare i riferimenti ed i marcatori.
0025 
0026 Vedere di seguito per maggiori dettagli.
0027 
0028 .. _`dominio Sphinx per il C`: http://www.sphinx-doc.org/en/stable/domains.html
0029 
0030 Tutte le funzioni esportate verso i moduli esterni utilizzando
0031 ``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` dovrebbero avere un commento
0032 kernel-doc. Quando l'intenzione è di utilizzarle nei moduli, anche le funzioni
0033 e le strutture dati nei file d'intestazione dovrebbero avere dei commenti
0034 kernel-doc.
0035 
0036 È considerata una buona pratica quella di fornire una documentazione formattata
0037 secondo kernel-doc per le funzioni che sono visibili da altri file del kernel
0038 (ovvero, che non siano dichiarate utilizzando ``static``). Raccomandiamo,
0039 inoltre, di fornire una documentazione kernel-doc anche per procedure private
0040 (ovvero, dichiarate "static") al fine di fornire una struttura più coerente
0041 dei sorgenti. Quest'ultima raccomandazione ha una priorità più bassa ed è a
0042 discrezione dal manutentore (MAINTAINER) del file sorgente.
0043 
0044 
0045 
0046 Sicuramente la documentazione formattata con kernel-doc è necessaria per
0047 le funzioni che sono esportate verso i moduli esterni utilizzando
0048 ``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL``.
0049 
0050 Cerchiamo anche di fornire una documentazione formattata secondo kernel-doc
0051 per le funzioni che sono visibili da altri file del kernel (ovvero, che non
0052 siano dichiarate utilizzando "static")
0053 
0054 Raccomandiamo, inoltre, di fornire una documentazione formattata con kernel-doc
0055 anche per procedure private (ovvero, dichiarate "static") al fine di fornire
0056 una struttura più coerente dei sorgenti. Questa raccomandazione ha una priorità
0057 più bassa ed è a discrezione dal manutentore (MAINTAINER) del file sorgente.
0058 
0059 Le strutture dati visibili nei file di intestazione dovrebbero essere anch'esse
0060 documentate utilizzando commenti formattati con kernel-doc.
0061 
0062 Come formattare i commenti kernel-doc
0063 -------------------------------------
0064 
0065 I commenti kernel-doc iniziano con il marcatore ``/**``. Il programma
0066 ``kernel-doc`` estrarrà i commenti marchiati in questo modo. Il resto
0067 del commento è formattato come un normale commento multilinea, ovvero
0068 con un asterisco all'inizio d'ogni riga e che si conclude con ``*/``
0069 su una riga separata.
0070 
0071 I commenti kernel-doc di funzioni e tipi dovrebbero essere posizionati
0072 appena sopra la funzione od il tipo che descrivono. Questo allo scopo di
0073 aumentare la probabilità che chi cambia il codice si ricordi di aggiornare
0074 anche la documentazione. I commenti kernel-doc di tipo più generale possono
0075 essere posizionati ovunque nel file.
0076 
0077 Al fine di verificare che i commenti siano formattati correttamente, potete
0078 eseguire il programma ``kernel-doc`` con un livello di verbosità alto e senza
0079 che questo produca alcuna documentazione. Per esempio::
0080 
0081         scripts/kernel-doc -v -none drivers/foo/bar.c
0082 
0083 Il formato della documentazione è verificato della procedura di generazione
0084 del kernel quando viene richiesto di effettuare dei controlli extra con GCC::
0085 
0086         make W=n
0087 
0088 Documentare le funzioni
0089 ------------------------
0090 
0091 Generalmente il formato di un commento kernel-doc per funzioni e
0092 macro simil-funzioni è il seguente::
0093 
0094   /**
0095    * function_name() - Brief description of function.
0096    * @arg1: Describe the first argument.
0097    * @arg2: Describe the second argument.
0098    *        One can provide multiple line descriptions
0099    *        for arguments.
0100    *
0101    * A longer description, with more discussion of the function function_name()
0102    * that might be useful to those using or modifying it. Begins with an
0103    * empty comment line, and may include additional embedded empty
0104    * comment lines.
0105    *
0106    * The longer description may have multiple paragraphs.
0107    *
0108    * Context: Describes whether the function can sleep, what locks it takes,
0109    *          releases, or expects to be held. It can extend over multiple
0110    *          lines.
0111    * Return: Describe the return value of function_name.
0112    *
0113    * The return value description can also have multiple paragraphs, and should
0114    * be placed at the end of the comment block.
0115    */
0116 
0117 La descrizione introduttiva (*brief description*) che segue il nome della
0118 funzione può continuare su righe successive e termina con la descrizione di
0119 un argomento, una linea di commento vuota, oppure la fine del commento.
0120 
0121 Parametri delle funzioni
0122 ~~~~~~~~~~~~~~~~~~~~~~~~
0123 
0124 Ogni argomento di una funzione dovrebbe essere descritto in ordine, subito
0125 dopo la descrizione introduttiva.  Non lasciare righe vuote né fra la
0126 descrizione introduttiva e quella degli argomenti, né fra gli argomenti.
0127 
0128 Ogni ``@argument:`` può estendersi su più righe.
0129 
0130 .. note::
0131 
0132    Se la descrizione di ``@argument:`` si estende su più righe,
0133    la continuazione dovrebbe iniziare alla stessa colonna della riga
0134    precedente::
0135 
0136       * @argument: some long description
0137       *            that continues on next lines
0138 
0139    or::
0140 
0141       * @argument:
0142       *         some long description
0143       *         that continues on next lines
0144 
0145 Se una funzione ha un numero variabile di argomento, la sua descrizione
0146 dovrebbe essere scritta con la notazione kernel-doc::
0147 
0148       * @...: description
0149 
0150 Contesto delle funzioni
0151 ~~~~~~~~~~~~~~~~~~~~~~~
0152 
0153 Il contesto in cui le funzioni vengono chiamate viene descritto in una
0154 sezione chiamata ``Context``. Questo dovrebbe informare sulla possibilità
0155 che una funzione dorma (*sleep*) o che possa essere chiamata in un contesto
0156 d'interruzione, così come i *lock* che prende, rilascia e che si aspetta che
0157 vengano presi dal chiamante.
0158 
0159 Esempi::
0160 
0161   * Context: Any context.
0162   * Context: Any context. Takes and releases the RCU lock.
0163   * Context: Any context. Expects <lock> to be held by caller.
0164   * Context: Process context. May sleep if @gfp flags permit.
0165   * Context: Process context. Takes and releases <mutex>.
0166   * Context: Softirq or process context. Takes and releases <lock>, BH-safe.
0167   * Context: Interrupt context.
0168 
0169 Valore di ritorno
0170 ~~~~~~~~~~~~~~~~~
0171 
0172 Il valore di ritorno, se c'è, viene descritto in una sezione dedicata di nome
0173 ``Return``.
0174 
0175 .. note::
0176 
0177   #) La descrizione multiriga non riconosce il termine d'una riga, per cui
0178      se provate a formattare bene il vostro testo come nel seguente esempio::
0179 
0180         * Return:
0181         * 0 - OK
0182         * -EINVAL - invalid argument
0183         * -ENOMEM - out of memory
0184 
0185      le righe verranno unite e il risultato sarà::
0186 
0187         Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory
0188 
0189      Quindi, se volete che le righe vengano effettivamente generate, dovete
0190      utilizzare una lista ReST, ad esempio::
0191 
0192       * Return:
0193       * * 0             - OK to runtime suspend the device
0194       * * -EBUSY        - Device should not be runtime suspended
0195 
0196   #) Se il vostro testo ha delle righe che iniziano con una frase seguita dai
0197      due punti, allora ognuna di queste frasi verrà considerata come il nome
0198      di una nuova sezione, e probabilmente non produrrà gli effetti desiderati.
0199 
0200 Documentare strutture, unioni ed enumerazioni
0201 ---------------------------------------------
0202 
0203 Generalmente il formato di un commento kernel-doc per struct, union ed enum è::
0204 
0205   /**
0206    * struct struct_name - Brief description.
0207    * @member1: Description of member1.
0208    * @member2: Description of member2.
0209    *           One can provide multiple line descriptions
0210    *           for members.
0211    *
0212    * Description of the structure.
0213    */
0214 
0215 Nell'esempio qui sopra, potete sostituire ``struct`` con ``union`` o ``enum``
0216 per descrivere unioni ed enumerati. ``member`` viene usato per indicare i
0217 membri di strutture ed unioni, ma anche i valori di un tipo enumerato.
0218 
0219 La descrizione introduttiva (*brief description*) che segue il nome della
0220 funzione può continuare su righe successive e termina con la descrizione di
0221 un argomento, una linea di commento vuota, oppure la fine del commento.
0222 
0223 Membri
0224 ~~~~~~
0225 
0226 I membri di strutture, unioni ed enumerati devo essere documentati come i
0227 parametri delle funzioni; seguono la descrizione introduttiva e possono
0228 estendersi su più righe.
0229 
0230 All'interno d'una struttura o d'un unione, potete utilizzare le etichette
0231 ``private:`` e ``public:``. I campi che sono nell'area ``private:`` non
0232 verranno inclusi nella documentazione finale.
0233 
0234 Le etichette ``private:`` e ``public:`` devono essere messe subito dopo
0235 il marcatore di un commento ``/*``. Opzionalmente, possono includere commenti
0236 fra ``:`` e il marcatore di fine commento ``*/``.
0237 
0238 Esempio::
0239 
0240   /**
0241    * struct my_struct - short description
0242    * @a: first member
0243    * @b: second member
0244    * @d: fourth member
0245    *
0246    * Longer description
0247    */
0248   struct my_struct {
0249       int a;
0250       int b;
0251   /* private: internal use only */
0252       int c;
0253   /* public: the next one is public */
0254       int d;
0255   };
0256 
0257 Strutture ed unioni annidate
0258 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0259 
0260 È possibile documentare strutture ed unioni annidate, ad esempio::
0261 
0262       /**
0263        * struct nested_foobar - a struct with nested unions and structs
0264        * @memb1: first member of anonymous union/anonymous struct
0265        * @memb2: second member of anonymous union/anonymous struct
0266        * @memb3: third member of anonymous union/anonymous struct
0267        * @memb4: fourth member of anonymous union/anonymous struct
0268        * @bar: non-anonymous union
0269        * @bar.st1: struct st1 inside @bar
0270        * @bar.st2: struct st2 inside @bar
0271        * @bar.st1.memb1: first member of struct st1 on union bar
0272        * @bar.st1.memb2: second member of struct st1 on union bar
0273        * @bar.st2.memb1: first member of struct st2 on union bar
0274        * @bar.st2.memb2: second member of struct st2 on union bar
0275        */
0276       struct nested_foobar {
0277         /* Anonymous union/struct*/
0278         union {
0279           struct {
0280             int memb1;
0281             int memb2;
0282         }
0283           struct {
0284             void *memb3;
0285             int memb4;
0286           }
0287         }
0288         union {
0289           struct {
0290             int memb1;
0291             int memb2;
0292           } st1;
0293           struct {
0294             void *memb1;
0295             int memb2;
0296           } st2;
0297         } bar;
0298       };
0299 
0300 .. note::
0301 
0302    #) Quando documentate una struttura od unione annidata, ad esempio
0303       di nome ``foo``, il suo campo ``bar`` dev'essere documentato
0304       usando ``@foo.bar:``
0305    #) Quando la struttura od unione annidata è anonima, il suo campo
0306       ``bar`` dev'essere documentato usando ``@bar:``
0307 
0308 Commenti in linea per la documentazione dei membri
0309 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0310 
0311 I membri d'una struttura possono essere documentati in linea all'interno
0312 della definizione stessa. Ci sono due stili: una singola riga di commento
0313 che inizia con ``/**`` e finisce con ``*/``; commenti multi riga come
0314 qualsiasi altro commento kernel-doc::
0315 
0316   /**
0317    * struct foo - Brief description.
0318    * @foo: The Foo member.
0319    */
0320   struct foo {
0321         int foo;
0322         /**
0323          * @bar: The Bar member.
0324          */
0325         int bar;
0326         /**
0327          * @baz: The Baz member.
0328          *
0329          * Here, the member description may contain several paragraphs.
0330          */
0331         int baz;
0332         union {
0333                 /** @foobar: Single line description. */
0334                 int foobar;
0335         };
0336         /** @bar2: Description for struct @bar2 inside @foo */
0337         struct {
0338                 /**
0339                  * @bar2.barbar: Description for @barbar inside @foo.bar2
0340                  */
0341                 int barbar;
0342         } bar2;
0343   };
0344 
0345 
0346 Documentazione dei tipi di dato
0347 -------------------------------
0348 Generalmente il formato di un commento kernel-doc per typedef è
0349 il seguente::
0350 
0351   /**
0352    * typedef type_name - Brief description.
0353    *
0354    * Description of the type.
0355    */
0356 
0357 Anche i tipi di dato per prototipi di funzione possono essere documentati::
0358 
0359   /**
0360    * typedef type_name - Brief description.
0361    * @arg1: description of arg1
0362    * @arg2: description of arg2
0363    *
0364    * Description of the type.
0365    *
0366    * Context: Locking context.
0367    * Return: Meaning of the return value.
0368    */
0369    typedef void (*type_name)(struct v4l2_ctrl *arg1, void *arg2);
0370 
0371 Marcatori e riferimenti
0372 -----------------------
0373 
0374 All'interno dei commenti di tipo kernel-doc vengono riconosciuti i seguenti
0375 *pattern* che vengono convertiti in marcatori reStructuredText ed in riferimenti
0376 del `dominio Sphinx per il C`_.
0377 
0378 .. attention:: Questi sono riconosciuti **solo** all'interno di commenti
0379                kernel-doc, e **non** all'interno di documenti reStructuredText.
0380 
0381 ``funcname()``
0382   Riferimento ad una funzione.
0383 
0384 ``@parameter``
0385   Nome di un parametro di una funzione (nessun riferimento, solo formattazione).
0386 
0387 ``%CONST``
0388   Il nome di una costante (nessun riferimento, solo formattazione)
0389 
0390 ````literal````
0391   Un blocco di testo che deve essere riportato così com'è. La rappresentazione
0392   finale utilizzerà caratteri a ``spaziatura fissa``.
0393 
0394   Questo è utile se dovete utilizzare caratteri speciali che altrimenti
0395   potrebbero assumere un significato diverso in kernel-doc o in reStructuredText
0396 
0397   Questo è particolarmente utile se dovete scrivere qualcosa come ``%ph``
0398   all'interno della descrizione di una funzione.
0399 
0400 ``$ENVVAR``
0401   Il nome di una variabile d'ambiente (nessun riferimento, solo formattazione).
0402 
0403 ``&struct name``
0404   Riferimento ad una struttura.
0405 
0406 ``&enum name``
0407   Riferimento ad un'enumerazione.
0408 
0409 ``&typedef name``
0410   Riferimento ad un tipo di dato.
0411 
0412 ``&struct_name->member`` or ``&struct_name.member``
0413   Riferimento ad un membro di una struttura o di un'unione. Il riferimento sarà
0414   la struttura o l'unione, non il memembro.
0415 
0416 ``&name``
0417   Un generico riferimento ad un tipo. Usate, preferibilmente, il riferimento
0418   completo come descritto sopra. Questo è dedicato ai commenti obsoleti.
0419 
0420 Riferimenti usando reStructuredText
0421 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0422 
0423 Nei documenti reStructuredText non serve alcuna sintassi speciale per
0424 fare riferimento a funzioni e tipi definiti nei commenti
0425 kernel-doc. Sarà sufficiente terminare i nomi di funzione con ``()``,
0426 e scrivere ``struct``, ``union``, ``enum``, o ``typedef`` prima di un
0427 tipo. Per esempio::
0428 
0429   See foo()
0430   See struct foo.
0431   See union bar.
0432   See enum baz.
0433   See typedef meh.
0434 
0435 Tuttavia, la personalizzazione dei collegamenti è possibile solo con
0436 la seguente sintassi::
0437 
0438   See :c:func:`my custom link text for function foo <foo>`.
0439   See :c:type:`my custom link text for struct bar <bar>`.
0440 
0441 
0442 Commenti per una documentazione generale
0443 ----------------------------------------
0444 
0445 Al fine d'avere il codice ed i commenti nello stesso file, potete includere
0446 dei blocchi di documentazione kernel-doc con un formato libero invece
0447 che nel formato specifico per funzioni, strutture, unioni, enumerati o tipi
0448 di dato. Per esempio, questo tipo di commento potrebbe essere usato per la
0449 spiegazione delle operazioni di un driver o di una libreria
0450 
0451 Questo s'ottiene utilizzando la parola chiave ``DOC:`` a cui viene associato
0452 un titolo.
0453 
0454 Generalmente il formato di un commento generico o di visione d'insieme è
0455 il seguente::
0456 
0457   /**
0458    * DOC: Theory of Operation
0459    *
0460    * The whizbang foobar is a dilly of a gizmo. It can do whatever you
0461    * want it to do, at any time. It reads your mind. Here's how it works.
0462    *
0463    * foo bar splat
0464    *
0465    * The only drawback to this gizmo is that is can sometimes damage
0466    * hardware, software, or its subject(s).
0467    */
0468 
0469 Il titolo che segue ``DOC:`` funziona da intestazione all'interno del file
0470 sorgente, ma anche come identificatore per l'estrazione di questi commenti di
0471 documentazione. Quindi, il titolo dev'essere unico all'interno del file.
0472 
0473 =======================================
0474 Includere i commenti di tipo kernel-doc
0475 =======================================
0476 
0477 I commenti di documentazione possono essere inclusi in un qualsiasi documento
0478 di tipo reStructuredText mediante l'apposita direttiva nell'estensione
0479 kernel-doc per Sphinx.
0480 
0481 Le direttive kernel-doc sono nel formato::
0482 
0483   .. kernel-doc:: source
0484      :option:
0485 
0486 Il campo *source* è il percorso ad un file sorgente, relativo alla cartella
0487 principale dei sorgenti del kernel. La direttiva supporta le seguenti opzioni:
0488 
0489 export: *[source-pattern ...]*
0490   Include la documentazione per tutte le funzioni presenti nel file sorgente
0491   (*source*) che sono state esportate utilizzando ``EXPORT_SYMBOL`` o
0492   ``EXPORT_SYMBOL_GPL`` in *source* o in qualsiasi altro *source-pattern*
0493   specificato.
0494 
0495   Il campo *source-patter* è utile quando i commenti kernel-doc sono stati
0496   scritti nei file d'intestazione, mentre ``EXPORT_SYMBOL`` e
0497   ``EXPORT_SYMBOL_GPL`` si trovano vicino alla definizione delle funzioni.
0498 
0499   Esempi::
0500 
0501     .. kernel-doc:: lib/bitmap.c
0502        :export:
0503 
0504     .. kernel-doc:: include/net/mac80211.h
0505        :export: net/mac80211/*.c
0506 
0507 internal: *[source-pattern ...]*
0508   Include la documentazione per tutte le funzioni ed i tipi presenti nel file
0509   sorgente (*source*) che **non** sono stati esportati utilizzando
0510   ``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` né in *source* né in qualsiasi
0511   altro *source-pattern* specificato.
0512 
0513   Esempio::
0514 
0515     .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
0516        :internal:
0517 
0518 identifiers: *[ function/type ...]*
0519   Include la documentazione per ogni *function* e *type*  in *source*.
0520   Se non vengono esplicitamente specificate le funzioni da includere, allora
0521   verranno incluse tutte quelle disponibili in *source*.
0522 
0523   Esempi::
0524 
0525     .. kernel-doc:: lib/bitmap.c
0526        :identifiers: bitmap_parselist bitmap_parselist_user
0527 
0528     .. kernel-doc:: lib/idr.c
0529        :identifiers:
0530 
0531 functions: *[ function ...]*
0532   Questo è uno pseudonimo, deprecato, per la direttiva 'identifiers'.
0533 
0534 doc: *title*
0535   Include la documentazione del paragrafo ``DOC:`` identificato dal titolo
0536   (*title*) all'interno del file sorgente (*source*). Gli spazi in *title* sono
0537   permessi; non virgolettate *title*. Il campo *title* è utilizzato per
0538   identificare un paragrafo e per questo non viene incluso nella documentazione
0539   finale. Verificate d'avere l'intestazione appropriata nei documenti
0540   reStructuredText.
0541 
0542   Esempio::
0543 
0544     .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
0545        :doc: High Definition Audio over HDMI and Display Port
0546 
0547 Senza alcuna opzione, la direttiva kernel-doc include tutti i commenti di
0548 documentazione presenti nel file sorgente (*source*).
0549 
0550 L'estensione kernel-doc fa parte dei sorgenti del kernel, la si può trovare
0551 in ``Documentation/sphinx/kerneldoc.py``. Internamente, viene utilizzato
0552 lo script ``scripts/kernel-doc`` per estrarre i commenti di documentazione
0553 dai file sorgenti.
0554 
0555 Come utilizzare kernel-doc per generare pagine man
0556 --------------------------------------------------
0557 
0558 Se volete utilizzare kernel-doc solo per generare delle pagine man, potete
0559 farlo direttamente dai sorgenti del kernel::
0560 
0561   $ scripts/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^tools) | scripts/split-man.pl /tmp/man