2015-04-20 17 views
5

Attualmente sto lavorando a un progetto Linux utilizzando gli autotools. Il codice viene inviato in SCM (Perforce) e abbiamo lo script configure, Makefile.am, Makefile.in - il solito boilerplate degli autotools. Recentemente, qualcuno ha cambiato Makefile.am, ma ha dimenticato di rigenerare Makefile.in; quando ho cercato di costruire, ho ottenuto questo errore:versione automake (am__api_version) hardcoded nello script configure

WARNING: `automake-1.11' is missing on your system. You should only need it if 
     you modified `Makefile.am', `acinclude.m4' or `configure.ac'. 
     You might want to install the `Automake' and `Perl' packages. 
     Grab them from any GNU archive site. 
cd . && /bin/bash ./config.status Makefile depfiles 

vedo la versione di automake è hardcoded nel script di configurazione (e sembra provenire da aclocal.m4):

am__api_version='1.11' 

Quindi credo Ho bisogno di automake-1.11 (non 1.10, non di qualcosa di più recente) per rigenerare il file Makefile.in.

Perché è quello? Perché dovremmo essere legati ad una specifica versione di automake? Per lo più stiamo costruendo su Ubuntu 14.04, dove 1.14 è la versione predefinita installata. C'è un modo per dire al sistema di compilazione di usare semplicemente qualsiasi versione di automake installata? O è sicuro rimuovere la definizione am__api_version da aclocal.m4?

+0

che definirei "la solita autotools boilerplate" di essere '' configure.ac' e Makefile.am' .Lo scopo di questi due file è generare lo script 'configure',' Makefile.in', 'Makefile' e vari altri artefatti che supportano la build. I file generati non devono (anzi, non dovrebbero) essere aggiunti a qualsiasi controllo sorgente. – rubicks

risposta

0

La domanda importante è perché qualcuno dovrebbe risolvere am__api_versions. La risposta più probabile è: Perché automake tende a modificare gli argomenti della macro o addirittura rimuovere interamente macro della versione precedente. In ogni annuncio del rilascio di automake c'è una sezione chiamata

WARNING: Future backward-incompatibilities!

e un altro chiamato

Obsolete features removed

È possibile fare riferimento alle versioni 1.12, 1.13, 1.14

Così il configure.ac o Makefile.am forza contiene alcune macro che sono diventate obsolete nelle versioni successive. Quando incontri questo problema hai due possibilità. Individuare quale funzione ha sostituito quella obsoleta o attenersi a una versione di automake. La maggior parte degli sviluppatori non ritiene che i file autotools facciano parte del codice sorgente dei progetti. Vogliono solo mantenere la versione funzionante in esecuzione e attenersi all'attuale versione am.

Si noti che tutte le distribuzioni supportano le versioni precedenti di automake. In Ubuntu è possibile trovare:

$ apt-cache search automake | grep automake 
automake - Tool for generating GNU Standards-compliant Makefiles 
automake1.4 - A tool for generating GNU Standards-compliant Makefiles 
automake1.9 - A tool for generating GNU Standards-compliant Makefiles 
automake1.10 - Tool for generating GNU Standards-compliant Makefiles 
automake1.11 - Tool for generating GNU Standards-compliant Makefiles 

Il che significa che è possibile installare la versione richiesta di automake.

Quindi, è possibile rimuovere la riga am__api_version='1.11' e scoprire quale macro è obsoleta. Quindi dovrai decidere quale delle due soluzioni di cui sopra seguirai.

+0

Lo snippet in cui è pinnata la versione è generato da automake stesso - genera file che possono essere solo parzialmente rigenerati (ad esempio, rigenerare Makefile.in ma non aclocal.m4 ecc.) Con la stessa versione di se stesso. Almeno questa è la mia comprensione. Potrei modificare configure, ma se dovesse mai essere rigenerato, verrebbe sovrascritto. – fencekicker

+0

@fencekicker scusa per il mio fraintendimento. Nella domanda era implicito che la versione 'am' era stata corretta dall'utente. – ztik

1

Il problema è che si sta tentando di ricreare Makefile.in con un'altra versione di autotools. Ciò porterebbe alla mancata corrispondenza della versione poiché aclocal.m4 è stato creato con una versione diversa e viene utilizzato per generare i file rimanenti.

Invece di ricreare solo Makefile.in, cercare di ricreare anche aclocal.m4 e tutti i restanti autotools file generati:

autoreconf --force --install 
+0

Quindi suppongo che la scelta sia tra: - non memorizzare alcun file generato in Perforce ed eseguire sempre 'autoreconf -fvi' - memorizzare aclocal.m4, configurare, Makefile.in in Perforce, ma poi è necessario l'automake esatto versione che li ha generati ogni volta che si modifica qualsiasi file di input? Ovviamente, c'è sempre l'opzione 3 - autoprodotti fitch :). – fencekicker

+0

Il tuo problema è: "qualcuno ha cambiato Makefile.am, ma ha dimenticato di rigenerare Makefile.in". Altrimenti tutto dovrebbe funzionare come previsto :) – baf

+0

@fencekicker Se memorizzi aclocal.m4, configura, Makefile.in generato dalla stessa versione di autotools non ti interessa la versione di automake – baf