Come possono pacchetti diversi avere un codice sorgente identico?

Recentemente ho imparato quanto sia facile ottenere il codice sorgente di qualsiasi pacchetto usando apt-get source in modo da poter ottenere il codice sorgente, fare dei cambiamenti e installare la mia versione modificata di qualsiasi pacchetto. Questo è fantastico!

Fino ad oggi davo per scontato che ogni pacchetto avesse il proprio codice sorgente, e che pacchetti diversi avessero un codice sorgente diverso.

Tuttavia, ora ho appena scoperto che diversi pacchetti possono avere un codice sorgente identico. Ecco un esempio di questo:

I seguenti 4 pacchetti sembrano avere un codice sorgente identico:

gir1.2-mutter-4
libmutter-4-0
mutter
mutter-common

Tutti e quattro sono installati sul mio computer Ubuntu 19.04. Facendo apt-get source gir1.2-mutter-4 dà esattamente lo stesso risultato di apt-get source libmutter-4-0, e anche per i pacchetti mutter e mutter-common.

Ecco come ho controllato:

mkdir a
cd a
apt-get source gir1.2-mutter-4
cd ..
mkdir b
cd b
apt-get source libmutter-4-0
cd ..
diff -r a b

Il diff ricorsivo sull'ultima linea sopra non dà alcun output, mostrando che le directory hanno contenuti identici.

Ora la mia domanda: **Come possono pacchetti diversi avere codice sorgente identico?

Assumendo che questo sia voluto e non un qualche tipo di errore, qual è la differenza tra i pacchetti e come posso vedere questa differenza?

Potrebbe essere che i pacchetti siano diversi nel modo in cui il codice sorgente è configurato e compilato, per esempio parti diverse del codice sono incluse nei diversi pacchetti? Se è così, dove posso trovare informazioni su come configurare ogni pacchetto?

Modifica: ho dimenticato di aggiungere che se vuoi testare questo, per far funzionare correttamente apt-get source potresti prima aver bisogno di abilitarlo usando software-properties-gtk come descritto qui: https://askubuntu.com/a/857433/874649

Modifica 2: grazie per le eccellenti risposte! Ho anche trovato questo utile https://askubuntu.com/a/246721/874649 -- sui comandi apt-get build-dep e dpkg-buildpackage che sono molto utili. Dopo aver modificato il codice sorgente di un pacchetto sorgente, dpkg-buildpackage -us -uc può essere usato per costruire nuovi file .deb che possono essere usati per installare il programma modificato.

Soluzione

Stai confondendo i pacchetti binari compilati con il sottostante codice sorgente/pacchetto da cui i pacchetti sono stati compilati.

I pacchetti a cui ti riferisci sono tutti costruiti dallo stesso codice sorgente/pacchetto, mutter. Puoi trovarlo facilmente andando su packages.ubuntu.com, cercando il pacchetto che stai cercando, e poi fare riferimento al "Pacchetto sorgente" a cui si riferisce. Che in questo caso è mutter:

Da lì, però, possiamo controllare la Launchpad page for Mutter's source package e vedere che costruisce una moltitudine di pacchetti binari (codice sorgente compilato, ecc. per l'installazione):

Queste descrizioni descrivono ciò che ogni pacchetto contiene/installa. Concentrandosi sui 4 pacchetti che hai indicato, e usando queste descrizioni:

  • gir1.2-mutter-4 - dati di introspezione GObject per Mutter (usati da gir e GObject come librerie/dati per l'interazione tra Mutter e GObject)
  • libmutter-4-0 - La libreria sottostante per il gestore di finestre Mutter. (Usata per lo sviluppo di plugin, lo sviluppo e la compilazione delle integrazioni di Mutter, ecc. di solito)
  • mutter - l'attuale gestore di finestre di Mutter che usa la libreria di gestione delle finestre di GNOME (che è il motivo per cui GObject è necessario)
  • mutter-common - File condivisi per Mutter - di solito opzioni di configurazione predefinite o elementi che sono comuni a tutti i pacchetti costruiti dal pacchetto sorgente.

Quello che stai vedendo nella tua lista dei pacchetti sono i pacchetti costruiti che hanno origine dallo stesso codice sorgente - ogni pacchetto è diversi elementi che vengono installati dopo la compilazione e sono usati in modo diverso per cose diverse. Puoi vedere cosa c'è nei pacchetti stessi scaricando i singoli pacchetti e poi accedendovi con p7zip o con il Gestore degli Archivi integrato in Ubuntu e vedere le differenze di ciò che ogni pacchetto contiene in questo modo. Detto questo, provengono tutti dallo stesso codice sorgente - contengono solo elementi diversi che vengono installati nel sistema.

Commentari (3)

I pacchetti sorgente e i pacchetti binari esistono separatamente. Ogni pacchetto sorgente può avere più pacchetti binari associati ad esso. Questo per dire che più di un pacchetto binario può essere costruito dallo stesso pacchetto sorgente.

Uno dei modi comuni in cui questo accade è che si ha un programma, una libreria che il programma usa per fare molto del suo lavoro, e i file header usati per compilarlo e altri programmi (forse futuri) che usano quella libreria. Sono tutti sviluppati e mantenuti nello stesso albero dei sorgenti, che viene usato, con o senza patch Debian o Ubuntu, per generare un pacchetto sorgente. Poi quel pacchetto sorgente è usato per costruire pacchetti binari separati per il programma, la libreria e gli header.

Questo è ciò che avete qui (con alcuni altri pacchetti binari). Hai specificato diversi pacchetti binari nel tuo comando apt source, ma il comando sta scaricando e scompattando lo stesso pacchetto sorgente.

Questo accade perché, quando si passa il nome di un pacchetto a apt source ma non esiste un pacchetto sorgente con quel nome, esso lo tratta come il nome di un pacchetto binario e presume che si voglia il pacchetto sorgente corrispondente.


Su la pagina principale di Ubuntu su Launchpad, è possibile cercare i pacchetti. Launchpad mostra informazioni sui pacchetti sorgente (mentre Ubuntu Packages Search mostra informazioni sui pacchetti binari). Se cercate per mutter, allora come ha detto Thomas Ward troverete la pagina di Launchpad per il pacchetto sorgente mutter in Ubuntu. Questo è un buon modo per vedere quali pacchetti binari corrispondono ad un pacchetto sorgente. Vicino alla parte superiore di quella pagina, c'è scritto:

pacchetto mutter in Ubuntu

gir1.2-mutter-4: dati di introspezione GObject per Mutter libmutter-4-0: libreria per il window manager di Mutter libmutter-4-0-dbgsym: Nessun riassunto disponibile per libmutter-4-0-dbgsym in ubuntu eoan.
libmutter-4-dev: file di sviluppo per il window manager Mutter mutter: Esempio di window manager che usa la libreria window manager di GNOME's mutter-common: file condivisi per il gestore di finestre Mutter mutter-dbgsym: simboli di debug per mutter

Anche quando un pacchetto binario non ha lo stesso nome del pacchetto sorgente da cui è costruito, di solito si può trovare quel pacchetto sorgente cercando su Launchpad il pacchetto binario.

Spesso puoi sapere qual è la relazione tra un pacchetto binario e il pacchetto sorgente usato per costruirlo controllando il nome del pacchetto binario:

  • I nomi dei pacchetti binari che iniziano con lib di solito forniscono librerie di codice che possono essere usate da più programmi (inclusi quelli futuri).

  • Quelli che finiscono in -dev forniscono file header, che facilitano la compilazione del codice sorgente che usa le librerie.

  • Quelli che finiscono in -dbg o -dbgsym forniscono simboli di debug (quindi anche se libmutter-4-0-dbgsym non mostra attualmente un sommario, sappiamo che è un pacchetto di simboli di debug).

  • Quelli che finiscono in -common tendono a fornire file, spesso file di dati, che risiedono in /usr/share. Tali file sono a volte effettivamente codice, solo in forma statica e dichiarativa, ma possono anche fornire traduzioni di interfacce in linguaggi naturali (cioè umani). Non ci sono davvero molte limitazioni su ciò che può andare in un tale pacchetto.

    Per mutter, il pacchetto binario -common (nelle versioni recenti) contiene schemi, legami di chiavi e documentazione. Un vantaggio dei pacchetti -common è che, poiché non contengono tipicamente alcun codice macchina nativo, lo stesso file di pacchetto è solitamente applicabile a tutte le architetture. (In senso stretto, questo è l'unico requisito chiave per i file messi in /usr/share.

Commentari (0)

Prendete i seguenti ingredienti:

  • Cipolle
  • Pomodori
  • Pane
  • Olive

Si può fare un solo piatto con questi? No. Quello che si mangia alla fine dipende dalla ricetta.

Ogni pacchetto contiene una ricetta. Dice al computer cosa fare con gli ingredienti per produrre il piatto o i piatti richiesti.

È ragionevole e normale che alcuni pacchetti condividano una lista di ingredienti. Naturalmente, in questo contesto, ci si aspetta che ciò avvenga in pratica solo quando tali pacchetti provengono dallo stesso progetto.

Commentari (2)