Несколько исполняемых файлов из makefile - PullRequest
0 голосов
/ 13 ноября 2011

Я пытаюсь написать make-файл, который скомпилирует простую симулированную операционную систему реального времени, написанную на языке c.

Структура каталогов выглядит примерно так

</p> <pre><code> **KB** SOURCE ------- - Keyboard.c (helper process) Incl -------- - Include files needed by keyboard.c **CRT** SOURCE ------- - crt.c (helper process) Incl -------- - Include files needed by crt.c **RTX** SOURCE ------- - SOURCE Files INCLUDE -------- - Include Files

RTX требует, чтобы вспомогательные процессы были скомпилированы в два исполняемых файла, затем он использует эти исполняемые файлы для запуска.

Я понятия не имею, как сгенерировать три разных исполняемых файла в одном и том же Makefile или даже как включить файлы в разные включаемые файлы даже для одного исполняемого файла. Я никогда не создавал make-файл раньше, и у меня возникают проблемы с онлайн-уроками.

Вот что у меня есть для RTX (как мне добавить разные пути?)

</p> <pre><code>#For RTX Exexutable OBJS = api.o init_table.o k_rtx.o msg.o pcb.o queue.o user_proc.o main.o iRTX-G29 : $(OBJS) gcc -o iRTX-G29 $(OBJS) api.o : api.h gcc -c api.c init_table.o : init_table.h gcc -c init_table.c k_rtx.o : unistd.h string.h k_rtx.h gcc -c k_rtx.c 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 gcc -c main.c msg.o : msg.h gcc -c msg.c queue.o : queue.h gcc -c queue.c user_proc.o : user_proc.h gcc -c user_proc.c

Любая помощь будет принята с благодарностью! Спасибо!

Ответы [ 3 ]

4 голосов
/ 13 ноября 2011

Сначала давайте упростим ваш существующий 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 $@
1 голос
/ 13 ноября 2011

В make-файле вы можете написать цель, которая не соответствует реальному файлу:

all: executable1 executable2

executable1: a.o b.o
<TAB HERE>gcc -o $@ $^

executable2: c.o d.o
<TAB HERE>gcc -o $@ $^
0 голосов
/ 13 ноября 2011

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

Этоэто идеальное время, чтобы начать использовать automake. Сара Джордж написала хороший учебник.

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