Gentoo Logo

Dipendenze Automagic, cosa sono e come risolverle

Indice:

1.  Introduzione

Cosa sono le dipendenze automagic

Le così dette dipendenze "automagic" sono dipendenze insite in un software, riconosciute all'atto della compilazione o durante l'esecuzione, che cambiano il modo in cui tale software opera. Il nome automagic è un gioco di parole riferito all'uso degli GNU autotools, che stanno dietro a molti dei casi di dipendenze automagic.

Il software normalmente possiede due tipi di dipendenze: obbligatorie e opzionali. Il primo tipo di dipendenze sono necessarie per l'utilizzo del software stesso (potrebbero rappresentare una libreria o un programma), e non possono mancare nel sistema quando si compila o esegue il programma (dipende se sono dipendenze di compilazione o di esecuzione). Le dipendenze opzionali sono tali da poter essere disabilitate, normalmente al momento della compilazione (ma talvolta anche durante l'esecuzione).

Le dipendenze opzionali vengono solitamente abilitate o disabilitate dall'utente (o dal compilatore), un esempio classico è portato dalle opzioni --enable-foo o --with-bar durante la chiamata di ./configure (questi parametri sono usati per abilitare dipendenze che sono disabilitate in modo predefinito, ma in alcuni casi potrebbero essere invece abilitate in modo predefinito e si avrà quindi --disable-foo e --without-bar).

Ma con sistemi di compilazione che provano a capire cosa è presente o meno nel sistema in cui operano, talvolta le dipendenze diventano automagic. Questo significa che il sistema di compilazione non fornisce al compilatore un modo per decidere se una data opzione deve o meno essere abilitata, pertanto viene aggiunta, ma attivata solo quando viene trovata. Questo è un comportamento sbagliato.

Perchè le dipendenze automagic sono sbagliate

Nel caso di distribuzione basate su binari, come quelle che si appoggiano su RPM o DEB, le dipendenze automagic non influiscono minimamente: se l'utente ha installato qualcosa e lo ha creato da solo, è solitamente ciò che vuole abilitare, mentre se è un manutentore, dovrà solamente aggiungere una dipendenza fra i pacchetti richiesti per eseguire il binario che ha creato.

Diverso il discorso per le distribuzioni basate su sorgenti, come Gentoo Linux (e varianti). Dal momento che la distribuzione basata su sorgenti non può distinguere utente e mantenitore del pacchetto, il sistema di compilazione potrebbe trovare più cose di quelle necessarie all'utente stesso, e proverà a collegare il software a tutto ciò che conosce a riguardo. Questa è la causa principale della rottura dei collegamenti dei binari alle librerie a seguito di una pulizia delle dipendenze inutilizzate (depclean).

Per semplificare, quando una dipendenza automagic non è indicata come obbligatoria in un ebuild, ma piuttosto possiede un flag che semplicemente aggiunge o rimuove le dipendenze su un dato pacchetto, se il pacchetto è presente nel sistema viene creato il software con le dipendenze automagic, ma se in seguito il pacchetto viene rimosso, il software risulterà corrotto, richiedendo l'esecuzione di revdep-rebuild per correggere il collegamento. È anche possibile che un utente non voglia realmente abilitare alcune dipendenze poichè sa che di tanto in tanto danno dei problemi, o perchè sta creando un pacchetto binario per un'altra macchina dove la dipendenza potrebbe non essere presente (o potrebbe non funzionare in modo corretto).

Quando un pacchetto ha una dipendenza automagic ci sono solo due cose da fare: le prima è dichiarare la dipendenza come obbligatoria, senza preoccuparsi di cosa l'utente inserisce nella propria variabile USE, ma questo potrebbe significare che alcuni supporti non desiderati dagli utenti siano sempre abilitati e che di conseguenza introducano le relative dipendenze; la seconda è correggere il sistema di compilazione in modo da renderlo capace di disabilitare al momento della compilazione la dipendenza anche se presente sul sistema.

Per molto tempo gli sviluppatori originali non hanno pensato realmente di aggiungere il supporto per disabilitare le dipendenze automagic in quanto non le ritenevano un problema concreto: le avevano tutte installate, o almeno quelle di cui necessitavano, e normalmente compilavano con tutte queste. Fortunatamente, molti degli sviluppatori originali inoltre non pensavano nemmeno di aggiungere delle opzioni per disabilitarle se venivano fornite delle patch (talvolta anche senza patch, ma certamente l'invio di patch già pronte è sempre più ben accetto), ma non è sempre così, per esempio gli sviluppatori originali di Wine non vogliono aggiungere il supporto per abilitare o disabilitare le funzionalità nella chiamata a ./configure perchè desiderano che il software usi sempre più opzioni possibili.

2.  Risolvere le dipendenze automagic

Autotools

Molte delle dipendenze automagic, come il nome suggerisce, sono dovute all'uso (scorretto) degli GNU autotools (per essere esatti autoconf). Ci sono principalmente due casi in cui le dipendenze automagic sono chiamate in causa: il primo è il caso dei "lazy devs" (sviluppatori pigri), in cui le dipendenze non hanno affatto un parametro per ./configure, bensì vengono solamente verificate con AC_CHECK_LIB o la macro PKG_CHECK_MODULES di pkg-config, che permette di eseguire codice specifico quando una libreria (o un pacchetto) è presente o meno; il secondo caso è detto "silly argument" (parametro sciocco, ridicolo), dove un parametro --disable-foo o --without-bar è effettivamente accettato da ./configure, ma non viene verificato correttamente.

Il primo caso è di norma semplice da correggere, si riduce al problema di aggiungere una chiamata AC_ARG_WITH (o AC_ARG_ENABLE) e quindi controllare la corrispondente variabile prima di effettuare il test. È utile sapere che il primo parametro passato alla precedente macro solitamente introduce una variabile che viene caricata da autoconf senza dover aggiungere parametri extra per far eseguire determinate azioni quando tale parametro è presente oppure no, la variabile viene chiama $enable_foo o $with_bar, in base a quale delle due macro viene utilizzata.

Nota: Affinchè le patch siano accettate dagli sviluppatori originali, normalmente si consiglia di non cambiare il comportamento predefinito, quando ./configure viene chiamato senza parametri; per questa ragione, saranno elencati due metodi per rendere non-automagic le dipendenze, uno per quelle abilitate in modo predefinito) e una per quelle disabilitate in modo predefinito.

Codice 2.1: Aggiungere un controllo con abilitazione in modo predefinito per una dipendenza opzionale

AC_ARG_WITH([foo], AS_HELP_STRING([--without-foo], [Build without foo library (default: test)]))

AS_IF([test "x$with_foo" != "xno"], [
  PKG_CHECK_MODULES([FOO], [foo >= 0.1])
])

Codice 2.2: Aggiungere un controllo con disabilitazione in modo predefinito per una dipendenza opzionale

AC_ARG_WITH([foo], AS_HELP_STRING([--with-foo], [Build with foo library (default: disabled)]))

AS_IF([test "x$with_foo" = "xyes"], [
  PKG_CHECK_MODULES([FOO], [foo >= 0.1])
])

Quando il parametro è presente ma non viene rispettato, potrebbe risultare tanto semplice quanto complesso risolvere la dipendenza. Potrebbe essere solo un test scritto in modo errato, per cui bisogna apportare delle modifiche in modo simile ai test precedenti, o un completo pasticcio nelle chiamate alle macro AC_ARG_WITH. In questi casi, è meglio controllare attentamente il codice e contattare gli sviluppatori originali se sembrano esserci errori di questo livello.

Avvertenza: Spesso (quasi sempre quando un pacchetto sfrutta automake) le dipendenze automagic vanno a braccetto con una chiamata AM_CONDITIONAL. È molto importante che queste chiamate siano messe fuori dai blocchi if/fi, altrimenti le chiamate a ./configure potrebbero fallire con degli errori.

Anche se è possibile aggirare il problema delle dipendenze di automagic senza modificare configure.ac, rovistando tra i valori di cache di autoconf, questo metodo non è raccomandato. Non risolve il problema originale e non può essere inviato agli sviluppatori per l'integrazione nelle prossime versioni, e potrebbe anche produrre conflitti in quanto i test sono svolti in ambienti fortemente diffenti.

CMake

Le dipendenze automagic possono presentarsi in sistemi di compilazione basati su CMake laddove venga chiamata PGK_CHECK_MODULES incondizionatamente senza il parametro REQUIRED. Sopperire a questo problema è abbastanza semplice, poiché consiste solamente nell'introduzione di un'opzione per il sistema di compilazione e per l'esecuzione di PKG_CHECK_MODULES, in base al loro valore.

Codice 2.3: Evitare la dipendenza automagic aggiungendo l'opzione ENABLE_FOO

OPTION(ENABLE_FOO "Enable foo library" ON)
...
IF (ENABLE_FOO)
  PKG_CHECK_MODULES (FOO foo>=0.1)
ENDIF (ENABLE_FOO)
...
IF (ENABLE_FOO)
  IF (FOO_FOUND)
  ...
  ELSE (FOO_FOUND)
  ...
  ENDIF (FOO_FOUND)
ENDIF (ENABLE_FOO)

Nota: Impostare il valore predefinito in OPTION, in accordo al comportamento originale.

Altri sistemi di compilazione

Importante: Si prega di ampliare questa guida. Sono benvenute note riguardanti altri sistemi di compilazione non usuali come scons , se il sistema di compilazione presenta un modo per definire le dipendenze automagic, potrebbe avere anche un modo per correggerle.

Le dipendenze automagic possono essere create anche con sistemi di compilazione personalizzati che vengono utilizzati da alcuni software. Sfortunatamente, essendo personalizzati, questi sistemi di compilazione sono normalmente difficili da mettere a punto, e non c'è un modo per descrivere un approccio generale per la loro risoluzione.



Stampa

Aggiornato il 1 giugno 2011

Oggetto: Questa guida descrive il problema delle dipendenze "automagic", spiegando le ragioni per cui sono problematiche e come poterle gestire nei casi più comuni.

Diego Elio Pettenò
Autore

Serkan Kaba
Autore

Michele Caini
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.