1.. include:: ../disclaimer-ita.rst 2 3.. note:: Per leggere la documentazione originale in inglese: 4 :ref:`Documentation/doc-guide/index.rst <doc_guide>` 5 6.. _it_sphinxdoc: 7 8Introduzione 9============ 10 11Il kernel Linux usa `Sphinx`_ per la generazione della documentazione a partire 12dai file `reStructuredText`_ che si trovano nella cartella ``Documentation``. 13Per generare la documentazione in HTML o PDF, usate comandi ``make htmldocs`` o 14``make pdfdocs``. La documentazione così generata sarà disponibile nella 15cartella ``Documentation/output``. 16 17.. _Sphinx: http://www.sphinx-doc.org/ 18.. _reStructuredText: http://docutils.sourceforge.net/rst.html 19 20I file reStructuredText possono contenere delle direttive che permettono di 21includere i commenti di documentazione, o di tipo kernel-doc, dai file 22sorgenti. 23Solitamente questi commenti sono utilizzati per descrivere le funzioni, i tipi 24e l'architettura del codice. I commenti di tipo kernel-doc hanno una struttura 25e formato speciale, ma a parte questo vengono processati come reStructuredText. 26 27Inoltre, ci sono migliaia di altri documenti in formato testo sparsi nella 28cartella ``Documentation``. Alcuni di questi verranno probabilmente convertiti, 29nel tempo, in formato reStructuredText, ma la maggior parte di questi rimarranno 30in formato testo. 31 32.. _it_sphinx_install: 33 34Installazione Sphinx 35==================== 36 37I marcatori ReST utilizzati nei file in Documentation/ sono pensati per essere 38processati da ``Sphinx`` nella versione 1.3 o superiore. 39 40Esiste uno script che verifica i requisiti Sphinx. Per ulteriori dettagli 41consultate :ref:`it_sphinx-pre-install`. 42 43La maggior parte delle distribuzioni Linux forniscono Sphinx, ma l'insieme dei 44programmi e librerie è fragile e non è raro che dopo un aggiornamento di 45Sphinx, o qualche altro pacchetto Python, la documentazione non venga più 46generata correttamente. 47 48Un modo per evitare questo genere di problemi è quello di utilizzare una 49versione diversa da quella fornita dalla vostra distribuzione. Per fare questo, 50vi raccomandiamo di installare Sphinx dentro ad un ambiente virtuale usando 51``virtualenv-3`` o ``virtualenv`` a seconda di come Python 3 è stato 52pacchettizzato dalla vostra distribuzione. 53 54.. note:: 55 56 #) Le versioni di Sphinx inferiori alla 1.5 non funzionano bene 57 con il pacchetto Python docutils versione 0.13.1 o superiore. 58 Se volete usare queste versioni, allora dovere eseguire 59 ``pip install 'docutils==0.12'``. 60 61 #) Viene raccomandato l'uso del tema RTD per la documentazione in HTML. 62 A seconda della versione di Sphinx, potrebbe essere necessaria 63 l'installazione tramite il comando ``pip install sphinx_rtd_theme``. 64 65 #) Alcune pagine ReST contengono delle formule matematiche. A causa del 66 modo in cui Sphinx funziona, queste espressioni sono scritte 67 utilizzando LaTeX. Per una corretta interpretazione, è necessario aver 68 installato texlive con i pacchetti amdfonts e amsmath. 69 70Riassumendo, se volete installare la versione 1.7.9 di Sphinx dovete eseguire:: 71 72 $ virtualenv sphinx_1.7.9 73 $ . sphinx_1.7.9/bin/activate 74 (sphinx_1.7.9) $ pip install -r Documentation/sphinx/requirements.txt 75 76Dopo aver eseguito ``. sphinx_1.7.9/bin/activate``, il prompt cambierà per 77indicare che state usando il nuovo ambiente. Se aprite un nuova sessione, 78prima di generare la documentazione, dovrete rieseguire questo comando per 79rientrare nell'ambiente virtuale. 80 81Generazione d'immagini 82---------------------- 83 84Il meccanismo che genera la documentazione del kernel contiene un'estensione 85capace di gestire immagini in formato Graphviz e SVG (per maggior informazioni 86vedere :ref:`it_sphinx_kfigure`). 87 88Per far si che questo funzioni, dovete installare entrambe i pacchetti 89Graphviz e ImageMagick. Il sistema di generazione della documentazione è in 90grado di procedere anche se questi pacchetti non sono installati, ma il 91risultato, ovviamente, non includerà le immagini. 92 93Generazione in PDF e LaTeX 94-------------------------- 95 96Al momento, la generazione di questi documenti è supportata solo dalle 97versioni di Sphinx superiori alla 1.4. 98 99Per la generazione di PDF e LaTeX, avrete bisogno anche del pacchetto 100``XeLaTeX`` nella versione 3.14159265 101 102Per alcune distribuzioni Linux potrebbe essere necessario installare 103anche una serie di pacchetti ``texlive`` in modo da fornire il supporto 104minimo per il funzionamento di ``XeLaTeX``. 105 106.. _it_sphinx-pre-install: 107 108Verificare le dipendenze Sphinx 109------------------------------- 110 111Esiste uno script che permette di verificare automaticamente le dipendenze di 112Sphinx. Se lo script riesce a riconoscere la vostra distribuzione, allora 113sarà in grado di darvi dei suggerimenti su come procedere per completare 114l'installazione:: 115 116 $ ./scripts/sphinx-pre-install 117 Checking if the needed tools for Fedora release 26 (Twenty Six) are available 118 Warning: better to also install "texlive-luatex85". 119 You should run: 120 121 sudo dnf install -y texlive-luatex85 122 /usr/bin/virtualenv sphinx_1.7.9 123 . sphinx_1.7.9/bin/activate 124 pip install -r Documentation/sphinx/requirements.txt 125 126 Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. 127 128L'impostazione predefinita prevede il controllo dei requisiti per la generazione 129di documenti html e PDF, includendo anche il supporto per le immagini, le 130espressioni matematiche e LaTeX; inoltre, presume che venga utilizzato un 131ambiente virtuale per Python. I requisiti per generare i documenti html 132sono considerati obbligatori, gli altri sono opzionali. 133 134Questo script ha i seguenti parametri: 135 136``--no-pdf`` 137 Disabilita i controlli per la generazione di PDF; 138 139``--no-virtualenv`` 140 Utilizza l'ambiente predefinito dal sistema operativo invece che 141 l'ambiente virtuale per Python; 142 143 144Generazione della documentazione Sphinx 145======================================= 146 147Per generare la documentazione in formato HTML o PDF si eseguono i rispettivi 148comandi ``make htmldocs`` o ``make pdfdocs``. Esistono anche altri formati 149in cui è possibile generare la documentazione; per maggiori informazioni 150potere eseguire il comando ``make help``. 151La documentazione così generata sarà disponibile nella sottocartella 152``Documentation/output``. 153 154Ovviamente, per generare la documentazione, Sphinx (``sphinx-build``) 155dev'essere installato. Se disponibile, il tema *Read the Docs* per Sphinx 156verrà utilizzato per ottenere una documentazione HTML più gradevole. 157Per la documentazione in formato PDF, invece, avrete bisogno di ``XeLaTeX` 158e di ``convert(1)`` disponibile in ImageMagick (https://www.imagemagick.org). 159Tipicamente, tutti questi pacchetti sono disponibili e pacchettizzati nelle 160distribuzioni Linux. 161 162Per poter passare ulteriori opzioni a Sphinx potete utilizzare la variabile 163make ``SPHINXOPTS``. Per esempio, se volete che Sphinx sia più verboso durante 164la generazione potete usare il seguente comando ``make SPHINXOPTS=-v htmldocs``. 165 166Potete eliminare la documentazione generata tramite il comando 167``make cleandocs``. 168 169Scrivere la documentazione 170========================== 171 172Aggiungere nuova documentazione è semplice: 173 1741. aggiungete un file ``.rst`` nella sottocartella ``Documentation`` 1752. aggiungete un riferimento ad esso nell'indice (`TOC tree`_) in 176 ``Documentation/index.rst``. 177 178.. _TOC tree: http://www.sphinx-doc.org/en/stable/markup/toctree.html 179 180Questo, di solito, è sufficiente per la documentazione più semplice (come 181quella che state leggendo ora), ma per una documentazione più elaborata è 182consigliato creare una sottocartella dedicata (o, quando possibile, utilizzarne 183una già esistente). Per esempio, il sottosistema grafico è documentato nella 184sottocartella ``Documentation/gpu``; questa documentazione è divisa in 185diversi file ``.rst`` ed un indice ``index.rst`` (con un ``toctree`` 186dedicato) a cui si fa riferimento nell'indice principale. 187 188Consultate la documentazione di `Sphinx`_ e `reStructuredText`_ per maggiori 189informazione circa le loro potenzialità. In particolare, il 190`manuale introduttivo a reStructuredText`_ di Sphinx è un buon punto da 191cui cominciare. Esistono, inoltre, anche alcuni 192`costruttori specifici per Sphinx`_. 193 194.. _`manuale introduttivo a reStructuredText`: http://www.sphinx-doc.org/en/stable/rest.html 195.. _`costruttori specifici per Sphinx`: http://www.sphinx-doc.org/en/stable/markup/index.html 196 197Guide linea per la documentazione del kernel 198-------------------------------------------- 199 200In questa sezione troverete alcune linee guida specifiche per la documentazione 201del kernel: 202 203* Non esagerate con i costrutti di reStructuredText. Mantenete la 204 documentazione semplice. La maggior parte della documentazione dovrebbe 205 essere testo semplice con una strutturazione minima che permetta la 206 conversione in diversi formati. 207 208* Mantenete la strutturazione il più fedele possibile all'originale quando 209 convertite un documento in formato reStructuredText. 210 211* Aggiornate i contenuti quando convertite della documentazione, non limitatevi 212 solo alla formattazione. 213 214* Mantenete la decorazione dei livelli di intestazione come segue: 215 216 1. ``=`` con una linea superiore per il titolo del documento:: 217 218 ====== 219 Titolo 220 ====== 221 222 2. ``=`` per i capitoli:: 223 224 Capitoli 225 ======== 226 227 3. ``-`` per le sezioni:: 228 229 Sezioni 230 ------- 231 232 4. ``~`` per le sottosezioni:: 233 234 Sottosezioni 235 ~~~~~~~~~~~~ 236 237 Sebbene RST non forzi alcun ordine specifico (*Piuttosto che imporre 238 un numero ed un ordine fisso di decorazioni, l'ordine utilizzato sarà 239 quello incontrato*), avere uniformità dei livelli principali rende più 240 semplice la lettura dei documenti. 241 242* Per inserire blocchi di testo con caratteri a dimensione fissa (codici di 243 esempio, casi d'uso, eccetera): utilizzate ``::`` quando non è necessario 244 evidenziare la sintassi, specialmente per piccoli frammenti; invece, 245 utilizzate ``.. code-block:: <language>`` per blocchi più lunghi che 246 beneficeranno della sintassi evidenziata. Per un breve pezzo di codice da 247 inserire nel testo, usate \`\`. 248 249 250Il dominio C 251------------ 252 253Il **Dominio Sphinx C** (denominato c) è adatto alla documentazione delle API C. 254Per esempio, un prototipo di una funzione: 255 256.. code-block:: rst 257 258 .. c:function:: int ioctl( int fd, int request ) 259 260Il dominio C per kernel-doc ha delle funzionalità aggiuntive. Per esempio, 261potete assegnare un nuovo nome di riferimento ad una funzione con un nome 262molto comune come ``open`` o ``ioctl``: 263 264.. code-block:: rst 265 266 .. c:function:: int ioctl( int fd, int request ) 267 :name: VIDIOC_LOG_STATUS 268 269Il nome della funzione (per esempio ioctl) rimane nel testo ma il nome del suo 270riferimento cambia da ``ioctl`` a ``VIDIOC_LOG_STATUS``. Anche la voce 271nell'indice cambia in ``VIDIOC_LOG_STATUS``. 272 273Notate che per una funzione non c'è bisogno di usare ``c:func:`` per generarne 274i riferimenti nella documentazione. Grazie a qualche magica estensione a 275Sphinx, il sistema di generazione della documentazione trasformerà 276automaticamente un riferimento ad una ``funzione()`` in un riferimento 277incrociato quando questa ha una voce nell'indice. Se trovate degli usi di 278``c:func:`` nella documentazione del kernel, sentitevi liberi di rimuoverli. 279 280 281Tabelle a liste 282--------------- 283 284Raccomandiamo l'uso delle tabelle in formato lista (*list table*). Le tabelle 285in formato lista sono liste di liste. In confronto all'ASCII-art potrebbero 286non apparire di facile lettura nei file in formato testo. Il loro vantaggio è 287che sono facili da creare o modificare e che la differenza di una modifica è 288molto più significativa perché limitata alle modifiche del contenuto. 289 290La ``flat-table`` è anch'essa una lista di liste simile alle ``list-table`` 291ma con delle funzionalità aggiuntive: 292 293* column-span: col ruolo ``cspan`` una cella può essere estesa attraverso 294 colonne successive 295 296* raw-span: col ruolo ``rspan`` una cella può essere estesa attraverso 297 righe successive 298 299* auto-span: la cella più a destra viene estesa verso destra per compensare 300 la mancanza di celle. Con l'opzione ``:fill-cells:`` questo comportamento 301 può essere cambiato da *auto-span* ad *auto-fill*, il quale inserisce 302 automaticamente celle (vuote) invece che estendere l'ultima. 303 304opzioni: 305 306* ``:header-rows:`` [int] conta le righe di intestazione 307* ``:stub-columns:`` [int] conta le colonne di stub 308* ``:widths:`` [[int] [int] ... ] larghezza delle colonne 309* ``:fill-cells:`` invece di estendere automaticamente una cella su quelle 310 mancanti, ne crea di vuote. 311 312ruoli: 313 314* ``:cspan:`` [int] colonne successive (*morecols*) 315* ``:rspan:`` [int] righe successive (*morerows*) 316 317L'esempio successivo mostra come usare questo marcatore. Il primo livello della 318nostra lista di liste è la *riga*. In una *riga* è possibile inserire solamente 319la lista di celle che compongono la *riga* stessa. Fanno eccezione i *commenti* 320( ``..`` ) ed i *collegamenti* (per esempio, un riferimento a 321``:ref:`last row <last row>``` / :ref:`last row <it last row>`) 322 323.. code-block:: rst 324 325 .. flat-table:: table title 326 :widths: 2 1 1 3 327 328 * - head col 1 329 - head col 2 330 - head col 3 331 - head col 4 332 333 * - column 1 334 - field 1.1 335 - field 1.2 with autospan 336 337 * - column 2 338 - field 2.1 339 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 340 341 * .. _`it last row`: 342 343 - column 3 344 345Che verrà rappresentata nel seguente modo: 346 347 .. flat-table:: table title 348 :widths: 2 1 1 3 349 350 * - head col 1 351 - head col 2 352 - head col 3 353 - head col 4 354 355 * - column 1 356 - field 1.1 357 - field 1.2 with autospan 358 359 * - column 2 360 - field 2.1 361 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 362 363 * .. _`it last row`: 364 365 - column 3 366 367.. _it_sphinx_kfigure: 368 369Figure ed immagini 370================== 371 372Se volete aggiungere un'immagine, utilizzate le direttive ``kernel-figure`` 373e ``kernel-image``. Per esempio, per inserire una figura di un'immagine in 374formato SVG:: 375 376 .. kernel-figure:: ../../../doc-guide/svg_image.svg 377 :alt: una semplice immagine SVG 378 379 Una semplice immagine SVG 380 381.. _it_svg_image_example: 382 383.. kernel-figure:: ../../../doc-guide/svg_image.svg 384 :alt: una semplice immagine SVG 385 386 Una semplice immagine SVG 387 388Le direttive del kernel per figure ed immagini supportano il formato **DOT**, 389per maggiori informazioni 390 391* DOT: http://graphviz.org/pdf/dotguide.pdf 392* Graphviz: http://www.graphviz.org/content/dot-language 393 394Un piccolo esempio (:ref:`it_hello_dot_file`):: 395 396 .. kernel-figure:: ../../../doc-guide/hello.dot 397 :alt: ciao mondo 398 399 Esempio DOT 400 401.. _it_hello_dot_file: 402 403.. kernel-figure:: ../../../doc-guide/hello.dot 404 :alt: ciao mondo 405 406 Esempio DOT 407 408Tramite la direttiva ``kernel-render`` è possibile aggiungere codice specifico; 409ad esempio nel formato **DOT** di Graphviz.:: 410 411 .. kernel-render:: DOT 412 :alt: foobar digraph 413 :caption: Codice **DOT** (Graphviz) integrato 414 415 digraph foo { 416 "bar" -> "baz"; 417 } 418 419La rappresentazione dipenderà dei programmi installati. Se avete Graphviz 420installato, vedrete un'immagine vettoriale. In caso contrario, il codice grezzo 421verrà rappresentato come *blocco testuale* (:ref:`it_hello_dot_render`). 422 423.. _it_hello_dot_render: 424 425.. kernel-render:: DOT 426 :alt: foobar digraph 427 :caption: Codice **DOT** (Graphviz) integrato 428 429 digraph foo { 430 "bar" -> "baz"; 431 } 432 433La direttiva *render* ha tutte le opzioni della direttiva *figure*, con 434l'aggiunta dell'opzione ``caption``. Se ``caption`` ha un valore allora 435un nodo *figure* viene aggiunto. Altrimenti verrà aggiunto un nodo *image*. 436L'opzione ``caption`` è necessaria in caso si vogliano aggiungere dei 437riferimenti (:ref:`it_hello_svg_render`). 438 439Per la scrittura di codice **SVG**:: 440 441 .. kernel-render:: SVG 442 :caption: Integrare codice **SVG** 443 :alt: so-nw-arrow 444 445 <?xml version="1.0" encoding="UTF-8"?> 446 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...> 447 ... 448 </svg> 449 450.. _it_hello_svg_render: 451 452.. kernel-render:: SVG 453 :caption: Integrare codice **SVG** 454 :alt: so-nw-arrow 455 456 <?xml version="1.0" encoding="UTF-8"?> 457 <svg xmlns="http://www.w3.org/2000/svg" 458 version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400"> 459 <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/> 460 <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/> 461 </svg> 462