View Single Post
Old 03-04-2011, 15:13   #2561
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Anch'io preferisco i sorgenti Gentoo soprattutto perché il processo di aggiornamento è meno manuale (non devi tener controllato kernel.org e scaricare, patchare, scompattare).
Sono ottimi anche perchè gli aggiornamenti arrivano velocemente.
Non ho ancora avuto la necessità di controllare il contenuto delle patch Gentoo (ho avuto modo di spulciare le Ubuntu e non ho trovato niente di eccezionale).

Per l'installazione anch'io copiavo manualmente i file, da tempo uso make install (che crea automaticamente un backup .old se il kernel è già installato). Inoltre tengo al minimo una versione precedente sicuramente funzionante.
Codice:
mount /boot ; make && make install && make modules_install
Al momento sto utilizzando sys-kernel/pf-sources (sfruttando praticamente il solo bfs di Con Kolivas), per un periodo ho utilizzato le sys-kernel/ck-sources che però non sono più aggiornate da qualche tempo.

Le patch non sono niente di particolare: sono file di testo che descrivono le differenze tra due versioni di file.

Descrizione del contenuto di una piccola patch nel formato più comune (ceata con diff -u)
Codice:
--- a/drivers/gpu/drm/drm_edid.c        2011-03-17 14:50:06.834535038 +0100
+++ b/drivers/gpu/drm/drm_edid.c        2011-03-17 14:51:22.237586782 +0100
@@ -344,8 +344,13 @@
 {
        struct edid *edid = NULL;
 
-       if (drm_probe_ddc(adapter))
-               edid = (struct edid *)drm_do_get_edid(connector, adapter);
+       do {
+               if (drm_probe_ddc(adapter))
+                       edid = (struct edid *)drm_do_get_edid(connector, adapter);
+       } while ( edid == NULL && ++tries < 20 );
+       if (tries > 0 && tries < 20)
+               dev_warn(connector->dev->dev, "%s: drm_do_get_edid() succeed after %u tries.\n",
+                       drm_get_connector_name(connector), tries);
 
        connector->display_info.raw_edid = (char *)edid;
  • Le prime due righe contengono i nomi dei file coinvolti con relative date di modifica.
    Codice:
    --- a/drivers/gpu/drm/drm_edid.c        2011-03-17 14:50:06.834535038 +0100
    +++ b/drivers/gpu/drm/drm_edid.c        2011-03-17 14:51:22.237586782 +0100
    I tre segni + e - ad inizio riga associano il file alle differenze.
  • La riga succesiva, che solitamente inizia con @@, contiene le coordinate del blocco (chunk) nei due file:
    Codice:
    @@ -344,8 +344,13 @@
    • il segno evidenzia le righe a cui è relativo
    • il primo numero indica la riga del file associato al segno dove inizia il blocco
    • il secondo numero indica per quante righe si estende il blocco in quel file
  • In una patch fatta con opzioni per mostrare il contesto (diff -u, di solito), saranno solitamente presenti tre righe che contengono testo non modificato, che permettono di farsi un'idea sul punto di applicazione senza andare a cercare nel file.
    Codice:
     {
            struct edid *edid = NULL;
  • A seguito del contesto si avranno le differenze:
    Codice:
    -       if (drm_probe_ddc(adapter))
    -               edid = (struct edid *)drm_do_get_edid(connector, adapter);
    +       do {
    +               if (drm_probe_ddc(adapter))
    +                       edid = (struct edid *)drm_do_get_edid(connector, adapter);
    +       } while ( edid == NULL && ++tries < 20 );
    +       if (tries > 0 && tries < 20)
    +               dev_warn(connector->dev->dev, "%s: drm_do_get_edid() succeed after %u tries.\n",
    +                       drm_get_connector_name(connector), tries);
    • le righe che iniziano con - saranno rimosse
    • quelle che iniziano con + saranno aggiunte
  • Per finire si avranno altre tre righe non modificate per capire il contesto.
    Codice:
     
            connector->display_info.raw_edid = (char *)edid;

A seguito del primo blocco/chunk potrebbero essercene N altri, individuabili dalla riga @@ con le loro coordinate.

È anche possibile che siano presenti differenze relative a più file: in questo caso, terminati i chunk di un file, ci saranno le due nuove righe indicanti i file coinvolti e le relative date, seguide dai chunk.

Diff, Patch, and Friends
Applying Patches To The Linux Kernel

Per creare le patch si possono utilizzare vari strumenti, molto spesso (in assenza di strumenti che gestiscono le versioni) si usa diff
Per applicare una patch si usa patch
Per applicare una patch al contrario (cioè per rimuoverla) si usa patch -R

Codice:
diff -u a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > patch_drm_edid.patch
patch -d linux-2.6.38-rc8-git3 -p1 < patch_drm_edid.patch
patch -R -d linux-2.6.38-rc8-git3 -p1 < patch_drm_edid.patch
Per le opzioni vedere il man (servono essenzialmente per applicare la patch all'interno della cartella desiderata saltando la cartella con il nome dato dal creatore della patch).
Come si può vedere si va di redirezione (> e <).

Se l'applicazione delle differenze di uno o più chunk di un file non va a buon fine viene creato un file .rej contenente i chunk "rigettati".
Queste differenze non applicate avranno un aspetto simile ad un file patch standard.
Questo avviene perché il file su cui si stanno cercando di applicare le modifiche è cambiato: sarà quindi necessario cercare di applicare le modifiche manualmente, se possibile.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso