2009-11-10 6 views
1

gcc 4.4.1 C99créer un makefile pour 2 cibles

Je crée une application client-serveur.

J'ai un Makefile qui compile tous les fichiers. Cependant, je voudrais créer 2 cibles (binaires) une appelée clt et svr. Et voudrait que le Makefile crée deux répertoires séparés pour eux, appelés ./client et ./server? Jusqu'ici j'ai fait ceci à mon Makefile.

Jusqu'à présent. Cela crée seulement le svr. Je ne suis pas sûr comment je peux ajouter la deuxième cible pour que le client soit créé.

J'espère que vous comprenez mon point?

Un grand merci pour toutes les suggestions,

OBJECT_FILES = server.o client.o cltsvr_ults.o 

CFLAGS = -ggdb -Wall -pthread 

LIBS = -lpthread 

CC = gcc 

svr: $(OBJECT_FILES) 
    $(CC) $(CFLAGS) $(OBJECT_FILES) $(LIBS) -o svr 

client.o: client.c cltsvr_ults.h 
    $(CC) -c client.c 

server.o: server.c cltsvr_ults.h 
    $(CC) -c server.c 

cltsvr_ults.o: cltsvr_ults.c 
    $(CC) -c cltsvr_ults.c 

clean: 
    rm svr *.o *~ 
+0

"Makefile" ne compile rien et ne crée aucun répertoire. ** C'est juste un fichier! ** Ce qui appelle les commandes compilateur et 'mkdir' est le programme' make', qui obtient votre Makefile en entrée. Donc, en corrigeant les tagsl voir aussi http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

Répondre

6

Vous ne l'avez pas expliqué comment faire clt, quels objets y entrer. Et la liste des objets pour svr semble bizarre - devrait-elle vraiment avoir client.o? Je vais supposer que clt est fait de client2.o et cltcvr_ults.o. Ce makefile devrait faire ce que vous voulez, y compris en créant les répertoires:

 
SVR_OBJECT_FILES = server.o client.o cltsvr_ults.o 
CLT_OBJECT_FILES = client2.o cltsvr_ults.o 

CFLAGS = -ggdb -Wall -pthread 
LIBS = -lpthread 
CC = gcc 

all: client/clt server/svr 
client/clt: $(CLT_OBJECT_FILES) 
server/svr: $(SVR_OBJECT_FILES) 

client/clt server/svr: 
    @mkdir -p $(dir [email protected]) 
    $(CC) $(CFLAGS) $^ $(LIBS) -o [email protected] 

client.o client2.o server.o: cltsvr_ults.h 

%.o: %.c 
    $(CC) -c $< 

clean: 
    rm -f client/clt server/svr *.o *~ 
+0

+1 pour un code d'échantillon propre et complet – grigy

+0

"makefile devrait faire" ... "makefile ... do" ... * soupir * –

+5

Oh, allez Pavel, un Makefile est du code, comme un script. Est-ce vraiment si mal de dire "ce Makefile fait X", au lieu de "ce makefile casus fait faire X"? – Beta

4

Effectuez votre premier (par défaut) cible dépendent des clt et svr cibles.

all: svr clt 

svr: ... 
clt: ... 

Vous aussi voulez avoir la cible clt et svr créer les sous-répertoires.

Une autre approche, probablement meilleure, consiste à déplacer tout le code du serveur dans son propre répertoire, ainsi que tout le code client dans son propre répertoire. (Ceci suppose que vous pouvez bien diviser le code en deux parties.) Ensuite, ayez un petit Makefile dans le répertoire supérieur dont les cibles exécutent les Makefiles dans chacun des sous-répertoires.

Addendum

Vous faites le Makefile haut invoquer le Makefile dans les sous-répertoires par le codage des règles comme celles-ci pour chaque sous-répertoire:

clt: cd clt; make $(MAKEFLAGS) 
svr: cd svr; make $(MAKEFLAGS) 

Cette fraye un sous-processus pour effectuer une autre make dans le répertoire clt et un autre sous-processus make pour le sous-répertoire svr.

+0

Cela semble être une meilleure idée. Cependant, comment mon répertoire supérieur peut-il appeler les 2 fichiers makefiles dans les sous-répertoires? Merci. – ant2009

+2

En faisant un 'cd clt; make $ (MAKEFLAGS) ', qui engendre un sous-processus pour effectuer le sous-make. Idem pour la cible 'svr'. –

3

Vous pouvez mettre votre graphe de dépendance pour clt là-dedans aussi et ajouter une première règle comme ceci:

all: svr clt 
+2

Oui. Un point - recherche la première cible par défaut, placez donc "tout" au-dessus des cibles "svr" et "clt". – BenB

+0

D'où la règle * first *.Mais oui, j'aurais pu clarifier ce point, je pense. – Joey

Questions connexes