2013-04-21 2 views
1

Хотелось бы попытаться установить очень маленькую систему Make-файлов. У меня есть следующая настройка, но что-то не совсем правильно (это было связано с чтением нескольких сообщений SO по этой теме, хотя и с некоторыми конкретными проектами, и на некоторых веб-сайтах. Я не должен улавливать что-то фундаментальное в том, . Makefile»вызов суб-Makefiles(GNU) Make: Как настроить базовую систему?

Это даже проще, чем иметь основные файлы Makefile вызовов в разных подкаталогах Вот следующие файлы я заготовил:.

Makefile:

 
all: 
    $(MAKE) -f ./make_system.mk 
    $(MAKE) -f ./make_crc.mk 

make_system.mk :

 
G = -g  ## debug option 
CC = gcc  ## compiler 
SRCS = source.c sink.c gateway.c 
EXES = source sink gateway 
OBJS = source.o sink.o gateway.o 
CFLG = 
LFLG = 
LIB = #-lsocket -lnsl -lpthread

all: $(EXES)

%.o: %.c %.h $(CC) -c $G $(CFLG) $<

source: source.o $(CC) -o source source.o $(LIB) $(LFLG)

sink: sink.o $(CC) -o sink sink.o $(LIB) $(LFLG)

gateway: gateway.o $(CC) -o gateway gateway.o $(LIB) $(LFLG)

clean: /bin/rm -f core *.o $(EXES) *~

make_crc.mk:

 
CC  = gcc 
CFLAGS = -g 
LFLAGS = 
HDR = crcmode.h 
SRC = crcmodel.c crctest.c 
OBJ = crcmodel.o crctest.o 
EXE = crctest

all: $(EXE)

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

$(EXE): $(OBJ) $(CC) $(LFLAGS) $(OBJ) -o $(EXE)

clean: /bin/rm -f *.o *~ core $(EXE)

Как настроить Makefile, чтобы вызвать меньшие суб-мейкфайлы (типа * .mk)? Это основной, но важный первый шаг к работе с более крупными системами makefile (есть руководство для консультаций, хотя я не думаю, что он содержит явные базовые примеры). Если кто-то, кто это сделал, может показать мне небольшую виньетку Makefile, это было бы очень полезно (опять же, эта система makefile может существовать в одном и том же локальном каталоге).

Примечание: Индивидуальные make-файлы make_system и make_crc работают нормально, когда они сами называются «Makefile», но я хочу попытаться назвать их отдельными подфайлами с одним общим Makefile.

ADDENDUM (в следующем примере): После того, как я реализовал решение Carl, показанное ниже, я понял, что вам нужно всегда включать какую-либо форму «make clean» или хотя бы ввести в командной строке перед вызовом Makefile. В противном случае вы увидите соответствующий вывод «ничего не нужно делать». Это было то, что я знал раньше, но пренебрег этим делать это время (просто проверить: просто посмотрите на свой каталог, и вы увидите, что у вас есть исполняемые файлы в каталоге environment /).

+3

В чем проблема, с которой вы сталкиваетесь? Это выглядит хорошо для меня. –

+0

Когда вы говорите: «Индивидуальные make-файлы ... отлично работают, когда они сами называются« Makefile », но«, вы имеете в виду, что они не работают при вызове «make -f make_system.mk» и «make -f make_crc .mk "? –

+0

Я обновил свой пост выше, чтобы вы могли видеть результат, который я получаю. Кажется, он не работает, когда я набираю метку «все», хотя и находится в обоих подфайлах. Я решил переименовать каждый файл подкачки из «Makefile» (так как каждый из них был первоначально вызван) до «some_descriptive_name.mk», а затем заглавил новый основной make-файл «Makefile». И я делал «очистить» перед выполнением этой новой системы make. – 9codeMan9

ответ

1

Я хочу «переслать» цель, вам нужно будет сделать это явно. Что-то вроде этого примера должно работать (хотя я не могу легко проверить прямо сейчас, извините):

default: all 
%: 
    $(MAKE) -f ./make_system.mk [email protected] 
    $(MAKE) -f ./make_crc.mk [email protected] 
+0

Я получаю следующее, когда делаю это в главном Makefile (именно то, что находится в вашем посте, это то, что находится в главном Makefile), как вы предлагаете: $ make Makefile:2: *** missing separator. Stop. Что-то происходит после символа @? – 9codeMan9

+0

Обычно это означает, что у вас есть пробелы вместо вкладок в вашем рецепте. –

+0

Просто исправил его, чтобы не было вкладок (поскольку вы правы, GNUmake обрабатывает вкладки по-разному). Еще одна ошибка. – 9codeMan9

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