1*4882a593Smuzhiyun.. include:: ../disclaimer-ita.rst 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun.. note:: Per leggere la documentazione originale in inglese: 4*4882a593Smuzhiyun :ref:`Documentation/doc-guide/index.rst <doc_guide>` 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun.. _it_kernel_doc: 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunScrivere i commenti in kernel-doc 9*4882a593Smuzhiyun================================= 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunNei file sorgenti del kernel Linux potrete trovare commenti di documentazione 12*4882a593Smuzhiyunstrutturanti secondo il formato kernel-doc. Essi possono descrivere funzioni, 13*4882a593Smuzhiyuntipi di dati, e l'architettura del codice. 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun.. note:: Il formato kernel-doc può sembrare simile a gtk-doc o Doxygen ma 16*4882a593Smuzhiyun in realtà è molto differente per ragioni storiche. I sorgenti del kernel 17*4882a593Smuzhiyun contengono decine di migliaia di commenti kernel-doc. Siete pregati 18*4882a593Smuzhiyun d'attenervi allo stile qui descritto. 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunLa struttura kernel-doc è estratta a partire dai commenti; da questi viene 21*4882a593Smuzhiyungenerato il `dominio Sphinx per il C`_ con un'adeguata descrizione per le 22*4882a593Smuzhiyunfunzioni ed i tipi di dato con i loro relativi collegamenti. Le descrizioni 23*4882a593Smuzhiyunvengono filtrare per cercare i riferimenti ed i marcatori. 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunVedere di seguito per maggiori dettagli. 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun.. _`dominio Sphinx per il C`: http://www.sphinx-doc.org/en/stable/domains.html 28*4882a593Smuzhiyun 29*4882a593SmuzhiyunTutte le funzioni esportate verso i moduli esterni utilizzando 30*4882a593Smuzhiyun``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` dovrebbero avere un commento 31*4882a593Smuzhiyunkernel-doc. Quando l'intenzione è di utilizzarle nei moduli, anche le funzioni 32*4882a593Smuzhiyune le strutture dati nei file d'intestazione dovrebbero avere dei commenti 33*4882a593Smuzhiyunkernel-doc. 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunÈ considerata una buona pratica quella di fornire una documentazione formattata 36*4882a593Smuzhiyunsecondo kernel-doc per le funzioni che sono visibili da altri file del kernel 37*4882a593Smuzhiyun(ovvero, che non siano dichiarate utilizzando ``static``). Raccomandiamo, 38*4882a593Smuzhiyuninoltre, di fornire una documentazione kernel-doc anche per procedure private 39*4882a593Smuzhiyun(ovvero, dichiarate "static") al fine di fornire una struttura più coerente 40*4882a593Smuzhiyundei sorgenti. Quest'ultima raccomandazione ha una priorità più bassa ed è a 41*4882a593Smuzhiyundiscrezione dal manutentore (MAINTAINER) del file sorgente. 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun 45*4882a593SmuzhiyunSicuramente la documentazione formattata con kernel-doc è necessaria per 46*4882a593Smuzhiyunle funzioni che sono esportate verso i moduli esterni utilizzando 47*4882a593Smuzhiyun``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL``. 48*4882a593Smuzhiyun 49*4882a593SmuzhiyunCerchiamo anche di fornire una documentazione formattata secondo kernel-doc 50*4882a593Smuzhiyunper le funzioni che sono visibili da altri file del kernel (ovvero, che non 51*4882a593Smuzhiyunsiano dichiarate utilizzando "static") 52*4882a593Smuzhiyun 53*4882a593SmuzhiyunRaccomandiamo, inoltre, di fornire una documentazione formattata con kernel-doc 54*4882a593Smuzhiyunanche per procedure private (ovvero, dichiarate "static") al fine di fornire 55*4882a593Smuzhiyununa struttura più coerente dei sorgenti. Questa raccomandazione ha una priorità 56*4882a593Smuzhiyunpiù bassa ed è a discrezione dal manutentore (MAINTAINER) del file sorgente. 57*4882a593Smuzhiyun 58*4882a593SmuzhiyunLe strutture dati visibili nei file di intestazione dovrebbero essere anch'esse 59*4882a593Smuzhiyundocumentate utilizzando commenti formattati con kernel-doc. 60*4882a593Smuzhiyun 61*4882a593SmuzhiyunCome formattare i commenti kernel-doc 62*4882a593Smuzhiyun------------------------------------- 63*4882a593Smuzhiyun 64*4882a593SmuzhiyunI commenti kernel-doc iniziano con il marcatore ``/**``. Il programma 65*4882a593Smuzhiyun``kernel-doc`` estrarrà i commenti marchiati in questo modo. Il resto 66*4882a593Smuzhiyundel commento è formattato come un normale commento multilinea, ovvero 67*4882a593Smuzhiyuncon un asterisco all'inizio d'ogni riga e che si conclude con ``*/`` 68*4882a593Smuzhiyunsu una riga separata. 69*4882a593Smuzhiyun 70*4882a593SmuzhiyunI commenti kernel-doc di funzioni e tipi dovrebbero essere posizionati 71*4882a593Smuzhiyunappena sopra la funzione od il tipo che descrivono. Questo allo scopo di 72*4882a593Smuzhiyunaumentare la probabilità che chi cambia il codice si ricordi di aggiornare 73*4882a593Smuzhiyunanche la documentazione. I commenti kernel-doc di tipo più generale possono 74*4882a593Smuzhiyunessere posizionati ovunque nel file. 75*4882a593Smuzhiyun 76*4882a593SmuzhiyunAl fine di verificare che i commenti siano formattati correttamente, potete 77*4882a593Smuzhiyuneseguire il programma ``kernel-doc`` con un livello di verbosità alto e senza 78*4882a593Smuzhiyunche questo produca alcuna documentazione. Per esempio:: 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun scripts/kernel-doc -v -none drivers/foo/bar.c 81*4882a593Smuzhiyun 82*4882a593SmuzhiyunIl formato della documentazione è verificato della procedura di generazione 83*4882a593Smuzhiyundel kernel quando viene richiesto di effettuare dei controlli extra con GCC:: 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun make W=n 86*4882a593Smuzhiyun 87*4882a593SmuzhiyunDocumentare le funzioni 88*4882a593Smuzhiyun------------------------ 89*4882a593Smuzhiyun 90*4882a593SmuzhiyunGeneralmente il formato di un commento kernel-doc per funzioni e 91*4882a593Smuzhiyunmacro simil-funzioni è il seguente:: 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /** 94*4882a593Smuzhiyun * function_name() - Brief description of function. 95*4882a593Smuzhiyun * @arg1: Describe the first argument. 96*4882a593Smuzhiyun * @arg2: Describe the second argument. 97*4882a593Smuzhiyun * One can provide multiple line descriptions 98*4882a593Smuzhiyun * for arguments. 99*4882a593Smuzhiyun * 100*4882a593Smuzhiyun * A longer description, with more discussion of the function function_name() 101*4882a593Smuzhiyun * that might be useful to those using or modifying it. Begins with an 102*4882a593Smuzhiyun * empty comment line, and may include additional embedded empty 103*4882a593Smuzhiyun * comment lines. 104*4882a593Smuzhiyun * 105*4882a593Smuzhiyun * The longer description may have multiple paragraphs. 106*4882a593Smuzhiyun * 107*4882a593Smuzhiyun * Context: Describes whether the function can sleep, what locks it takes, 108*4882a593Smuzhiyun * releases, or expects to be held. It can extend over multiple 109*4882a593Smuzhiyun * lines. 110*4882a593Smuzhiyun * Return: Describe the return value of function_name. 111*4882a593Smuzhiyun * 112*4882a593Smuzhiyun * The return value description can also have multiple paragraphs, and should 113*4882a593Smuzhiyun * be placed at the end of the comment block. 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun 116*4882a593SmuzhiyunLa descrizione introduttiva (*brief description*) che segue il nome della 117*4882a593Smuzhiyunfunzione può continuare su righe successive e termina con la descrizione di 118*4882a593Smuzhiyunun argomento, una linea di commento vuota, oppure la fine del commento. 119*4882a593Smuzhiyun 120*4882a593SmuzhiyunParametri delle funzioni 121*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~ 122*4882a593Smuzhiyun 123*4882a593SmuzhiyunOgni argomento di una funzione dovrebbe essere descritto in ordine, subito 124*4882a593Smuzhiyundopo la descrizione introduttiva. Non lasciare righe vuote né fra la 125*4882a593Smuzhiyundescrizione introduttiva e quella degli argomenti, né fra gli argomenti. 126*4882a593Smuzhiyun 127*4882a593SmuzhiyunOgni ``@argument:`` può estendersi su più righe. 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun.. note:: 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun Se la descrizione di ``@argument:`` si estende su più righe, 132*4882a593Smuzhiyun la continuazione dovrebbe iniziare alla stessa colonna della riga 133*4882a593Smuzhiyun precedente:: 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun * @argument: some long description 136*4882a593Smuzhiyun * that continues on next lines 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun or:: 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun * @argument: 141*4882a593Smuzhiyun * some long description 142*4882a593Smuzhiyun * that continues on next lines 143*4882a593Smuzhiyun 144*4882a593SmuzhiyunSe una funzione ha un numero variabile di argomento, la sua descrizione 145*4882a593Smuzhiyundovrebbe essere scritta con la notazione kernel-doc:: 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun * @...: description 148*4882a593Smuzhiyun 149*4882a593SmuzhiyunContesto delle funzioni 150*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~ 151*4882a593Smuzhiyun 152*4882a593SmuzhiyunIl contesto in cui le funzioni vengono chiamate viene descritto in una 153*4882a593Smuzhiyunsezione chiamata ``Context``. Questo dovrebbe informare sulla possibilità 154*4882a593Smuzhiyunche una funzione dorma (*sleep*) o che possa essere chiamata in un contesto 155*4882a593Smuzhiyund'interruzione, così come i *lock* che prende, rilascia e che si aspetta che 156*4882a593Smuzhiyunvengano presi dal chiamante. 157*4882a593Smuzhiyun 158*4882a593SmuzhiyunEsempi:: 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun * Context: Any context. 161*4882a593Smuzhiyun * Context: Any context. Takes and releases the RCU lock. 162*4882a593Smuzhiyun * Context: Any context. Expects <lock> to be held by caller. 163*4882a593Smuzhiyun * Context: Process context. May sleep if @gfp flags permit. 164*4882a593Smuzhiyun * Context: Process context. Takes and releases <mutex>. 165*4882a593Smuzhiyun * Context: Softirq or process context. Takes and releases <lock>, BH-safe. 166*4882a593Smuzhiyun * Context: Interrupt context. 167*4882a593Smuzhiyun 168*4882a593SmuzhiyunValore di ritorno 169*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~ 170*4882a593Smuzhiyun 171*4882a593SmuzhiyunIl valore di ritorno, se c'è, viene descritto in una sezione dedicata di nome 172*4882a593Smuzhiyun``Return``. 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun.. note:: 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #) La descrizione multiriga non riconosce il termine d'una riga, per cui 177*4882a593Smuzhiyun se provate a formattare bene il vostro testo come nel seguente esempio:: 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun * Return: 180*4882a593Smuzhiyun * 0 - OK 181*4882a593Smuzhiyun * -EINVAL - invalid argument 182*4882a593Smuzhiyun * -ENOMEM - out of memory 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun le righe verranno unite e il risultato sarà:: 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun Quindi, se volete che le righe vengano effettivamente generate, dovete 189*4882a593Smuzhiyun utilizzare una lista ReST, ad esempio:: 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun * Return: 192*4882a593Smuzhiyun * * 0 - OK to runtime suspend the device 193*4882a593Smuzhiyun * * -EBUSY - Device should not be runtime suspended 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #) Se il vostro testo ha delle righe che iniziano con una frase seguita dai 196*4882a593Smuzhiyun due punti, allora ognuna di queste frasi verrà considerata come il nome 197*4882a593Smuzhiyun di una nuova sezione, e probabilmente non produrrà gli effetti desiderati. 198*4882a593Smuzhiyun 199*4882a593SmuzhiyunDocumentare strutture, unioni ed enumerazioni 200*4882a593Smuzhiyun--------------------------------------------- 201*4882a593Smuzhiyun 202*4882a593SmuzhiyunGeneralmente il formato di un commento kernel-doc per struct, union ed enum è:: 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /** 205*4882a593Smuzhiyun * struct struct_name - Brief description. 206*4882a593Smuzhiyun * @member1: Description of member1. 207*4882a593Smuzhiyun * @member2: Description of member2. 208*4882a593Smuzhiyun * One can provide multiple line descriptions 209*4882a593Smuzhiyun * for members. 210*4882a593Smuzhiyun * 211*4882a593Smuzhiyun * Description of the structure. 212*4882a593Smuzhiyun */ 213*4882a593Smuzhiyun 214*4882a593SmuzhiyunNell'esempio qui sopra, potete sostituire ``struct`` con ``union`` o ``enum`` 215*4882a593Smuzhiyunper descrivere unioni ed enumerati. ``member`` viene usato per indicare i 216*4882a593Smuzhiyunmembri di strutture ed unioni, ma anche i valori di un tipo enumerato. 217*4882a593Smuzhiyun 218*4882a593SmuzhiyunLa descrizione introduttiva (*brief description*) che segue il nome della 219*4882a593Smuzhiyunfunzione può continuare su righe successive e termina con la descrizione di 220*4882a593Smuzhiyunun argomento, una linea di commento vuota, oppure la fine del commento. 221*4882a593Smuzhiyun 222*4882a593SmuzhiyunMembri 223*4882a593Smuzhiyun~~~~~~ 224*4882a593Smuzhiyun 225*4882a593SmuzhiyunI membri di strutture, unioni ed enumerati devo essere documentati come i 226*4882a593Smuzhiyunparametri delle funzioni; seguono la descrizione introduttiva e possono 227*4882a593Smuzhiyunestendersi su più righe. 228*4882a593Smuzhiyun 229*4882a593SmuzhiyunAll'interno d'una struttura o d'un unione, potete utilizzare le etichette 230*4882a593Smuzhiyun``private:`` e ``public:``. I campi che sono nell'area ``private:`` non 231*4882a593Smuzhiyunverranno inclusi nella documentazione finale. 232*4882a593Smuzhiyun 233*4882a593SmuzhiyunLe etichette ``private:`` e ``public:`` devono essere messe subito dopo 234*4882a593Smuzhiyunil marcatore di un commento ``/*``. Opzionalmente, possono includere commenti 235*4882a593Smuzhiyunfra ``:`` e il marcatore di fine commento ``*/``. 236*4882a593Smuzhiyun 237*4882a593SmuzhiyunEsempio:: 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /** 240*4882a593Smuzhiyun * struct my_struct - short description 241*4882a593Smuzhiyun * @a: first member 242*4882a593Smuzhiyun * @b: second member 243*4882a593Smuzhiyun * @d: fourth member 244*4882a593Smuzhiyun * 245*4882a593Smuzhiyun * Longer description 246*4882a593Smuzhiyun */ 247*4882a593Smuzhiyun struct my_struct { 248*4882a593Smuzhiyun int a; 249*4882a593Smuzhiyun int b; 250*4882a593Smuzhiyun /* private: internal use only */ 251*4882a593Smuzhiyun int c; 252*4882a593Smuzhiyun /* public: the next one is public */ 253*4882a593Smuzhiyun int d; 254*4882a593Smuzhiyun }; 255*4882a593Smuzhiyun 256*4882a593SmuzhiyunStrutture ed unioni annidate 257*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258*4882a593Smuzhiyun 259*4882a593SmuzhiyunÈ possibile documentare strutture ed unioni annidate, ad esempio:: 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /** 262*4882a593Smuzhiyun * struct nested_foobar - a struct with nested unions and structs 263*4882a593Smuzhiyun * @memb1: first member of anonymous union/anonymous struct 264*4882a593Smuzhiyun * @memb2: second member of anonymous union/anonymous struct 265*4882a593Smuzhiyun * @memb3: third member of anonymous union/anonymous struct 266*4882a593Smuzhiyun * @memb4: fourth member of anonymous union/anonymous struct 267*4882a593Smuzhiyun * @bar: non-anonymous union 268*4882a593Smuzhiyun * @bar.st1: struct st1 inside @bar 269*4882a593Smuzhiyun * @bar.st2: struct st2 inside @bar 270*4882a593Smuzhiyun * @bar.st1.memb1: first member of struct st1 on union bar 271*4882a593Smuzhiyun * @bar.st1.memb2: second member of struct st1 on union bar 272*4882a593Smuzhiyun * @bar.st2.memb1: first member of struct st2 on union bar 273*4882a593Smuzhiyun * @bar.st2.memb2: second member of struct st2 on union bar 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun struct nested_foobar { 276*4882a593Smuzhiyun /* Anonymous union/struct*/ 277*4882a593Smuzhiyun union { 278*4882a593Smuzhiyun struct { 279*4882a593Smuzhiyun int memb1; 280*4882a593Smuzhiyun int memb2; 281*4882a593Smuzhiyun } 282*4882a593Smuzhiyun struct { 283*4882a593Smuzhiyun void *memb3; 284*4882a593Smuzhiyun int memb4; 285*4882a593Smuzhiyun } 286*4882a593Smuzhiyun } 287*4882a593Smuzhiyun union { 288*4882a593Smuzhiyun struct { 289*4882a593Smuzhiyun int memb1; 290*4882a593Smuzhiyun int memb2; 291*4882a593Smuzhiyun } st1; 292*4882a593Smuzhiyun struct { 293*4882a593Smuzhiyun void *memb1; 294*4882a593Smuzhiyun int memb2; 295*4882a593Smuzhiyun } st2; 296*4882a593Smuzhiyun } bar; 297*4882a593Smuzhiyun }; 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun.. note:: 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun #) Quando documentate una struttura od unione annidata, ad esempio 302*4882a593Smuzhiyun di nome ``foo``, il suo campo ``bar`` dev'essere documentato 303*4882a593Smuzhiyun usando ``@foo.bar:`` 304*4882a593Smuzhiyun #) Quando la struttura od unione annidata è anonima, il suo campo 305*4882a593Smuzhiyun ``bar`` dev'essere documentato usando ``@bar:`` 306*4882a593Smuzhiyun 307*4882a593SmuzhiyunCommenti in linea per la documentazione dei membri 308*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 309*4882a593Smuzhiyun 310*4882a593SmuzhiyunI membri d'una struttura possono essere documentati in linea all'interno 311*4882a593Smuzhiyundella definizione stessa. Ci sono due stili: una singola riga di commento 312*4882a593Smuzhiyunche inizia con ``/**`` e finisce con ``*/``; commenti multi riga come 313*4882a593Smuzhiyunqualsiasi altro commento kernel-doc:: 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun /** 316*4882a593Smuzhiyun * struct foo - Brief description. 317*4882a593Smuzhiyun * @foo: The Foo member. 318*4882a593Smuzhiyun */ 319*4882a593Smuzhiyun struct foo { 320*4882a593Smuzhiyun int foo; 321*4882a593Smuzhiyun /** 322*4882a593Smuzhiyun * @bar: The Bar member. 323*4882a593Smuzhiyun */ 324*4882a593Smuzhiyun int bar; 325*4882a593Smuzhiyun /** 326*4882a593Smuzhiyun * @baz: The Baz member. 327*4882a593Smuzhiyun * 328*4882a593Smuzhiyun * Here, the member description may contain several paragraphs. 329*4882a593Smuzhiyun */ 330*4882a593Smuzhiyun int baz; 331*4882a593Smuzhiyun union { 332*4882a593Smuzhiyun /** @foobar: Single line description. */ 333*4882a593Smuzhiyun int foobar; 334*4882a593Smuzhiyun }; 335*4882a593Smuzhiyun /** @bar2: Description for struct @bar2 inside @foo */ 336*4882a593Smuzhiyun struct { 337*4882a593Smuzhiyun /** 338*4882a593Smuzhiyun * @bar2.barbar: Description for @barbar inside @foo.bar2 339*4882a593Smuzhiyun */ 340*4882a593Smuzhiyun int barbar; 341*4882a593Smuzhiyun } bar2; 342*4882a593Smuzhiyun }; 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun 345*4882a593SmuzhiyunDocumentazione dei tipi di dato 346*4882a593Smuzhiyun------------------------------- 347*4882a593SmuzhiyunGeneralmente il formato di un commento kernel-doc per typedef è 348*4882a593Smuzhiyunil seguente:: 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /** 351*4882a593Smuzhiyun * typedef type_name - Brief description. 352*4882a593Smuzhiyun * 353*4882a593Smuzhiyun * Description of the type. 354*4882a593Smuzhiyun */ 355*4882a593Smuzhiyun 356*4882a593SmuzhiyunAnche i tipi di dato per prototipi di funzione possono essere documentati:: 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /** 359*4882a593Smuzhiyun * typedef type_name - Brief description. 360*4882a593Smuzhiyun * @arg1: description of arg1 361*4882a593Smuzhiyun * @arg2: description of arg2 362*4882a593Smuzhiyun * 363*4882a593Smuzhiyun * Description of the type. 364*4882a593Smuzhiyun * 365*4882a593Smuzhiyun * Context: Locking context. 366*4882a593Smuzhiyun * Return: Meaning of the return value. 367*4882a593Smuzhiyun */ 368*4882a593Smuzhiyun typedef void (*type_name)(struct v4l2_ctrl *arg1, void *arg2); 369*4882a593Smuzhiyun 370*4882a593SmuzhiyunMarcatori e riferimenti 371*4882a593Smuzhiyun----------------------- 372*4882a593Smuzhiyun 373*4882a593SmuzhiyunAll'interno dei commenti di tipo kernel-doc vengono riconosciuti i seguenti 374*4882a593Smuzhiyun*pattern* che vengono convertiti in marcatori reStructuredText ed in riferimenti 375*4882a593Smuzhiyundel `dominio Sphinx per il C`_. 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun.. attention:: Questi sono riconosciuti **solo** all'interno di commenti 378*4882a593Smuzhiyun kernel-doc, e **non** all'interno di documenti reStructuredText. 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun``funcname()`` 381*4882a593Smuzhiyun Riferimento ad una funzione. 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun``@parameter`` 384*4882a593Smuzhiyun Nome di un parametro di una funzione (nessun riferimento, solo formattazione). 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun``%CONST`` 387*4882a593Smuzhiyun Il nome di una costante (nessun riferimento, solo formattazione) 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun````literal```` 390*4882a593Smuzhiyun Un blocco di testo che deve essere riportato così com'è. La rappresentazione 391*4882a593Smuzhiyun finale utilizzerà caratteri a ``spaziatura fissa``. 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun Questo è utile se dovete utilizzare caratteri speciali che altrimenti 394*4882a593Smuzhiyun potrebbero assumere un significato diverso in kernel-doc o in reStructuredText 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun Questo è particolarmente utile se dovete scrivere qualcosa come ``%ph`` 397*4882a593Smuzhiyun all'interno della descrizione di una funzione. 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun``$ENVVAR`` 400*4882a593Smuzhiyun Il nome di una variabile d'ambiente (nessun riferimento, solo formattazione). 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun``&struct name`` 403*4882a593Smuzhiyun Riferimento ad una struttura. 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun``&enum name`` 406*4882a593Smuzhiyun Riferimento ad un'enumerazione. 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun``&typedef name`` 409*4882a593Smuzhiyun Riferimento ad un tipo di dato. 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun``&struct_name->member`` or ``&struct_name.member`` 412*4882a593Smuzhiyun Riferimento ad un membro di una struttura o di un'unione. Il riferimento sarà 413*4882a593Smuzhiyun la struttura o l'unione, non il memembro. 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun``&name`` 416*4882a593Smuzhiyun Un generico riferimento ad un tipo. Usate, preferibilmente, il riferimento 417*4882a593Smuzhiyun completo come descritto sopra. Questo è dedicato ai commenti obsoleti. 418*4882a593Smuzhiyun 419*4882a593SmuzhiyunRiferimenti usando reStructuredText 420*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421*4882a593Smuzhiyun 422*4882a593SmuzhiyunPer fare riferimento a funzioni e tipi di dato definiti nei commenti kernel-doc 423*4882a593Smuzhiyunall'interno dei documenti reStructuredText, utilizzate i riferimenti dal 424*4882a593Smuzhiyun`dominio Sphinx per il C`_. Per esempio:: 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun See function :c:func:`foo` and struct/union/enum/typedef :c:type:`bar`. 427*4882a593Smuzhiyun 428*4882a593SmuzhiyunNonostante il riferimento ai tipi di dato funzioni col solo nome, 429*4882a593Smuzhiyunovvero senza specificare struct/union/enum/typedef, potreste preferire il 430*4882a593Smuzhiyunseguente:: 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun See :c:type:`struct foo <foo>`. 433*4882a593Smuzhiyun See :c:type:`union bar <bar>`. 434*4882a593Smuzhiyun See :c:type:`enum baz <baz>`. 435*4882a593Smuzhiyun See :c:type:`typedef meh <meh>`. 436*4882a593Smuzhiyun 437*4882a593SmuzhiyunQuesto produce dei collegamenti migliori, ed è in linea con il modo in cui 438*4882a593Smuzhiyunkernel-doc gestisce i riferimenti. 439*4882a593Smuzhiyun 440*4882a593SmuzhiyunPer maggiori informazioni, siete pregati di consultare la documentazione 441*4882a593Smuzhiyundel `dominio Sphinx per il C`_. 442*4882a593Smuzhiyun 443*4882a593SmuzhiyunCommenti per una documentazione generale 444*4882a593Smuzhiyun---------------------------------------- 445*4882a593Smuzhiyun 446*4882a593SmuzhiyunAl fine d'avere il codice ed i commenti nello stesso file, potete includere 447*4882a593Smuzhiyundei blocchi di documentazione kernel-doc con un formato libero invece 448*4882a593Smuzhiyunche nel formato specifico per funzioni, strutture, unioni, enumerati o tipi 449*4882a593Smuzhiyundi dato. Per esempio, questo tipo di commento potrebbe essere usato per la 450*4882a593Smuzhiyunspiegazione delle operazioni di un driver o di una libreria 451*4882a593Smuzhiyun 452*4882a593SmuzhiyunQuesto s'ottiene utilizzando la parola chiave ``DOC:`` a cui viene associato 453*4882a593Smuzhiyunun titolo. 454*4882a593Smuzhiyun 455*4882a593SmuzhiyunGeneralmente il formato di un commento generico o di visione d'insieme è 456*4882a593Smuzhiyunil seguente:: 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun /** 459*4882a593Smuzhiyun * DOC: Theory of Operation 460*4882a593Smuzhiyun * 461*4882a593Smuzhiyun * The whizbang foobar is a dilly of a gizmo. It can do whatever you 462*4882a593Smuzhiyun * want it to do, at any time. It reads your mind. Here's how it works. 463*4882a593Smuzhiyun * 464*4882a593Smuzhiyun * foo bar splat 465*4882a593Smuzhiyun * 466*4882a593Smuzhiyun * The only drawback to this gizmo is that is can sometimes damage 467*4882a593Smuzhiyun * hardware, software, or its subject(s). 468*4882a593Smuzhiyun */ 469*4882a593Smuzhiyun 470*4882a593SmuzhiyunIl titolo che segue ``DOC:`` funziona da intestazione all'interno del file 471*4882a593Smuzhiyunsorgente, ma anche come identificatore per l'estrazione di questi commenti di 472*4882a593Smuzhiyundocumentazione. Quindi, il titolo dev'essere unico all'interno del file. 473*4882a593Smuzhiyun 474*4882a593SmuzhiyunIncludere i commenti di tipo kernel-doc 475*4882a593Smuzhiyun======================================= 476*4882a593Smuzhiyun 477*4882a593SmuzhiyunI commenti di documentazione possono essere inclusi in un qualsiasi documento 478*4882a593Smuzhiyundi tipo reStructuredText mediante l'apposita direttiva nell'estensione 479*4882a593Smuzhiyunkernel-doc per Sphinx. 480*4882a593Smuzhiyun 481*4882a593SmuzhiyunLe direttive kernel-doc sono nel formato:: 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun .. kernel-doc:: source 484*4882a593Smuzhiyun :option: 485*4882a593Smuzhiyun 486*4882a593SmuzhiyunIl campo *source* è il percorso ad un file sorgente, relativo alla cartella 487*4882a593Smuzhiyunprincipale dei sorgenti del kernel. La direttiva supporta le seguenti opzioni: 488*4882a593Smuzhiyun 489*4882a593Smuzhiyunexport: *[source-pattern ...]* 490*4882a593Smuzhiyun Include la documentazione per tutte le funzioni presenti nel file sorgente 491*4882a593Smuzhiyun (*source*) che sono state esportate utilizzando ``EXPORT_SYMBOL`` o 492*4882a593Smuzhiyun ``EXPORT_SYMBOL_GPL`` in *source* o in qualsiasi altro *source-pattern* 493*4882a593Smuzhiyun specificato. 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun Il campo *source-patter* è utile quando i commenti kernel-doc sono stati 496*4882a593Smuzhiyun scritti nei file d'intestazione, mentre ``EXPORT_SYMBOL`` e 497*4882a593Smuzhiyun ``EXPORT_SYMBOL_GPL`` si trovano vicino alla definizione delle funzioni. 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun Esempi:: 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun .. kernel-doc:: lib/bitmap.c 502*4882a593Smuzhiyun :export: 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun .. kernel-doc:: include/net/mac80211.h 505*4882a593Smuzhiyun :export: net/mac80211/*.c 506*4882a593Smuzhiyun 507*4882a593Smuzhiyuninternal: *[source-pattern ...]* 508*4882a593Smuzhiyun Include la documentazione per tutte le funzioni ed i tipi presenti nel file 509*4882a593Smuzhiyun sorgente (*source*) che **non** sono stati esportati utilizzando 510*4882a593Smuzhiyun ``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` né in *source* né in qualsiasi 511*4882a593Smuzhiyun altro *source-pattern* specificato. 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun Esempio:: 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c 516*4882a593Smuzhiyun :internal: 517*4882a593Smuzhiyun 518*4882a593Smuzhiyunidentifiers: *[ function/type ...]* 519*4882a593Smuzhiyun Include la documentazione per ogni *function* e *type* in *source*. 520*4882a593Smuzhiyun Se non vengono esplicitamente specificate le funzioni da includere, allora 521*4882a593Smuzhiyun verranno incluse tutte quelle disponibili in *source*. 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun Esempi:: 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun .. kernel-doc:: lib/bitmap.c 526*4882a593Smuzhiyun :identifiers: bitmap_parselist bitmap_parselist_user 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun .. kernel-doc:: lib/idr.c 529*4882a593Smuzhiyun :identifiers: 530*4882a593Smuzhiyun 531*4882a593Smuzhiyunfunctions: *[ function ...]* 532*4882a593Smuzhiyun Questo è uno pseudonimo, deprecato, per la direttiva 'identifiers'. 533*4882a593Smuzhiyun 534*4882a593Smuzhiyundoc: *title* 535*4882a593Smuzhiyun Include la documentazione del paragrafo ``DOC:`` identificato dal titolo 536*4882a593Smuzhiyun (*title*) all'interno del file sorgente (*source*). Gli spazi in *title* sono 537*4882a593Smuzhiyun permessi; non virgolettate *title*. Il campo *title* è utilizzato per 538*4882a593Smuzhiyun identificare un paragrafo e per questo non viene incluso nella documentazione 539*4882a593Smuzhiyun finale. Verificate d'avere l'intestazione appropriata nei documenti 540*4882a593Smuzhiyun reStructuredText. 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun Esempio:: 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c 545*4882a593Smuzhiyun :doc: High Definition Audio over HDMI and Display Port 546*4882a593Smuzhiyun 547*4882a593SmuzhiyunSenza alcuna opzione, la direttiva kernel-doc include tutti i commenti di 548*4882a593Smuzhiyundocumentazione presenti nel file sorgente (*source*). 549*4882a593Smuzhiyun 550*4882a593SmuzhiyunL'estensione kernel-doc fa parte dei sorgenti del kernel, la si può trovare 551*4882a593Smuzhiyunin ``Documentation/sphinx/kerneldoc.py``. Internamente, viene utilizzato 552*4882a593Smuzhiyunlo script ``scripts/kernel-doc`` per estrarre i commenti di documentazione 553*4882a593Smuzhiyundai file sorgenti. 554*4882a593Smuzhiyun 555*4882a593SmuzhiyunCome utilizzare kernel-doc per generare pagine man 556*4882a593Smuzhiyun-------------------------------------------------- 557*4882a593Smuzhiyun 558*4882a593SmuzhiyunSe volete utilizzare kernel-doc solo per generare delle pagine man, potete 559*4882a593Smuzhiyunfarlo direttamente dai sorgenti del kernel:: 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun $ scripts/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^tools) | scripts/split-man.pl /tmp/man 562