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
6Introduzione
7============
8
9Il kernel Linux usa `Sphinx`_ per la generazione della documentazione a partire
10dai file `reStructuredText`_ che si trovano nella cartella ``Documentation``.
11Per generare la documentazione in HTML o PDF, usate comandi ``make htmldocs`` o
12``make pdfdocs``. La documentazione così generata sarà disponibile nella
13cartella ``Documentation/output``.
14
15.. _Sphinx: http://www.sphinx-doc.org/
16.. _reStructuredText: http://docutils.sourceforge.net/rst.html
17
18I file reStructuredText possono contenere delle direttive che permettono di
19includere i commenti di documentazione, o di tipo kernel-doc, dai file
20sorgenti.
21Solitamente questi commenti sono utilizzati per descrivere le funzioni, i tipi
22e l'architettura del codice. I commenti di tipo kernel-doc hanno una struttura
23e formato speciale, ma a parte questo vengono processati come reStructuredText.
24
25Inoltre, ci sono migliaia di altri documenti in formato testo sparsi nella
26cartella ``Documentation``. Alcuni di questi verranno probabilmente convertiti,
27nel tempo, in formato reStructuredText, ma la maggior parte di questi rimarranno
28in formato testo.
29
30.. _it_sphinx_install:
31
32Installazione Sphinx
33====================
34
35I marcatori ReST utilizzati nei file in Documentation/ sono pensati per essere
36processati da ``Sphinx`` nella versione 1.3 o superiore. Se desiderate produrre
37un documento PDF è raccomandato l'utilizzo di una versione superiore alle 1.4.6.
38
39Esiste uno script che verifica i requisiti Sphinx. Per ulteriori dettagli
40consultate :ref:`it_sphinx-pre-install`.
41
42La maggior parte delle distribuzioni Linux forniscono Sphinx, ma l'insieme dei
43programmi e librerie è fragile e non è raro che dopo un aggiornamento di
44Sphinx, o qualche altro pacchetto Python, la documentazione non venga più
45generata correttamente.
46
47Un modo per evitare questo genere di problemi è quello di utilizzare una
48versione diversa da quella fornita dalla vostra distribuzione. Per fare questo,
49vi raccomandiamo di installare Sphinx dentro ad un ambiente virtuale usando
50``virtualenv-3`` o ``virtualenv`` a seconda di come Python 3 è stato
51pacchettizzato dalla vostra distribuzione.
52
53.. note::
54
55   #) Le versioni di Sphinx inferiori alla 1.5 non funzionano bene
56      con il pacchetto Python docutils versione 0.13.1 o superiore.
57      Se volete usare queste versioni, allora dovere eseguire
58      ``pip install 'docutils==0.12'``.
59
60   #) Viene raccomandato l'uso del tema RTD per la documentazione in HTML.
61      A seconda della versione di Sphinx, potrebbe essere necessaria
62      l'installazione tramite il comando ``pip install sphinx_rtd_theme``.
63
64   #) Alcune pagine ReST contengono delle formule matematiche. A causa del
65      modo in cui Sphinx funziona, queste espressioni sono scritte
66      utilizzando LaTeX. Per una corretta interpretazione, è necessario aver
67      installato texlive con i pacchetti amdfonts e amsmath.
68
69Riassumendo, se volete installare la versione 1.4.9 di Sphinx dovete eseguire::
70
71       $ virtualenv sphinx_1.4
72       $ . sphinx_1.4/bin/activate
73       (sphinx_1.4) $ pip install -r Documentation/sphinx/requirements.txt
74
75Dopo aver eseguito ``. sphinx_1.4/bin/activate``, il prompt cambierà per
76indicare che state usando il nuovo ambiente. Se aprite un nuova sessione,
77prima di generare la documentazione, dovrete rieseguire questo comando per
78rientrare nell'ambiente virtuale.
79
80Generazione d'immagini
81----------------------
82
83Il meccanismo che genera la documentazione del kernel contiene un'estensione
84capace di gestire immagini in formato Graphviz e SVG (per maggior informazioni
85vedere :ref:`it_sphinx_kfigure`).
86
87Per far si che questo funzioni, dovete installare entrambe i pacchetti
88Graphviz e ImageMagick. Il sistema di generazione della documentazione è in
89grado di procedere anche se questi pacchetti non sono installati, ma il
90risultato, ovviamente, non includerà le immagini.
91
92Generazione in PDF e LaTeX
93--------------------------
94
95Al momento, la generazione di questi documenti è supportata solo dalle
96versioni di Sphinx superiori alla 1.4.
97
98Per la generazione di PDF e LaTeX, avrete bisogno anche del pacchetto
99``XeLaTeX`` nella versione 3.14159265
100
101Per alcune distribuzioni Linux potrebbe essere necessario installare
102anche una serie di pacchetti ``texlive`` in modo da fornire il supporto
103minimo per il funzionamento di ``XeLaTeX``.
104
105.. _it_sphinx-pre-install:
106
107Verificare le dipendenze Sphinx
108-------------------------------
109
110Esiste uno script che permette di verificare automaticamente le dipendenze di
111Sphinx. Se lo script riesce a riconoscere la vostra distribuzione, allora
112sarà in grado di darvi dei suggerimenti su come procedere per completare
113l'installazione::
114
115	$ ./scripts/sphinx-pre-install
116	Checking if the needed tools for Fedora release 26 (Twenty Six) are available
117	Warning: better to also install "texlive-luatex85".
118	You should run:
119
120		sudo dnf install -y texlive-luatex85
121		/usr/bin/virtualenv sphinx_1.4
122		. sphinx_1.4/bin/activate
123		pip install -r Documentation/sphinx/requirements.txt
124
125	Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468.
126
127L'impostazione predefinita prevede il controllo dei requisiti per la generazione
128di documenti html e PDF, includendo anche il supporto per le immagini, le
129espressioni matematiche e LaTeX; inoltre, presume che venga utilizzato un
130ambiente virtuale per Python. I requisiti per generare i documenti html
131sono considerati obbligatori, gli altri sono opzionali.
132
133Questo script ha i seguenti parametri:
134
135``--no-pdf``
136	Disabilita i controlli per la generazione di PDF;
137
138``--no-virtualenv``
139	Utilizza l'ambiente predefinito dal sistema operativo invece che
140	l'ambiente virtuale per Python;
141
142
143Generazione della documentazione Sphinx
144=======================================
145
146Per generare la documentazione in formato HTML o PDF si eseguono i rispettivi
147comandi ``make htmldocs`` o ``make pdfdocs``. Esistono anche altri formati
148in cui è possibile generare la documentazione; per maggiori informazioni
149potere eseguire il comando ``make help``.
150La documentazione così generata sarà disponibile nella sottocartella
151``Documentation/output``.
152
153Ovviamente, per generare la documentazione, Sphinx (``sphinx-build``)
154dev'essere installato. Se disponibile, il tema *Read the Docs* per Sphinx
155verrà utilizzato per ottenere una documentazione HTML più gradevole.
156Per la documentazione in formato PDF, invece, avrete bisogno di ``XeLaTeX`
157e di ``convert(1)`` disponibile in ImageMagick (https://www.imagemagick.org).
158Tipicamente, tutti questi pacchetti sono disponibili e pacchettizzati nelle
159distribuzioni Linux.
160
161Per poter passare ulteriori opzioni a Sphinx potete utilizzare la variabile
162make ``SPHINXOPTS``. Per esempio, se volete che Sphinx sia più verboso durante
163la generazione potete usare il seguente comando ``make SPHINXOPTS=-v htmldocs``.
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 di più lunghi che
245  potranno beneficiare dell'avere la sintassi evidenziata.
246
247
248Il dominio C
249------------
250
251Il **Dominio Sphinx C** (denominato c) è adatto alla documentazione delle API C.
252Per esempio, un prototipo di una funzione:
253
254.. code-block:: rst
255
256    .. c:function:: int ioctl( int fd, int request )
257
258Il dominio C per kernel-doc ha delle funzionalità aggiuntive. Per esempio,
259potete assegnare un nuovo nome di riferimento ad una funzione con un nome
260molto comune come ``open`` o ``ioctl``:
261
262.. code-block:: rst
263
264     .. c:function:: int ioctl( int fd, int request )
265        :name: VIDIOC_LOG_STATUS
266
267Il nome della funzione (per esempio ioctl) rimane nel testo ma il nome del suo
268riferimento cambia da ``ioctl`` a ``VIDIOC_LOG_STATUS``. Anche la voce
269nell'indice cambia in ``VIDIOC_LOG_STATUS`` e si potrà quindi fare riferimento
270a questa funzione scrivendo:
271
272.. code-block:: rst
273
274     :c:func:`VIDIOC_LOG_STATUS`
275
276
277Tabelle a liste
278---------------
279
280Raccomandiamo l'uso delle tabelle in formato lista (*list table*). Le tabelle
281in formato lista sono liste di liste. In confronto all'ASCII-art potrebbero
282non apparire di facile lettura nei file in formato testo. Il loro vantaggio è
283che sono facili da creare o modificare e che la differenza di una modifica è
284molto più significativa perché limitata alle modifiche del contenuto.
285
286La ``flat-table`` è anch'essa una lista di liste simile alle ``list-table``
287ma con delle funzionalità aggiuntive:
288
289* column-span: col ruolo ``cspan`` una cella può essere estesa attraverso
290  colonne successive
291
292* raw-span: col ruolo ``rspan`` una cella può essere estesa attraverso
293  righe successive
294
295* auto-span: la cella più a destra viene estesa verso destra per compensare
296  la mancanza di celle. Con l'opzione ``:fill-cells:`` questo comportamento
297  può essere cambiato da *auto-span* ad *auto-fill*, il quale inserisce
298  automaticamente celle (vuote) invece che estendere l'ultima.
299
300opzioni:
301
302* ``:header-rows:``   [int] conta le righe di intestazione
303* ``:stub-columns:``  [int] conta le colonne di stub
304* ``:widths:``        [[int] [int] ... ] larghezza delle colonne
305* ``:fill-cells:``    invece di estendere automaticamente una cella su quelle
306  mancanti, ne crea di vuote.
307
308ruoli:
309
310* ``:cspan:`` [int] colonne successive (*morecols*)
311* ``:rspan:`` [int] righe successive (*morerows*)
312
313L'esempio successivo mostra come usare questo marcatore. Il primo livello della
314nostra lista di liste è la *riga*. In una *riga* è possibile inserire solamente
315la lista di celle che compongono la *riga* stessa. Fanno eccezione i *commenti*
316( ``..`` ) ed i *collegamenti* (per esempio, un riferimento a
317``:ref:`last row <last row>``` / :ref:`last row <it last row>`)
318
319.. code-block:: rst
320
321   .. flat-table:: table title
322      :widths: 2 1 1 3
323
324      * - head col 1
325        - head col 2
326        - head col 3
327        - head col 4
328
329      * - column 1
330        - field 1.1
331        - field 1.2 with autospan
332
333      * - column 2
334        - field 2.1
335        - :rspan:`1` :cspan:`1` field 2.2 - 3.3
336
337      * .. _`it last row`:
338
339        - column 3
340
341Che verrà rappresentata nel seguente modo:
342
343   .. flat-table:: table title
344      :widths: 2 1 1 3
345
346      * - head col 1
347        - head col 2
348        - head col 3
349        - head col 4
350
351      * - column 1
352        - field 1.1
353        - field 1.2 with autospan
354
355      * - column 2
356        - field 2.1
357        - :rspan:`1` :cspan:`1` field 2.2 - 3.3
358
359      * .. _`it last row`:
360
361        - column 3
362
363.. _it_sphinx_kfigure:
364
365Figure ed immagini
366==================
367
368Se volete aggiungere un'immagine, utilizzate le direttive ``kernel-figure``
369e ``kernel-image``. Per esempio, per inserire una figura di un'immagine in
370formato SVG::
371
372    .. kernel-figure::  ../../../doc-guide/svg_image.svg
373       :alt:    una semplice immagine SVG
374
375       Una semplice immagine SVG
376
377.. _it_svg_image_example:
378
379.. kernel-figure::  ../../../doc-guide/svg_image.svg
380   :alt:    una semplice immagine SVG
381
382   Una semplice immagine SVG
383
384Le direttive del kernel per figure ed immagini supportano il formato **DOT**,
385per maggiori informazioni
386
387* DOT: http://graphviz.org/pdf/dotguide.pdf
388* Graphviz: http://www.graphviz.org/content/dot-language
389
390Un piccolo esempio (:ref:`it_hello_dot_file`)::
391
392  .. kernel-figure::  ../../../doc-guide/hello.dot
393     :alt:    ciao mondo
394
395     Esempio DOT
396
397.. _it_hello_dot_file:
398
399.. kernel-figure::  ../../../doc-guide/hello.dot
400   :alt:    ciao mondo
401
402   Esempio DOT
403
404Tramite la direttiva ``kernel-render`` è possibile aggiungere codice specifico;
405ad esempio nel formato **DOT** di Graphviz.::
406
407  .. kernel-render:: DOT
408     :alt: foobar digraph
409     :caption: Codice **DOT** (Graphviz) integrato
410
411     digraph foo {
412      "bar" -> "baz";
413     }
414
415La rappresentazione dipenderà dei programmi installati. Se avete Graphviz
416installato, vedrete un'immagine vettoriale. In caso contrario, il codice grezzo
417verrà rappresentato come *blocco testuale* (:ref:`it_hello_dot_render`).
418
419.. _it_hello_dot_render:
420
421.. kernel-render:: DOT
422   :alt: foobar digraph
423   :caption: Codice **DOT** (Graphviz) integrato
424
425   digraph foo {
426      "bar" -> "baz";
427   }
428
429La direttiva *render* ha tutte le opzioni della direttiva *figure*, con
430l'aggiunta dell'opzione ``caption``. Se ``caption`` ha un valore allora
431un nodo *figure* viene aggiunto. Altrimenti verrà aggiunto un nodo *image*.
432L'opzione ``caption`` è necessaria in caso si vogliano aggiungere dei
433riferimenti (:ref:`it_hello_svg_render`).
434
435Per la scrittura di codice **SVG**::
436
437  .. kernel-render:: SVG
438     :caption: Integrare codice **SVG**
439     :alt: so-nw-arrow
440
441     <?xml version="1.0" encoding="UTF-8"?>
442     <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...>
443        ...
444     </svg>
445
446.. _it_hello_svg_render:
447
448.. kernel-render:: SVG
449   :caption: Integrare codice **SVG**
450   :alt: so-nw-arrow
451
452   <?xml version="1.0" encoding="UTF-8"?>
453   <svg xmlns="http://www.w3.org/2000/svg"
454     version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400">
455   <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
456   <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
457   </svg>
458