Соответствие цели Makefile - PullRequest
       5

Соответствие цели Makefile

1 голос
/ 15 сентября 2011

У меня проблемы с моим Makefile: - (

У меня есть смесь сборки и исходного кода на C, которые мне нужно связать вместе. Мне нужны разные инструкции по сборке для этих двух типов. Поскольку и ассемблер, и компилятор C выводят файлы * .o, я не могу использовать общую конструкцию% .o:%. C, часто встречающуюся в примере Makefiles

Это то, что я сейчас пытаюсь:

Получить список всех файлов C и их результирующих выходных файлов:

C_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.c")
C_OBJFILES := $(patsub %.c,%.o,$(C_SRCFILES))

Получить список всех файлов asm и их результирующих выходных файлов:

A_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.asm")
A_OBJFILES := $(patsub %.asm,%.o,$(A_SRCFILES))

Когда я отображаю эти переменные на экране, они кажутся правильными, но как мне теперь определить мои цели?

Я пробовал что-то подобное

$(A_OBJFILES): ($A_SRCFILES)
  $(AS) $(AFLAGS) -o $@  $*

$(C_OBJFILES): ($C_SRCFILES)
  $(CC) $(CFLAGS) -c -o $@ $*

all: $(A_OBJFILES) $(C_OBJFILES)
  $(LD) $(LDFLAGS) $(A_OBJFILES) $(C_OBJFILES) -o $(TARGET_OUTPUT)

но, конечно, это не работает ...

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Первая проблема: неправильная скобка или две.

$(A_OBJFILES): ($A_SRCFILES)

Обратите внимание, что у вас есть $ внутри ( в ($A_SRCFILES). Make расширяется $A, что ничто, и дела идут вниз. Я думаю, что вы имели в виду $(A_SRCFILES), и то же самое в другом правиле.

Вторая проблема: я не знаю синтаксис ассемблера, но синтаксис команды компилятора неверен:

$(CC) $(CFLAGS) -c -o $@ $*

Переменная $* - ничто, если мы не в шаблонном правиле, которым мы не являемся (пока). И вообще, если бы мы были в шаблонном правиле и вы пытались собрать foo.o, эта команда искала бы исходный файл foo, и такого файла нет. Сделайте это так:

$(CC) $(CFLAGS) -c -o $@ $<

Третья проблема: каждый объектный файл зависит от всех исходных файлов (в каждом правиле). Попробуйте вместо этого:

$(A_OBJFILES): %.o : %.asm
    ...

$(C_OBJFILES): %.o : %.c
    ...

( Теперь это шаблонное правило.)

Четвертая проблема: много избыточности в последнем правиле. Измените это на это:

all: $(A_OBJFILES) $(C_OBJFILES)
    $(LD) $(LDFLAGS) $^ -o $(TARGET_OUTPUT)

или еще лучше:

all: $(TARGET_OUTPUT)

$(TARGET_OUTPUT): $(A_OBJFILES) $(C_OBJFILES)
    $(LD) $(LDFLAGS) $^ -o $@
2 голосов
/ 15 сентября 2011

Поскольку и ассемблер, и компилятор C выводят файлы * .o, я не могу использовать общую конструкцию% .o:%. C, часто встречающуюся в примере Makefiles

Конечно, вы можете:

%.o : %.c
    # commands to make .o from a corresponding .c

%.o : %.asm
    # commands to make .o from a corresponding .asm
...