2009-11-10 3 views
1

GCC 4.4.1 C99создание Makefile для 2 целей

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

У меня есть Makefile, который компилирует все файлы. Тем не менее, я бы хотел создать 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 *~ 
+0

«Makefile» не скомпилирует ничего и не создает никаких каталогов. ** Это всего лишь файл! ** Что вызывает команды компилятора и 'mkdir' - это программа' make', которая получает ваш Makefile в качестве входа. Итак, исправление тегов см. Также http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

ответ

6

Вы не объяснили, как сделать ЦПТ, какие объекты идут в него. И список объектов для 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 [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 для чистого и полного кода образца – grigy

+0

«makefile должен делать» ... «makefile ... do» ... * sigh * –

+5

Ой на Pavel, Makefile - это код, как скрипт. Неужели так плохо сказать, что «этот Makefile делает X», а не «этот makefile casuses делает X»? – Beta

4

сделать свой первый (по умолчанию) цели зависят от 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.

+0

Это звучит как лучшая идея. Однако как мой топ-каталог может вызвать 2 make-файла в подкаталогах? Благодарю. – ant2009

+2

Выполнение 'cd clt; make $ (MAKEFLAGS) ', который порождает подпроцесс для выполнения суб-make. Тоже для цели 'svr'. –

3

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

all: svr clt 
+2

Да. Один момент - make по умолчанию ищет первую цель, поэтому поместите «все» выше целей «svr» и «clt». – BenB

+0

поэтому * первый * правило.Но, я думаю, я мог бы сделать эту мысль более ясной. – Joey

Смежные вопросы