создание make-файла для 2 целей - PullRequest
1 голос
/ 10 ноября 2009

gcc 4.4.1 C99

Я создаю клиент-серверное приложение.

У меня есть Makefile, который компилирует все файлы. Тем не менее, я хотел бы 2 создать 2 цели (двоичные файлы), один из которых называется clt и svr. И хотел бы, чтобы Makefile создал для них 2 отдельных каталога с именами ./client и ./server?

.

Пока я сделал это с моим Makefile. Это только создает SVR. Я не уверен, как добавить вторую цель для создаваемого клиента.

Надеюсь, ты понимаешь мою мысль?

Большое спасибо за любые предложения,

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 *~

Ответы [ 3 ]

6 голосов
/ 10 ноября 2009

Вы не объяснили, как сделать clt, какие объекты входят в него. И список объектов для svr выглядит странно - он действительно должен иметь client.o? Я предполагаю, что clt сделан из client2.o и cltcvr_ults.o. Этот make-файл должен делать то, что вы хотите, включая создание каталогов:

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 $@)
    $(CC) $(CFLAGS) $^ $(LIBS) -o $@  

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

%.o: %.c
    $(CC) -c $&lt  

clean: 
    rm -f client/clt server/svr *.o *~ 
4 голосов
/ 10 ноября 2009

Заставьте вашу первую цель (по умолчанию) зависеть от целей clt и svr.

all:  svr clt

svr: ...
clt: ...

Вам также понадобится, чтобы цель clt и svr создала подкаталоги.

Другой, возможно, лучший, подход заключается в том, чтобы переместить весь код сервера в его собственный каталог, а также весь код клиента в свой собственный каталог. (Это предполагает, что вы можете аккуратно разделить код на две части.) Затем в верхнем каталоге должен быть небольшой Makefile, цели которого исполняют Makefile в каждом из подкаталогов.

Добавление

Вы заставляете верхний Makefile вызывать Makefiles в подкаталогах, кодируя правила, подобные этим для каждого подкаталога:

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

Это порождает подпроцесс для выполнения другого make в каталоге clt и другого подпроцесса make для подкаталога svr.

3 голосов
/ 10 ноября 2009

Вы также можете поместить свой график зависимостей для clt и добавить первое правило, подобное этому:

all: svr clt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...