2011-09-15 5 views
1

Je vais avoir des ennuis avec mon Makefile :-(cible Makefile correspondant à

J'ai un mélange de réunion et C sourcecode que je dois relier entre eux. J'ai besoin différentes accumulations instructions pour ces deux types. Comme les deux l'assembleur et C sortie compilateur * .o, je ne peux pas utiliser le général% .o.% construction c souvent trouvé dans l'exemple Makefile

Ce que je suis en train maintenant:

Obtenir une liste de tous Fichiers C et leurs fichiers de sortie résultants:

C_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.c") 
C_OBJFILES := $(patsub %.c,%.o,$(C_SRCFILES)) 

obtenir une liste de tous les fichiers asm et leurs fichiers de sortie résultants:

A_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.asm") 
A_OBJFILES := $(patsub %.asm,%.o,$(A_SRCFILES)) 

Quand je fais l'écho de ces vars à l'écran, ils semblent être corrects, mais comment je fais définir mes objectifs maintenant?

J'ai essayé quelque chose comme ça

$(A_OBJFILES): ($A_SRCFILES) 
    $(AS) $(AFLAGS) -o [email protected] $* 

$(C_OBJFILES): ($C_SRCFILES) 
    $(CC) $(CFLAGS) -c -o [email protected] $* 

all: $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $(A_OBJFILES) $(C_OBJFILES) -o $(TARGET_OUTPUT) 

mais ofcourse, cela ne fonctionne pas ...

Toutes les suggestions?

Répondre

4

Premier problème: une parenthèse mal placée ou deux.

$(A_OBJFILES): ($A_SRCFILES) 

Notez que vous avez la $ à l'intérieur du ( dans ($A_SRCFILES). Faire se développe $A, ce qui n'est rien, et les choses vont en baisse. Je pense que vous vouliez dire $(A_SRCFILES), et la même chose dans l'autre règle.

Deuxième problème: Je ne sais pas la syntaxe de l'assembleur, mais la syntaxe de la commande du compilateur est faux:

$(CC) $(CFLAGS) -c -o [email protected] $* 

La $* variables est rien si nous ne sommes pas dans une règle de modèle, ce que nous ne sommes pas (encore). Et de toute façon, si nous étions dans une règle de modèle et que vous essayiez de construire foo.o, cette commande chercherait le fichier source foo, et il n'y a pas un tel fichier. Faites-le de cette façon:

$(CC) $(CFLAGS) -c -o [email protected] $< 

Troisième problème: chaque fichier objet dépend de tous les fichiers source (dans chaque règle). Essayez ceci:

$(A_OBJFILES): %.o : %.asm 
    ... 

$(C_OBJFILES): %.o : %.c 
    ... 

(Maintenant il est une règle de modèle.)

Quatrième problème: beaucoup de redondance dans la dernière règle. Changer à ceci:

all: $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $^ -o $(TARGET_OUTPUT) 

ou mieux encore:

all: $(TARGET_OUTPUT) 

$(TARGET_OUTPUT): $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $^ -o [email protected] 
+0

Ok, j'ai correctement travaille maintenant. Merci :-) –

+0

Pourquoi n'acceptez-vous pas la réponse alors? –

2

Étant donné que l'assembleur et du compilateur C sortie * .o, je ne peux pas utiliser le général% .o:%.construction c souvent trouvé dans l'exemple Makefile

Bien sûr, vous pouvez:

%.o : %.c 
    # commands to make .o from a corresponding .c 

%.o : %.asm 
    # commands to make .o from a corresponding .asm 
+0

Double les deux-points: '::'. Voir http://www.gnu.org/software/make/manual/html_node/Double_002dColon.html – reinierpost

+1

Pas besoin de doublons ici. –

Questions connexes