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