doc:it_IT: align Italian documentation

Translation for the following patches

commit 0aa78b105f ("Documentation/changes: Raise minimum supported binutils version to 2.23")
commit 7d71788735 ("Documentation: include sign off for reverts")
commit 905705a8fd ("docs: programming-languages: refresh blurb on clang support")
commit 5ff4aa70bf ("docs: submitting-patches: use :doc: for references")
commit 030f066f67 ("docs: submitting-patches: describe preserving review/test tags")
commit 68e4cd17e2 ("docs: deprecated.rst: Add zero-length and one-element arrays")
commit 5429ef62bc ("compiler/gcc: Raise minimum GCC version for kernel builds to 4.8")
commit 5b5bbb8cc5 ("docs: process: Add an example for creating a fixes tag")
commit 858e684565 ("docs: dt: convert submitting-patches.txt to ReST format")
commit cca73e4946 ("docs: Correct the release date of 5.2 stable")
commit c170f2eb96 ("docs: Document cross-referencing between documentation pages")
commit 7c8b9e3000 ("kernel-doc: Update "cross-referencing from rST" section to use automarkup")
commit 27def953b6 ("docs: deprecated.rst: Expand str*cpy() replacement notes")
commit 17dca05023 ("docs: deprecated.rst: Update zero-length/one-element arrays section")
commit 3519c4d6e0 ("Documentation: add minimum clang/llvm version")
commit 0bddd227f3 ("Documentation: update for gcc 4.9 requirement")
commit 9f364b605f ("submitting-patches.rst: presume git will be used")
commit 4ebdf7be21 ("Documentation/maintainer: rehome sign-off process")
commit 7433ff33e8 ("Documentation/process: expand plain-text advice")
commit eb45fb2fb1 ("docs: process: Add cross-link to security-bugs")
commit bdc48fa11e ("checkpatch/coding-style: deprecate 80-column warning")
commit f67281a72b ("Documentation: process: step 2: Link to email list fixed")

Signed-off-by: Federico Vaga <federico.vaga@vaga.pv.it>
Link: https://lore.kernel.org/r/20201114083342.13935-1-federico.vaga@vaga.pv.it
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
Federico Vaga 2020-11-14 09:33:42 +01:00 committed by Jonathan Corbet
parent 992082d1dc
commit ac77114270
9 changed files with 293 additions and 260 deletions

View File

@ -419,26 +419,24 @@ del `dominio Sphinx per il C`_.
Riferimenti usando reStructuredText Riferimenti usando reStructuredText
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Per fare riferimento a funzioni e tipi di dato definiti nei commenti kernel-doc Nei documenti reStructuredText non serve alcuna sintassi speciale per
all'interno dei documenti reStructuredText, utilizzate i riferimenti dal fare riferimento a funzioni e tipi definiti nei commenti
`dominio Sphinx per il C`_. Per esempio:: kernel-doc. Sarà sufficiente terminare i nomi di funzione con ``()``,
e scrivere ``struct``, ``union``, ``enum``, o ``typedef`` prima di un
tipo. Per esempio::
See function :c:func:`foo` and struct/union/enum/typedef :c:type:`bar`. See foo()
See struct foo.
See union bar.
See enum baz.
See typedef meh.
Nonostante il riferimento ai tipi di dato funzioni col solo nome, Tuttavia, la personalizzazione dei collegamenti è possibile solo con
ovvero senza specificare struct/union/enum/typedef, potreste preferire il la seguente sintassi::
seguente::
See :c:type:`struct foo <foo>`. See :c:func:`my custom link text for function foo <foo>`.
See :c:type:`union bar <bar>`. See :c:type:`my custom link text for struct bar <bar>`.
See :c:type:`enum baz <baz>`.
See :c:type:`typedef meh <meh>`.
Questo produce dei collegamenti migliori, ed è in linea con il modo in cui
kernel-doc gestisce i riferimenti.
Per maggiori informazioni, siete pregati di consultare la documentazione
del `dominio Sphinx per il C`_.
Commenti per una documentazione generale Commenti per una documentazione generale
---------------------------------------- ----------------------------------------

View File

@ -364,6 +364,26 @@ Che verrà rappresentata nel seguente modo:
- column 3 - column 3
Riferimenti incrociati
----------------------
Per fare dei riferimenti incrociati da una pagina ad un'altra
specificando il percorso a partire dalla cartella *Documentation*.
Per esempio, se volete aggiungere un riferimento a questa pagina
(l'estensione .rst è opzionale)::
See Documentation/translations/it_IT/doc-guide/sphinx.rst.
Se preferite usare un percorso relative allora vi serve la direttiva
Sphinx ``doc``. Per esempio, se volete aggiungere un riferimento a
questa pagina dalla stessa cartella::
See :doc:`sphinx`.
Per maggiori informazioni su come aggiungere riferimenti incrociati a
commenti kernel-doc di funzioni o tipi, leggete
Documentation/translations/it_IT/doc-guide/sphinx.rst.
.. _it_sphinx_kfigure: .. _it_sphinx_kfigure:
Figure ed immagini Figure ed immagini

View File

@ -123,7 +123,7 @@ iniziale, i kernel ricevono aggiornamenti per più di un ciclo di sviluppo.
Quindi, per esempio, la storia del kernel 5.2 appare così (anno 2019): Quindi, per esempio, la storia del kernel 5.2 appare così (anno 2019):
============== =============================== ============== ===============================
15 settembre 5.2 rilascio stabile FIXME settembre è sbagliato 7 luglio 5.2 rilascio stabile
14 luglio 5.2.1 14 luglio 5.2.1
21 luglio 5.2.2 21 luglio 5.2.2
26 luglio 5.2.3 26 luglio 5.2.3
@ -434,7 +434,7 @@ l'elenco principale lo si trova sul sito:
http://vger.kernel.org/vger-lists.html http://vger.kernel.org/vger-lists.html
Esistono liste gestite altrove; un certo numero di queste sono in Esistono liste gestite altrove; un certo numero di queste sono in
lists.redhat.com. redhat.com/mailman/listinfo.
La lista di discussione principale per lo sviluppo del kernel è, ovviamente, La lista di discussione principale per lo sviluppo del kernel è, ovviamente,
linux-kernel. Questa lista è un luogo ostile dove trovarsi; i volumi possono linux-kernel. Questa lista è un luogo ostile dove trovarsi; i volumi possono

View File

@ -32,9 +32,10 @@ PC Card, per esempio, probabilmente non dovreste preoccuparvi di pcmciautils.
====================== ================= ======================================== ====================== ================= ========================================
Programma Versione minima Comando per verificare la versione Programma Versione minima Comando per verificare la versione
====================== ================= ======================================== ====================== ================= ========================================
GNU C 4.6 gcc --version GNU C 4.9 gcc --version
Clang/LLVM (optional) 10.0.1 clang --version
GNU make 3.81 make --version GNU make 3.81 make --version
binutils 2.21 ld -v binutils 2.23 ld -v
flex 2.5.35 flex --version flex 2.5.35 flex --version
bison 2.0 bison --version bison 2.0 bison --version
util-linux 2.10o fdformat --version util-linux 2.10o fdformat --version
@ -71,6 +72,16 @@ GCC
La versione necessaria di gcc potrebbe variare a seconda del tipo di CPU nel La versione necessaria di gcc potrebbe variare a seconda del tipo di CPU nel
vostro calcolatore. vostro calcolatore.
Clang/LLVM (opzionale)
----------------------
L'ultima versione di clang e *LLVM utils* (secondo `releases.llvm.org
<https://releases.llvm.org>`_) sono supportati per la generazione del
kernel. Non garantiamo che anche i rilasci più vecchi funzionino, inoltre
potremmo rimuovere gli espedienti che abbiamo implementato per farli
funzionare. Per maggiori informazioni
:ref:`Building Linux with Clang/LLVM <kbuild_llvm>`.
Make Make
---- ----
@ -79,7 +90,7 @@ Per compilare il kernel vi servirà GNU make 3.81 o successivo.
Binutils Binutils
-------- --------
Per generare il kernel è necessario avere Binutils 2.21 o superiore. Per generare il kernel è necessario avere Binutils 2.23 o superiore.
pkg-config pkg-config
---------- ----------
@ -338,6 +349,11 @@ gcc
- <ftp://ftp.gnu.org/gnu/gcc/> - <ftp://ftp.gnu.org/gnu/gcc/>
Clang/LLVM
----------
- :ref:`Getting LLVM <getting_llvm>`.
Make Make
---- ----

View File

@ -92,16 +92,22 @@ delle righe.
Lo stile del codice riguarda la leggibilità e la manutenibilità utilizzando Lo stile del codice riguarda la leggibilità e la manutenibilità utilizzando
strumenti comuni. strumenti comuni.
Il limite delle righe è di 80 colonne e questo e un limite fortemente Come limite di riga si preferiscono le 80 colonne.
desiderato.
Espressioni più lunghe di 80 colonne saranno spezzettate in pezzi più piccoli, Espressioni più lunghe di 80 colonne dovrebbero essere spezzettate in
a meno che eccedere le 80 colonne non aiuti ad aumentare la leggibilità senza pezzi più piccoli, a meno che eccedere le 80 colonne non aiuti ad
nascondere informazioni. I pezzi derivati sono sostanzialmente più corti degli aumentare la leggibilità senza nascondere informazioni.
originali e vengono posizionati più a destra. Lo stesso si applica, nei file
d'intestazione, alle funzioni con una lista di argomenti molto lunga. Tuttavia, I nuovi pezzi derivati sono sostanzialmente più corti degli originali
non spezzettate mai le stringhe visibili agli utenti come i messaggi di e vengono posizionati più a destra. Uno stile molto comune è quello di
printk, questo perché inibireste la possibilità d'utilizzare grep per cercarle. allineare i nuovi pezzi alla parentesi aperta di una funzione.
Lo stesso si applica, nei file d'intestazione, alle funzioni con una
lista di argomenti molto lunga.
Tuttavia, non spezzettate mai le stringhe visibili agli utenti come i
messaggi di printk, questo perché inibireste la possibilità
d'utilizzare grep per cercarle.
3) Posizionamento di parentesi graffe e spazi 3) Posizionamento di parentesi graffe e spazi
--------------------------------------------- ---------------------------------------------

View File

@ -95,6 +95,11 @@ Invece, usate la seguente funzione::
header = kzalloc(struct_size(header, item, count), GFP_KERNEL); header = kzalloc(struct_size(header, item, count), GFP_KERNEL);
.. note:: Se per caso state usando struct_size() su una struttura dati che
in coda contiene un array di lunghezza zero o uno, allora siete
invitati a riorganizzare il vostro codice usando il
`flexible array member <#zero-length-and-one-element-arrays>`_.
Per maggiori dettagli fate riferimento a array_size(), Per maggiori dettagli fate riferimento a array_size(),
array3_size(), e struct_size(), così come la famiglia di array3_size(), e struct_size(), così come la famiglia di
funzioni check_add_overflow() e check_mul_overflow(). funzioni check_add_overflow() e check_mul_overflow().
@ -116,7 +121,11 @@ di destinazione. Questo può portare ad un overflow oltre i limiti del
buffer e generare svariati tipi di malfunzionamenti. Nonostante l'opzione buffer e generare svariati tipi di malfunzionamenti. Nonostante l'opzione
`CONFIG_FORTIFY_SOURCE=y` e svariate opzioni del compilatore aiutano `CONFIG_FORTIFY_SOURCE=y` e svariate opzioni del compilatore aiutano
a ridurne il rischio, non c'è alcuna buona ragione per continuare ad usare a ridurne il rischio, non c'è alcuna buona ragione per continuare ad usare
questa funzione. La versione sicura da usare è strscpy(). questa funzione. La versione sicura da usare è strscpy(), tuttavia va
prestata attenzione a tutti quei casi dove viene usato il valore di
ritorno di strcpy(). La funzione strscpy() non ritorna un puntatore
alla destinazione, ma un contatore dei byte non NUL copiati (oppure
un errno negativo se la stringa è stata troncata).
strncpy() su stringe terminate con NUL strncpy() su stringe terminate con NUL
-------------------------------------- --------------------------------------
@ -127,8 +136,12 @@ causati, appunto, dalla mancanza del terminatore. Questa estende la
terminazione nel buffer di destinazione quando la stringa d'origine è più terminazione nel buffer di destinazione quando la stringa d'origine è più
corta; questo potrebbe portare ad una penalizzazione delle prestazioni per corta; questo potrebbe portare ad una penalizzazione delle prestazioni per
chi usa solo stringe terminate. La versione sicura da usare è chi usa solo stringe terminate. La versione sicura da usare è
strscpy(). (chi usa strscpy() e necessita di estendere la strscpy(), tuttavia va prestata attenzione a tutti quei casi dove
terminazione con NUL deve aggiungere una chiamata a memset()) viene usato il valore di ritorno di strncpy(). La funzione strscpy()
non ritorna un puntatore alla destinazione, ma un contatore dei byte
non NUL copiati (oppure un errno negativo se la stringa è stata
troncata). Tutti i casi che necessitano di estendere la
terminazione con NUL dovrebbero usare strscpy_pad().
Se il chiamate no usa stringhe terminate con NUL, allore strncpy() Se il chiamate no usa stringhe terminate con NUL, allore strncpy()
può continuare ad essere usata, ma i buffer di destinazione devono essere può continuare ad essere usata, ma i buffer di destinazione devono essere
@ -140,7 +153,10 @@ strlcpy()
La funzione strlcpy(), per prima cosa, legge interamente il buffer di La funzione strlcpy(), per prima cosa, legge interamente il buffer di
origine, magari leggendo più di quanto verrà effettivamente copiato. Questo origine, magari leggendo più di quanto verrà effettivamente copiato. Questo
è inefficiente e può portare a overflow di lettura quando la stringa non è è inefficiente e può portare a overflow di lettura quando la stringa non è
terminata con NUL. La versione sicura da usare è strscpy(). terminata con NUL. La versione sicura da usare è strscpy(), tuttavia
va prestata attenzione a tutti quei casi dove viene usato il valore di
ritorno di strlcpy(), dato che strscpy() ritorna un valore di errno
negativo quanto la stringa viene troncata.
Segnaposto %p nella stringa di formato Segnaposto %p nella stringa di formato
-------------------------------------- --------------------------------------
@ -227,3 +243,126 @@ modi:
* ``continue;`` * ``continue;``
* ``goto <label>;`` * ``goto <label>;``
* ``return [expression];`` * ``return [expression];``
Array di lunghezza zero o con un solo elemento
----------------------------------------------
All'interno del kernel ricorre spesso la necessita di avere membri
di dimensione variabile all'interno di una struttura dati. In questi
casi il codice del kernel dovrebbe usare sempre i `"flexible array
member" <https://en.wikipedia.org/wiki/Flexible_array_member>`_. La
tecnica degli array a lunghezza nulla o di un solo elemento non
dovrebbe essere più usata.
Nel codice C più vecchio, la dichiarazione di un membro di dimensione
variabile in coda ad una struttura dati veniva fatto dichiarando un
array di un solo elemento posizionato alla fine della struttura dati::
struct something {
size_t count;
struct foo items[1];
};
Questo ha portato ad un calcolo di sizeof() traballante (dovrebbe
rimuovere la dimensione del singolo elemento in coda per calcolare la
dimensione esatta dell' "intestazione"). Per evitare questi problemi è
stata introdotta un' `estensione a GNU C
<https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html>`_ che
permettesse la dichiarazione di array a lungezza zero::
struct something {
size_t count;
struct foo items[0];
};
Ma questo ha portato nuovi problemi, e non ha risolto alcuni dei
problemi che affliggono entrambe le tecniche: per esempio
l'impossibilità di riconoscere se un array di quel tipo viene usato
nel mezzo di una struttura dati e _non_ alla fine (potrebbe accadere
sia direttamente, sia indirettamente quando si usano le unioni o le
strutture di strutture).
Lo standard C99 introduce i "flexible array members". Questi array non
hanno una dimensione nella loro dichiarazione::
struct something {
size_t count;
struct foo items[];
};
Questo è il modo con cui ci si aspetta che vengano dichiarati gli
elementi di lunghezza variabile in coda alle strutture dati. Permette
al compilatore di produrre errori quando gli array flessibili non si
trovano alla fine della struttura dati, il che permette di prevenire
alcuni tipi di bachi dovuti a `comportamenti inaspettati
<https://git.kernel.org/linus/76497732932f15e7323dc805e8ea8dc11bb587cf>`_.
Inoltre, permette al compilatore di analizzare correttamente le
dimensioni degli array (attraverso sizeof(), `CONFIG_FORTIFY_SOURCE`,
e `CONFIG_UBSAN_BOUNDS`). Per esempio, non esiste alcun meccanismo in
grado di avvisarci che il seguente uso di sizeof() dia sempre come
zero come risultato::
struct something {
size_t count;
struct foo items[0];
};
struct something *instance;
instance = kmalloc(struct_size(instance, items, count), GFP_KERNEL);
instance->count = count;
size = sizeof(instance->items) * instance->count;
memcpy(instance->items, source, size);
Il valore di ``size`` nell'ultima riga sarà ``zero``, quando uno
invece si aspetterebbe che il suo valore sia la dimensione totale in
byte dell'allocazione dynamica che abbiamo appena fatto per l'array
``items``. Qui un paio di esempi reali del problema: `collegamento 1
<https://git.kernel.org/linus/f2cd32a443da694ac4e28fbf4ac6f9d5cc63a539>`_,
`collegamento 2
<https://git.kernel.org/linus/ab91c2a89f86be2898cee208d492816ec238b2cf>`_.
Invece, `i flexible array members hanno un tipo incompleto, e quindi
sizeof() non può essere applicato
<https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html>`_; dunque ogni
uso scorretto di questo operatore verrà identificato immediatamente
durante la compilazione.
Per quanto riguarda gli array di un solo elemento, bisogna essere
consapevoli che `questi array occupano almeno quanto lo spazio di un
singolo oggetti dello stesso tipo
<https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html>`_, e quindi
contribuiscono al calcolo della dimensione della struttura che li
contiene. In questo caso è facile commettere errori quando si vuole
calcolare la dimensione totale della memoria totale da allocare per
una struttura dati::
struct something {
size_t count;
struct foo items[1];
};
struct something *instance;
instance = kmalloc(struct_size(instance, items, count - 1), GFP_KERNEL);
instance->count = count;
size = sizeof(instance->items) * instance->count;
memcpy(instance->items, source, size);
In questo esempio ci siamo dovuti ricordare di usare ``count - 1`` in
struct_size(), altrimenti avremmo --inavvertitamente-- allocato
memoria per un oggetti ``items`` in più. Il modo più pulito e meno
propenso agli errori è quello di usare i `flexible array member`, in
combinazione con struct_size() e flex_array_size()::
struct something {
size_t count;
struct foo items[];
};
struct something *instance;
instance = kmalloc(struct_size(instance, items, count), GFP_KERNEL);
instance->count = count;
memcpy(instance->items, source, flex_array_size(instance, items, instance->count));

View File

@ -32,6 +32,11 @@ impostato come ``text/plain``. Tuttavia, generalmente gli allegati non sono
ben apprezzati perché rende più difficile citare porzioni di patch durante il ben apprezzati perché rende più difficile citare porzioni di patch durante il
processo di revisione. processo di revisione.
Inoltre, è vivamente raccomandato l'uso di puro testo nel corpo del
messaggio, sia per la patch che per qualsiasi altro messaggio. Il sito
https://useplaintext.email/ può esservi d'aiuto per configurare il
vostro programma di posta elettronica.
I programmi di posta elettronica che vengono usati per inviare le patch per il I programmi di posta elettronica che vengono usati per inviare le patch per il
kernel Linux dovrebbero inviarle senza alterazioni. Per esempio, non kernel Linux dovrebbero inviarle senza alterazioni. Per esempio, non
dovrebbero modificare o rimuovere tabulazioni o spazi, nemmeno all'inizio o dovrebbero modificare o rimuovere tabulazioni o spazi, nemmeno all'inizio o

View File

@ -11,13 +11,15 @@ Linguaggio di programmazione
Il kernel è scritto nel linguaggio di programmazione C [it-c-language]_. Il kernel è scritto nel linguaggio di programmazione C [it-c-language]_.
Più precisamente, il kernel viene compilato con ``gcc`` [it-gcc]_ usando Più precisamente, il kernel viene compilato con ``gcc`` [it-gcc]_ usando
l'opzione ``-std=gnu89`` [it-gcc-c-dialect-options]_: il dialetto GNU l'opzione ``-std=gnu89`` [it-gcc-c-dialect-options]_: il dialetto GNU
dello standard ISO C90 (con l'aggiunta di alcune funzionalità da C99) dello standard ISO C90 (con l'aggiunta di alcune funzionalità da C99).
Linux supporta anche ``clang`` [it-clang]_, leggete la documentazione
:ref:`Building Linux with Clang/LLVM <kbuild_llvm>`.
Questo dialetto contiene diverse estensioni al linguaggio [it-gnu-extensions]_, Questo dialetto contiene diverse estensioni al linguaggio [it-gnu-extensions]_,
e molte di queste vengono usate sistematicamente dal kernel. e molte di queste vengono usate sistematicamente dal kernel.
Il kernel offre un certo livello di supporto per la compilazione con ``clang`` Il kernel offre un certo livello di supporto per la compilazione con
[it-clang]_ e ``icc`` [it-icc]_ su diverse architetture, tuttavia in questo momento ``icc`` [it-icc]_ su diverse architetture, tuttavia in questo momento
il supporto non è completo e richiede delle patch aggiuntive. il supporto non è completo e richiede delle patch aggiuntive.
Attributi Attributi

View File

@ -16,21 +16,19 @@ vostre patch accettate.
Questo documento contiene un vasto numero di suggerimenti concisi. Per Questo documento contiene un vasto numero di suggerimenti concisi. Per
maggiori dettagli su come funziona il processo di sviluppo del kernel leggete maggiori dettagli su come funziona il processo di sviluppo del kernel leggete
:ref:`Documentation/translations/it_IT/process <it_development_process_main>`. :doc:`development-process`.
Leggete anche :ref:`Documentation/translations/it_IT/process/submit-checklist.rst <it_submitchecklist>` Leggete anche :doc:`submit-checklist` per una lista di punti da
per una lista di punti da verificare prima di inviare del codice. Se state verificare prima di inviare del codice. Se state inviando un driver,
inviando un driver, allora leggete anche :ref:`Documentation/translations/it_IT/process/submitting-drivers.rst <it_submittingdrivers>`; allora leggete anche :doc:`submitting-drivers`; per delle patch
per delle patch relative alle associazioni per Device Tree leggete relative alle associazioni per Device Tree leggete
Documentation/devicetree/bindings/submitting-patches.rst. :doc:`submitting-patches`.
Molti di questi passi descrivono il comportamento di base del sistema di Questa documentazione assume che sappiate usare ``git`` per preparare le patch.
controllo di versione ``git``; se utilizzate ``git`` per preparare le vostre Se non siete pratici di ``git``, allora è bene che lo impariate;
patch molto del lavoro più ripetitivo lo troverete già fatto per voi, tuttavia renderà la vostra vita di sviluppatore del kernel molto più semplice.
dovete preparare e documentare un certo numero di patch. Generalmente, l'uso
di ``git`` renderà la vostra vita di sviluppatore del kernel più facile.
0) Ottenere i sorgenti attuali Ottenere i sorgenti attuali
------------------------------ ---------------------------
Se non avete un repositorio coi sorgenti del kernel più recenti, allora usate Se non avete un repositorio coi sorgenti del kernel più recenti, allora usate
``git`` per ottenerli. Vorrete iniziare col repositorio principale che può ``git`` per ottenerli. Vorrete iniziare col repositorio principale che può
@ -45,69 +43,10 @@ Guardate l'elemento **T:** per un determinato sottosistema nel file MAINTANERS
che troverete nei sorgenti, o semplicemente chiedete al manutentore nel caso che troverete nei sorgenti, o semplicemente chiedete al manutentore nel caso
in cui i sorgenti da usare non siano elencati il quel file. in cui i sorgenti da usare non siano elencati il quel file.
Esiste ancora la possibilità di scaricare un rilascio del kernel come archivio
tar (come descritto in una delle prossime sezioni), ma questa è la via più
complicata per sviluppare per il kernel.
1) ``diff -up``
---------------
Se dovete produrre le vostre patch a mano, usate ``diff -up`` o ``diff -uprN``
per crearle. Git produce di base le patch in questo formato; se state
usando ``git``, potete saltare interamente questa sezione.
Tutte le modifiche al kernel Linux avvengono mediate patch, come descritte
in :manpage:`diff(1)`. Quando create la vostra patch, assicuratevi di
crearla nel formato "unified diff", come l'argomento ``-u`` di
:manpage:`diff(1)`.
Inoltre, per favore usate l'argomento ``-p`` per mostrare la funzione C
alla quale si riferiscono le diverse modifiche - questo rende il risultato
di ``diff`` molto più facile da leggere. Le patch dovrebbero essere basate
sulla radice dei sorgenti del kernel, e non sulle sue sottocartelle.
Per creare una patch per un singolo file, spesso è sufficiente fare::
SRCTREE=linux
MYFILE=drivers/net/mydriver.c
cd $SRCTREE
cp $MYFILE $MYFILE.orig
vi $MYFILE # make your change
cd ..
diff -up $SRCTREE/$MYFILE{.orig,} > /tmp/patch
Per creare una patch per molteplici file, dovreste spacchettare i sorgenti
"vergini", o comunque non modificati, e fare un ``diff`` coi vostri.
Per esempio::
MYSRC=/devel/linux
tar xvfz linux-3.19.tar.gz
mv linux-3.19 linux-3.19-vanilla
diff -uprN -X linux-3.19-vanilla/Documentation/dontdiff \
linux-3.19-vanilla $MYSRC > /tmp/patch
``dontdiff`` è una lista di file che sono generati durante il processo di
compilazione del kernel; questi dovrebbero essere ignorati in qualsiasi
patch generata con :manpage:`diff(1)`.
Assicuratevi che la vostra patch non includa file che non ne fanno veramente
parte. Al fine di verificarne la correttezza, assicuratevi anche di
revisionare la vostra patch -dopo- averla generata con :manpage:`diff(1)`.
Se le vostre modifiche producono molte differenze, allora dovrete dividerle
in patch indipendenti che modificano le cose in passi logici; leggete
:ref:`split_changes`. Questo faciliterà la revisione da parte degli altri
sviluppatori, il che è molto importante se volete che la patch venga accettata.
Se state utilizzando ``git``, ``git rebase -i`` può aiutarvi nel procedimento.
Se non usate ``git``, un'alternativa popolare è ``quilt``
<http://savannah.nongnu.org/projects/quilt>.
.. _it_describe_changes: .. _it_describe_changes:
2) Descrivete le vostre modifiche Descrivete le vostre modifiche
--------------------------------- ------------------------------
Descrivete il vostro problema. Esiste sempre un problema che via ha spinto Descrivete il vostro problema. Esiste sempre un problema che via ha spinto
ha fare il vostro lavoro, che sia la correzione di un baco da una riga o una ha fare il vostro lavoro, che sia la correzione di un baco da una riga o una
@ -208,10 +147,15 @@ precedente::
[pretty] [pretty]
fixes = Fixes: %h (\"%s\") fixes = Fixes: %h (\"%s\")
Un esempio::
$ git log -1 --pretty=fixes 54a4f0239f2e
Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed")
.. _it_split_changes: .. _it_split_changes:
3) Separate le vostre modifiche Separate le vostre modifiche
------------------------------- ----------------------------
Separate ogni **cambiamento logico** in patch distinte. Separate ogni **cambiamento logico** in patch distinte.
@ -312,7 +256,8 @@ sfruttato, inviatela a security@kernel.org. Per bachi importanti, un breve
embargo potrebbe essere preso in considerazione per dare il tempo alle embargo potrebbe essere preso in considerazione per dare il tempo alle
distribuzioni di prendere la patch e renderla disponibile ai loro utenti; distribuzioni di prendere la patch e renderla disponibile ai loro utenti;
in questo caso, ovviamente, la patch non dovrebbe essere inviata su alcuna in questo caso, ovviamente, la patch non dovrebbe essere inviata su alcuna
lista di discussione pubblica. lista di discussione pubblica. Leggete anche
:doc:`/admin-guide/security-bugs`.
Patch che correggono bachi importanti su un kernel già rilasciato, dovrebbero Patch che correggono bachi importanti su un kernel già rilasciato, dovrebbero
essere inviate ai manutentori dei kernel stabili aggiungendo la seguente riga:: essere inviate ai manutentori dei kernel stabili aggiungendo la seguente riga::
@ -354,8 +299,8 @@ Le patch banali devono rientrare in una delle seguenti categorie:
"patch monkey" in modalità ritrasmissione) "patch monkey" in modalità ritrasmissione)
6) Niente: MIME, links, compressione, allegati. Solo puro testo Niente: MIME, links, compressione, allegati. Solo puro testo
---------------------------------------------------------------- -------------------------------------------------------------
Linus e gli altri sviluppatori del kernel devono poter commentare Linus e gli altri sviluppatori del kernel devono poter commentare
le modifiche che sottomettete. Per uno sviluppatore è importante le modifiche che sottomettete. Per uno sviluppatore è importante
@ -364,7 +309,11 @@ programmi di posta elettronica, cosicché sia possibile commentare
una porzione specifica del vostro codice. una porzione specifica del vostro codice.
Per questa ragione tutte le patch devono essere inviate via e-mail Per questa ragione tutte le patch devono essere inviate via e-mail
come testo. come testo. Il modo più facile, e quello raccomandato, è con ``git
send-email``. Al sito https://git-send-email.io è disponibile una
guida interattiva sull'uso di ``git send-email``.
Se decidete di non usare ``git send-email``:
.. warning:: .. warning::
@ -381,28 +330,20 @@ così la possibilità che il vostro allegato-MIME venga accettato.
Eccezione: se il vostro servizio di posta storpia le patch, allora qualcuno Eccezione: se il vostro servizio di posta storpia le patch, allora qualcuno
potrebbe chiedervi di rinviarle come allegato MIME. potrebbe chiedervi di rinviarle come allegato MIME.
Leggete :ref:`Documentation/translations/it_IT/process/email-clients.rst <it_email_clients>` Leggete :doc:`/translations/it_IT/process/email-clients`
per dei suggerimenti sulla configurazione del programmi di posta elettronica per dei suggerimenti sulla configurazione del programmi di posta elettronica
per l'invio di patch intatte. per l'invio di patch intatte.
7) Dimensione delle e-mail Rispondere ai commenti di revisione
-------------------------- -----------------------------------
Le grosse modifiche non sono adatte ad una lista di discussione, e nemmeno In risposta alla vostra email, quasi certamente i revisori vi
per alcuni manutentori. Se la vostra patch, non compressa, eccede i 300 kB invieranno dei commenti su come migliorare la vostra patch. Dovete
di spazio, allora caricatela in una spazio accessibile su internet fornendo rispondere a questi commenti; ignorare i revisori è un ottimo modo per
l'URL (collegamento) ad essa. Ma notate che se la vostra patch eccede i 300 kB essere ignorati. Riscontri o domande che non conducono ad una
è quasi certo che necessiti comunque di essere spezzettata. modifica del codice quasi certamente dovrebbero portare ad un commento
nel changelog cosicché il prossimo revisore potrà meglio comprendere
8) Rispondere ai commenti di revisione cosa stia accadendo.
--------------------------------------
Quasi certamente i revisori vi invieranno dei commenti su come migliorare
la vostra patch. Dovete rispondere a questi commenti; ignorare i revisori
è un ottimo modo per essere ignorati. Riscontri o domande che non conducono
ad una modifica del codice quasi certamente dovrebbero portare ad un commento
nel changelog cosicché il prossimo revisore potrà meglio comprendere cosa stia
accadendo.
Assicuratevi di dire ai revisori quali cambiamenti state facendo e di Assicuratevi di dire ai revisori quali cambiamenti state facendo e di
ringraziarli per il loro tempo. Revisionare codice è un lavoro faticoso e che ringraziarli per il loro tempo. Revisionare codice è un lavoro faticoso e che
@ -410,8 +351,12 @@ richiede molto tempo, e a volte i revisori diventano burberi. Tuttavia, anche
in questo caso, rispondete con educazione e concentratevi sul problema che in questo caso, rispondete con educazione e concentratevi sul problema che
hanno evidenziato. hanno evidenziato.
9) Non scoraggiatevi - o impazientitevi Leggete :doc:`/translations/it_IT/process/email-clients` per
--------------------------------------- le raccomandazioni sui programmi di posta elettronica e l'etichetta da usare
sulle liste di discussione.
Non scoraggiatevi - o impazientitevi
------------------------------------
Dopo che avete inviato le vostre modifiche, siate pazienti e aspettate. Dopo che avete inviato le vostre modifiche, siate pazienti e aspettate.
I revisori sono persone occupate e potrebbero non ricevere la vostra patch I revisori sono persone occupate e potrebbero non ricevere la vostra patch
@ -424,17 +369,19 @@ aver inviato le patch correttamente. Aspettate almeno una settimana prima di
rinviare le modifiche o sollecitare i revisori - probabilmente anche di più rinviare le modifiche o sollecitare i revisori - probabilmente anche di più
durante la finestra d'integrazione. durante la finestra d'integrazione.
10) Aggiungete PATCH nell'oggetto Aggiungete PATCH nell'oggetto
--------------------------------- -----------------------------
Dato l'alto volume di e-mail per Linus, e la lista linux-kernel, è prassi Dato l'alto volume di e-mail per Linus, e la lista linux-kernel, è prassi
prefiggere il vostro oggetto con [PATCH]. Questo permette a Linus e agli prefiggere il vostro oggetto con [PATCH]. Questo permette a Linus e agli
altri sviluppatori del kernel di distinguere facilmente le patch dalle altre altri sviluppatori del kernel di distinguere facilmente le patch dalle altre
discussioni. discussioni.
``git send-email`` lo fa automaticamente.
11) Firmate il vostro lavoro - Il certificato d'origine dello sviluppatore
-------------------------------------------------------------------------- Firmate il vostro lavoro - Il certificato d'origine dello sviluppatore
----------------------------------------------------------------------
Per migliorare la tracciabilità su "chi ha fatto cosa", specialmente per Per migliorare la tracciabilità su "chi ha fatto cosa", specialmente per
quelle patch che per raggiungere lo stadio finale passano attraverso quelle patch che per raggiungere lo stadio finale passano attraverso
@ -477,65 +424,17 @@ poi dovete solo aggiungere una riga che dice::
Signed-off-by: Random J Developer <random@developer.example.org> Signed-off-by: Random J Developer <random@developer.example.org>
usando il vostro vero nome (spiacenti, non si accettano pseudonimi o usando il vostro vero nome (spiacenti, non si accettano pseudonimi o
contributi anonimi). contributi anonimi). Questo verrà fatto automaticamente se usate
``git commit -s``. Anche il ripristino di uno stato precedente dovrebbe
includere "Signed-off-by", se usate ``git revert -s`` questo verrà
fatto automaticamente.
Alcune persone aggiungono delle etichette alla fine. Per ora queste verranno Alcune persone aggiungono delle etichette alla fine. Per ora queste verranno
ignorate, ma potete farlo per meglio identificare procedure aziendali interne o ignorate, ma potete farlo per meglio identificare procedure aziendali interne o
per aggiungere dettagli circa la firma. per aggiungere dettagli circa la firma.
Se siete un manutentore di un sottosistema o di un ramo, qualche volta dovrete Quando utilizzare Acked-by:, Cc:, e Co-developed-by:
modificare leggermente le patch che avete ricevuto al fine di poterle ----------------------------------------------------
integrare; questo perché il codice non è esattamente lo stesso nei vostri
sorgenti e in quelli dei vostri contributori. Se rispettate rigidamente la
regola (c), dovreste chiedere al mittente di rifare la patch, ma questo è
controproducente e una totale perdita di tempo ed energia. La regola (b)
vi permette di correggere il codice, ma poi diventa davvero maleducato cambiare
la patch di qualcuno e addossargli la responsabilità per i vostri bachi.
Per risolvere questo problema dovreste aggiungere una riga, fra l'ultimo
Signed-off-by e il vostro, che spiega la vostra modifica. Nonostante non ci
sia nulla di obbligatorio, un modo efficace è quello di indicare il vostro
nome o indirizzo email fra parentesi quadre, seguito da una breve descrizione;
questo renderà abbastanza visibile chi è responsabile per le modifiche
dell'ultimo minuto. Per esempio::
Signed-off-by: Random J Developer <random@developer.example.org>
[lucky@maintainer.example.org: struct foo moved from foo.c to foo.h]
Signed-off-by: Lucky K Maintainer <lucky@maintainer.example.org>
Questa pratica è particolarmente utile se siete i manutentori di un ramo
stabile ma al contempo volete dare credito agli autori, tracciare e integrare
le modifiche, e proteggere i mittenti dalle lamentele. Notate che in nessuna
circostanza è permessa la modifica dell'identità dell'autore (l'intestazione
From), dato che è quella che appare nei changelog.
Un appunto speciale per chi porta il codice su vecchie versioni. Sembra che
sia comune l'utile pratica di inserire un'indicazione circa l'origine della
patch all'inizio del messaggio di commit (appena dopo la riga dell'oggetto)
al fine di migliorare la tracciabilità. Per esempio, questo è quello che si
vede nel rilascio stabile 3.x-stable::
Date: Tue Oct 7 07:26:38 2014 -0400
libata: Un-break ATA blacklist
commit 1c40279960bcd7d52dbdf1d466b20d24b99176c8 upstream.
E qui quello che potrebbe vedersi su un kernel più vecchio dove la patch è
stata applicata::
Date: Tue May 13 22:12:27 2008 +0200
wireless, airo: waitbusy() won't delay
[backport of 2.6 commit b7acbdfbd1f277c1eb23f344f899cfa4cd0bf36a]
Qualunque sia il formato, questa informazione fornisce un importante aiuto
alle persone che vogliono seguire i vostri sorgenti, e quelle che cercano
dei bachi.
12) Quando utilizzare Acked-by:, Cc:, e Co-developed-by:
--------------------------------------------------------
L'etichetta Signed-off-by: indica che il firmatario è stato coinvolto nello L'etichetta Signed-off-by: indica che il firmatario è stato coinvolto nello
sviluppo della patch, o che era nel suo percorso di consegna. sviluppo della patch, o che era nel suo percorso di consegna.
@ -604,8 +503,8 @@ Esempio di una patch sottomessa dall'autore Co-developed-by:::
Co-developed-by: Submitting Co-Author <sub@coauthor.example.org> Co-developed-by: Submitting Co-Author <sub@coauthor.example.org>
Signed-off-by: Submitting Co-Author <sub@coauthor.example.org> Signed-off-by: Submitting Co-Author <sub@coauthor.example.org>
13) Utilizzare Reported-by:, Tested-by:, Reviewed-by:, Suggested-by: e Fixes: Utilizzare Reported-by:, Tested-by:, Reviewed-by:, Suggested-by: e Fixes:
----------------------------------------------------------------------------- -------------------------------------------------------------------------
L'etichetta Reported-by da credito alle persone che trovano e riportano i bachi L'etichetta Reported-by da credito alle persone che trovano e riportano i bachi
e si spera che questo possa ispirarli ad aiutarci nuovamente in futuro. e si spera che questo possa ispirarli ad aiutarci nuovamente in futuro.
@ -654,6 +553,13 @@ revisori conosciuti per la loro conoscenza sulla materia in oggetto e per la
loro serietà nella revisione, accrescerà le probabilità che la vostra patch loro serietà nella revisione, accrescerà le probabilità che la vostra patch
venga integrate nel kernel. venga integrate nel kernel.
Quando si riceve una email sulla lista di discussione da un tester o
un revisore, le etichette Tested-by o Reviewd-by devono essere
aggiunte dall'autore quando invierà nuovamente la patch. Tuttavia, se
la patch è cambiata in modo significativo, queste etichette potrebbero
non avere più senso e quindi andrebbero rimosse. Solitamente si tiene traccia
della rimozione nel changelog della patch (subito dopo il separatore '---').
L'etichetta Suggested-by: indica che l'idea della patch è stata suggerita L'etichetta Suggested-by: indica che l'idea della patch è stata suggerita
dalla persona nominata e le da credito. Tenete a mente che questa etichetta dalla persona nominata e le da credito. Tenete a mente che questa etichetta
non dovrebbe essere aggiunta senza un permesso esplicito, specialmente se non dovrebbe essere aggiunta senza un permesso esplicito, specialmente se
@ -669,8 +575,8 @@ Questo è il modo suggerito per indicare che un baco è stato corretto nella
patch. Per maggiori dettagli leggete :ref:`it_describe_changes` patch. Per maggiori dettagli leggete :ref:`it_describe_changes`
14) Il formato canonico delle patch Il formato canonico delle patch
----------------------------------- -------------------------------
Questa sezione descrive il formato che dovrebbe essere usato per le patch. Questa sezione descrive il formato che dovrebbe essere usato per le patch.
Notate che se state usando un repositorio ``git`` per salvare le vostre patch Notate che se state usando un repositorio ``git`` per salvare le vostre patch
@ -788,8 +694,8 @@ Maggiori dettagli sul formato delle patch nei riferimenti qui di seguito.
.. _it_explicit_in_reply_to: .. _it_explicit_in_reply_to:
15) Usare esplicitamente In-Reply-To nell'intestazione Usare esplicitamente In-Reply-To nell'intestazione
------------------------------------------------------ --------------------------------------------------
Aggiungere manualmente In-Reply-To: nell'intestazione dell'e-mail Aggiungere manualmente In-Reply-To: nell'intestazione dell'e-mail
potrebbe essere d'aiuto per associare una patch ad una discussione potrebbe essere d'aiuto per associare una patch ad una discussione
@ -802,65 +708,6 @@ giungla di riferimenti all'interno dei programmi di posta. Se un collegamento
ad una versione precedente di una serie di patch (per esempio, potete usarlo ad una versione precedente di una serie di patch (per esempio, potete usarlo
per l'email introduttiva alla serie). per l'email introduttiva alla serie).
16) Inviare richieste ``git pull``
----------------------------------
Se avete una serie di patch, potrebbe essere più conveniente per un manutentore
tirarle dentro al repositorio del sottosistema attraverso l'operazione
``git pull``. Comunque, tenete presente che prendere patch da uno sviluppatore
in questo modo richiede un livello di fiducia più alto rispetto a prenderle da
una lista di discussione. Di conseguenza, molti manutentori sono riluttanti
ad accettare richieste di *pull*, specialmente dagli sviluppatori nuovi e
quindi sconosciuti. Se siete in dubbio, potete fare una richiesta di *pull*
come messaggio introduttivo ad una normale pubblicazione di patch, così
il manutentore avrà la possibilità di scegliere come integrarle.
Una richiesta di *pull* dovrebbe avere nell'oggetto [GIT] o [PULL].
La richiesta stessa dovrebbe includere il nome del repositorio e quello del
ramo su una singola riga; dovrebbe essere più o meno così::
Please pull from
git://jdelvare.pck.nerim.net/jdelvare-2.6 i2c-for-linus
to get these changes:
Una richiesta di *pull* dovrebbe includere anche un messaggio generico
che dica cos'è incluso, una lista delle patch usando ``git shortlog``, e una
panoramica sugli effetti della serie di patch con ``diffstat``. Il modo più
semplice per ottenere tutte queste informazioni è, ovviamente, quello di
lasciar fare tutto a ``git`` con il comando ``git request-pull``.
Alcuni manutentori (incluso Linus) vogliono vedere le richieste di *pull*
da commit firmati con GPG; questo fornisce una maggiore garanzia sul fatto
che siate stati proprio voi a fare la richiesta. In assenza di tale etichetta
firmata Linus, in particolare, non prenderà alcuna patch da siti pubblici come
GitHub.
Il primo passo verso la creazione di questa etichetta firmata è quello di
creare una chiave GNUPG ed averla fatta firmare da uno o più sviluppatori
principali del kernel. Questo potrebbe essere difficile per i nuovi
sviluppatori, ma non ci sono altre vie. Andare alle conferenze potrebbe
essere un buon modo per trovare sviluppatori che possano firmare la vostra
chiave.
Una volta che avete preparato la vostra serie di patch in ``git``, e volete che
qualcuno le prenda, create una etichetta firmata col comando ``git tag -s``.
Questo creerà una nuova etichetta che identifica l'ultimo commit della serie
contenente una firma creata con la vostra chiave privata. Avrete anche
l'opportunità di aggiungere un messaggio di changelog all'etichetta; questo è
il posto ideale per descrivere gli effetti della richiesta di *pull*.
Se i sorgenti da cui il manutentore prenderà le patch non sono gli stessi del
repositorio su cui state lavorando, allora non dimenticatevi di caricare
l'etichetta firmata anche sui sorgenti pubblici.
Quando generate una richiesta di *pull*, usate l'etichetta firmata come
obiettivo. Un comando come il seguente farà il suo dovere::
git request-pull master git://my.public.tree/linux.git my-signed-tag
Riferimenti Riferimenti
----------- -----------