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