2010-11-12 6 views
0

J'ai un projet autotool où une partie du code source est téléchargée dynamiquement à partir du réseau (à cause des droits IP empêchant la redistribution directe) et ensuite construite.Makefile.am - Prérequis manuel de la cible + addprefix?

J'ai un Makefile.am qui fonctionne mais je ne suis pas content de certains de ses aspects.

Ici, il est:

INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir) 
AM_CFLAGS = -fPIC -Wall ${SYMBOL_VISIBILITY} 

LIBVERSION=0:0:0 

REFSRC_PATH=refsrc 
REFSRC_SRC=refsrc/dtx.c refsrc/globdefs.c refsrc/host.c refsrc/mathhalf.c refsrc/sp_enc.c refsrc/sp_rom.c refsrc/vad.c refsrc/err_conc.c refsrc/homing.c refsrc/mathdp31.c refsrc/sp_dec.c refsrc/sp_frm.c refsrc/sp_sfrm.c 

${REFSRC_PATH}/.downloaded: 
     ./fetch_sources.py "${REFSRC_PATH}" 
     for f in `ls -1 "${REFSRC_PATH}"/*.{c,h}`; do \ 
       sed -i -e"s/round/round_l2s/" "$$f"; \ 
     done 
     touch [email protected] 

${REFSRC_PATH}/dtx.c: ${REFSRC_PATH}/.downloaded 

lib_LTLIBRARIES = libgsmhr.la 
libgsmhr_la_SOURCES = libgsmhr.c $(REFSRC_SRC) 

clean-local: 
     -rm -rf ${REFSRC_PATH} 

Donc, essentiellement, libgsmhr.c est mon emballage principal, puis-je télécharger le code source dans un RefSrc/sous-répertoire et le patch un peu.

Le premier problème est que dans REFSRC_SRC j'aurais aimé utiliser un $ (addprefix ...) au lieu de répéter refsrc/devant chaque fichier .c. Mais cela ne semble pas fonctionner et autoreconf se plaint un peu.

détails de défaillance (lors du retrait du RefSrc/préfixe de REFSRC_SRC = et en utilisant $ (addprefix $ {REFSRC_PATH}/$ {REFSRC_SRC}) sur la liste des dépendances):

bash$ autoreconf -i 
libgsmhr/Makefile.am:19: addprefix ${REFSRC_PATH}/, ${REFSRC_SRC}: non-POSIX variable name 
libgsmhr/Makefile.am:19: (probably a GNU make extension) 

(configure works fine) 

bash$ make 
... 
make[2]: Entering directory `/tmp/ram/gapk.build/libgsmhr' 
    CC  libgsmhr.lo 
    CCLD libgsmhr.la 
make[2]: Leaving directory `/tmp/ram/gapk.build/libgsmhr' 
... 

(Comme vous voyez la compilation fonctionne parce que libgsmhr.c est un stub qui n'utilise pas encore les symboles dans ces fichiers)

Deuxième problème Cette règle est-elle:

${REFSRC_PATH}/dtx.c: ${REFSRC_PATH}/.downloaded 

Je dois liste le premier fichier explicitement (dtx.c) au lieu d'utiliser un caractère générique comme:

${REFSRC_PATH}/%.c: ${REFSRC_PATH}/.downloaded 

Si je tente d'utiliser le caractère générique, puis autoreconf et se plaint aussi ne fonctionne tout simplement pas .. (le motif ne correspond pas d'une manière ou d'une autre).

détail d'échec:

bash$ autoreconf -i 
libgsmhr/Makefile.am:16: `%'-style pattern rules are a GNU make extension 

(configure works fine) 

bash$ make 
... 
make[2]: *** No rule to make target `refsrc/dtx.c', needed by `dtx.lo'. Stop. 
... 

Sylvain

+0

Soyez plus précis: montrez les messages d'autoreconf et montrez ce qui se passe au lieu de fonctionner. (Je suis assez sûr que je sais ce que vous attendez ici, mais le mode d'échec n'est pas évident.) – zwol

+0

Incidemment, "' pour f dans $ (ls -1 "$ {REFSRC_PATH}"/*. {C, h}) '" peut devenir juste "' pour f dans "$ {REFSRC_PATH}"/*. {c, h} '". (Les backticks ont été remplacés par $ (...) 'pour éviter tout conflit avec Markdown.) – zwol

+0

Mise à jour avec plus de détails sur les problèmes. – 246tNt

Répondre

1

Vous semblez écrire un makefile dans le style gnumake, mais en fait en cours d'exécution d'une autre version de Marque. Si ce n'est pas évident que autoreconf appelle, vous pouvez insérer une règle dans le makefile:

dummy: 
    @echo using $(MAKE) 
    $(MAKE) -v 

Si cette théorie se révèle correcte, vous pouvez persuader autoconf d'utiliser gnumake ou écrire pour la version qu'il utilise.

+0

Si vous allez écrire un Makefile pour GNU Make, vous devez faire attention car les makefiles générés par automake sont portables. Vous devriez tester que '$ (MAKE)' est en fait GNU Make dans 'configure.ac'. –

+0

Eh bien, je ne veux surtout pas de la syntaxe GNUMake. S'il y a un moyen portable de réaliser ce que je veux, je préfère l'utiliser. – 246tNt

+0

Aussi, j'ai seulement gnumake installé, donc il doit être en utilisant ... GNU Make 3.81 Droit d'auteur (C) 2006 Free Software Foundation, Inc. Ceci est un logiciel gratuit; voir la source pour les conditions de copie. Il n'y a AUCUNE garantie; pas même pour la QUALITÉ MARCHANDE ou l'ADAPTATION À UN USAGE PARTICULIER. Ce programme conçu pour x86_64-pc-linux-gnu – 246tNt