Posts Tagged ipkg

ipkg, uClinux, circular dependencies

Per una piattaforma embedded su cui sto lavorando, sto cercando di far funzionare ipkg. Ipkg è un gestore di pacchetti per sistemi linux embedded molto simile a dpkg, tanto che è in grado di installare normali pacchetti debian e fornisce anche funzionalità simili a apt-get. Per intenderci è possibile costruire repository di pacchetti ipkg, così come si farebbe con i deb, e utilizzare ipkg per installarli da rete, risolvendo le dipendenze:

ipkg update
ipkg install pacchetto

Farlo funzionare su uClinux non era facile e ci sono riuscito solo grazie alla patch per busybox.

Grazie a questa patch, ipkg diventa un comando fornito da busybox. Questa versione, nel mio caso, funziona benissimo, tranne il fatto che non è in grado di gestire le dipendenze circolari. Cioè se ho un pacchetto A, che dipende da B, che dipende da A, ipkg falliva l’installazione, perché tentava di installare A, poi B, poi di nuovo A ma non trovava più i file di A che nel frattempo erano stati rimossi.

Personalmente ho risolto patchando la funzione ipkg_install_pkg quando durante l’installazione del pacchetto vengono verificate e installate le dipendenze, se il pacchetto stesso risulta già in stato UNPACKED all’uscita della funzione, significa che non devo installarlo più, visto che l’ha già fatto un pacchetto precedente.

if (conf->nodeps == 0) {
        err = satisfy_dependencies_for(conf, pkg);
        ipkg_message(conf, IPKG_DEBUG,
                            "  ipkg_install_pkg: calling satisfy_dependencies_for for %s, err: %i.\n",
                            pkg->name, err);
        /* paci: this is necessary to resolve circular dependencies */
        if (pkg->state_status == SS_UNPACKED) {
                ipkg_message(conf, IPKG_DEBUG2,
                               "  ipkg_install_pkg: pkg is already unpacked!!!\n");
                return 0;
        }
        if (err) { return err; }
}

,

No Comments