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