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