Сначала давайте упростим ваш существующий make-файл.У вас есть много правил для объектов, имеющих одинаковую форму:
msg.o : msg.h
gcc -c msg.c
Более чистый способ написать это так:
msg.o : msg.c msg.h
gcc -c $< -o $@
(я добавил зависимость msg.c
,вставьте некоторые автоматические переменные и задайте имя выходных данных.) Теперь, когда все эти правила объектов выглядят одинаково, мы можем создать для этого шаблонное правило , но я отделюсьзависимость заголовка на данный момент, потому что main.o
не зависит от main.h
:
api.o : api.h
init_table.o : init_table.h
k_rtx.o : unistd.h string.h k_rtx.h
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h
msg.o : msg.h
queue.o : queue.h
user_proc.o : user_proc.h
%.o : %.c
gcc -c $< -o $@
У большинства этих объектов есть зависимость заголовка, поэтому мы можем выделить их и сделать ее немного короче:
api.o init_table.o k_rtx.o msg.o queue.o user_proc.o : %.o : %.h
k_rtx.o : unistd.h string.h
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h
%.o : %.c
gcc -c $< -o $@
Это будет работать в RTX /, но чтобы заставить его работать при выполнении в родительском каталоге, нам нужно изменить пару вещей.Я предполагаю, что существует опасность конфликта имен файлов (т. Е. В RTX / есть main.c
, а в CRT / разные main.c
, поэтому мы не должны получить main.o
перепутал).Итак, давайте сохраним объектные файлы RTX в RTX / (и я для удобства вычеркну main.o
из списка объектов и опущу зависимости sys/***
, потому что я не знаю, где вы храните sys/
).И этот ответ становится длинным, поэтому я добавлю другие исполняемые файлы и мастер-цель для их сборки:
# This is the first target, so it will be the default: run "make", and you'll get this.
.PHONY: all
all: iRTX-G29 iCRT-G29 iKBD-G29
@echo all done
#For RTX Executable
RTX_OBJS = $(addprefix RTX/, api.o init_table.o k_rtx.o msg.o pcb.o queue.o user_proc.o)
iRTX-G29 : $(RTX_OBJS) RTX/main.o
# This is a little clumsy, but it can't (easily) be helped.
RTX/k_rtx.o : RTX/unistd.h RTX/string.h
RTX/main.o : $(addprefix RTX/, fcntl.h stdio.h stdio.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h)
#Now we can throw in the CRT and Keyboard executables:
CRT_OBJS = $(addprefix CRT/, this.o that.o theOther.o)
iCRT-G29 : $(CRT_OBJS) CRT/main.o
CRT/this.o: CRT/whatever.h
KBRD_OBJS = $(addprefix SOURCE/, red.o green.o blue.o)
iKBD-G29 : $(KBRD_OBJS) SOURCE/main.o
SOURCE/green.o: SOURCE/chlorophyll.h
# Now for the stuff common to all three
iRTX-G29 iCRT-G29 iKBD-G29 :
gcc -o $@ $^
$(RTX_OBJS) $(CRT_OBJS) $(KBRD_OBJS): %.o : %.h
%.o : %.c
gcc -c $< -o $@