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 * - row 1 334 - field 1.1 335 - field 1.2 with autospan 336 337 * - row 2 338 - field 2.1 339 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 340 341 * .. _`it last row`: 342 343 - row 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 * - row 1 356 - field 1.1 357 - field 1.2 with autospan 358 359 * - row 2 360 - field 2.1 361 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 362 363 * .. _`it last row`: 364 365 - row 3 366 367Riferimenti incrociati 368---------------------- 369 370Aggiungere un riferimento incrociato da una pagina della 371documentazione ad un'altra può essere fatto scrivendo il percorso al 372file corrispondende, non serve alcuna sintassi speciale. Si possono 373usare sia percorsi assoluti che relativi. Quelli assoluti iniziano con 374"documentation/". Per esempio, potete fare riferimento a questo 375documento in uno dei seguenti modi (da notare che l'estensione 376``.rst`` è necessaria):: 377 378 Vedere Documentation/doc-guide/sphinx.rst. Questo funziona sempre 379 Guardate pshinx.rst, che si trova nella stessa cartella. 380 Leggete ../sphinx.rst, che si trova nella cartella precedente. 381 382Se volete che il collegamento abbia un testo diverso rispetto al 383titolo del documento, allora dovrete usare la direttiva Sphinx 384``doc``. Per esempio:: 385 386 Vedere :doc:`il mio testo per il collegamento <sphinx>`. 387 388Nella maggioranza dei casi si consiglia il primo metodo perché è più 389pulito ed adatto a chi legge dai sorgenti. Se incontrare un ``:doc:`` 390che non da alcun valore, sentitevi liberi di convertirlo in un 391percorso al documento. 392 393Per informazioni riguardo ai riferimenti incrociati ai commenti 394kernel-doc per funzioni o tipi, consultate 395 396.. _it_sphinx_kfigure: 397 398Figure ed immagini 399================== 400 401Se volete aggiungere un'immagine, utilizzate le direttive ``kernel-figure`` 402e ``kernel-image``. Per esempio, per inserire una figura di un'immagine in 403formato SVG (:ref:`it_svg_image_example`):: 404 405 .. kernel-figure:: ../../../doc-guide/svg_image.svg 406 :alt: una semplice immagine SVG 407 408 Una semplice immagine SVG 409 410.. _it_svg_image_example: 411 412.. kernel-figure:: ../../../doc-guide/svg_image.svg 413 :alt: una semplice immagine SVG 414 415 Una semplice immagine SVG 416 417Le direttive del kernel per figure ed immagini supportano il formato **DOT**, 418per maggiori informazioni 419 420* DOT: http://graphviz.org/pdf/dotguide.pdf 421* Graphviz: http://www.graphviz.org/content/dot-language 422 423Un piccolo esempio (:ref:`it_hello_dot_file`):: 424 425 .. kernel-figure:: ../../../doc-guide/hello.dot 426 :alt: ciao mondo 427 428 Esempio DOT 429 430.. _it_hello_dot_file: 431 432.. kernel-figure:: ../../../doc-guide/hello.dot 433 :alt: ciao mondo 434 435 Esempio DOT 436 437Tramite la direttiva ``kernel-render`` è possibile aggiungere codice specifico; 438ad esempio nel formato **DOT** di Graphviz.:: 439 440 .. kernel-render:: DOT 441 :alt: foobar digraph 442 :caption: Codice **DOT** (Graphviz) integrato 443 444 digraph foo { 445 "bar" -> "baz"; 446 } 447 448La rappresentazione dipenderà dei programmi installati. Se avete Graphviz 449installato, vedrete un'immagine vettoriale. In caso contrario, il codice grezzo 450verrà rappresentato come *blocco testuale* (:ref:`it_hello_dot_render`). 451 452.. _it_hello_dot_render: 453 454.. kernel-render:: DOT 455 :alt: foobar digraph 456 :caption: Codice **DOT** (Graphviz) integrato 457 458 digraph foo { 459 "bar" -> "baz"; 460 } 461 462La direttiva *render* ha tutte le opzioni della direttiva *figure*, con 463l'aggiunta dell'opzione ``caption``. Se ``caption`` ha un valore allora 464un nodo *figure* viene aggiunto. Altrimenti verrà aggiunto un nodo *image*. 465L'opzione ``caption`` è necessaria in caso si vogliano aggiungere dei 466riferimenti (:ref:`it_hello_svg_render`). 467 468Per la scrittura di codice **SVG**:: 469 470 .. kernel-render:: SVG 471 :caption: Integrare codice **SVG** 472 :alt: so-nw-arrow 473 474 <?xml version="1.0" encoding="UTF-8"?> 475 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...> 476 ... 477 </svg> 478 479.. _it_hello_svg_render: 480 481.. kernel-render:: SVG 482 :caption: Integrare codice **SVG** 483 :alt: so-nw-arrow 484 485 <?xml version="1.0" encoding="UTF-8"?> 486 <svg xmlns="http://www.w3.org/2000/svg" 487 version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400"> 488 <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/> 489 <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/> 490 </svg> 491