Нет правила для создания целевого consoleio.c

StackOverflow https://stackoverflow.com/questions/216716

  •  03-07-2019
  •  | 
  •  

Вопрос

В недавний выпуск, Я обнаружил, что DJGPP может принимать только ограничение на количество символов в командной строке DOS.Чтобы обойти это ограничение, я решил попробовать написать makefile, который позволит мне передавайте более длинные строки.В процессе взлома makefile и его тестирования я столкнулся со странной ошибкой.Файл makefile выглядит следующим образом:

AS  :=  nasm
CC  :=  gcc
LD  :=  ld

TARGET      :=  $(shell basename $(CURDIR))
BUILD       :=  build
SOURCES     :=  source

CFLAGS  :=  -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
            -nostdinc -fno-builtin -I./include
ASFLAGS :=  -f aout

export OUTPUT   :=  $(CURDIR)/$(TARGET)

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

SOBJS   :=  $(SFILES:.s=.o)
COBJS   :=  $(CFILES:.c=.o)
OBJS    :=  $(SOBJS) $(COBJS)

build   :   $(TARGET).img

$(TARGET).img   :   $(TARGET).bin
    concat.py

$(TARGET).bin   :   $(OBJS)
    $(LD) -T link.ld -o $@ $^

$(SOBJS)    :   %.o :   %.asm
    $(AS) $(ASFLAGS) $< -o $@

$(COBJS)    :   %.o :   %.c
    $(CC) -c $< $(CFLAGS) -o $@

При попытке запустить его я получаю эту ошибку:

make: *** No rule to make target `consoleio.c', needed by `consoleio.o'.  Stop.

Чего я не понимаю, так это почему он пытается найти правило для файлов .c.Насколько я понимаю, если файл есть, он должен просто использовать его.Как мне сделать так, чтобы make не нуждался в правиле для файлов .c?

Это было полезно?

Решение

То, что вы пытаетесь сделать, не будет работать без VPATH, и поскольку вы все еще изучаете makefile, я бы не стал использовать VPATH.

Правило ищет "consoleio.c", который, если я правильно понял ваш makefile, не существует;то, что существует, - это "исходный код /consoleio.c".Вероятно, вам следует изменить его на что-то вроде "$ (SOURCES) /%.c" вместо "%c".

Однако я не проверял ваш синтаксис на наличие этого правила.Если это неверно, встроенный "%.o:вместо этого будет использовано правило "%.c", которое будет иметь ту же проблему.

Однако то, как вы это делаете, не похоже на обычный способ, который я видел.Обычный способ заключается в том, чтобы:

  • Создайте неявное правило "%.o:%.c" (или в вашем случае "%.o:$(ИСТОЧНИКИ)/%.c")
  • Явный список зависимостей для каждого файла:"фу.о:foo.c bar.h baz.h" (без команды неявное правило имеет команду)

Другие советы

Давайте попробуем ответить без комментариев...

Возможность А:

  • Ваш макрос для SFILES ищет файлы, заканчивающиеся на '.s'.
  • Ваше правило для компиляции SOBJS заключается в поиске файлов, заканчивающихся на '.asm'.

Возможность В:

  • Ваше правило для SOBJS и COBJS приведено в обозначении, которое я не узнаю.
  • Согласно руководству GNU Make, вы можете написать неявные правила следующим образом:

    %.o :%.c ; команда

Кажется, у вас есть список целевых объектов $ (SOBJS), который зависит от '%.o : %.asm'.Я не уверен, как make это истолкует.

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

@CesarB, кажется, прибил проблему, я просто добавлю пару замечаний.

<Ол>
  • Я бы настоятельно рекомендовал не использовать подстановочные знаки в правилах сборки. Правила сборки должны четко определять, что именно собирается, и не зависеть от того, какие файлы находятся в каталоге.

  • Я бы также рекомендовал не использовать VPATH, если только вы (1) не собираете отдельный каталог для сборки или (2) ваши исходные файлы не распределены по большому количеству каталогов. Если все ваши источники находятся в одном каталоге, использование VPATH только приведет к путанице.

  • Форма назначения: = обычно используется только тогда, когда известно, что оценка переменной занимает много времени, например, при использовании $ (shell ...). В противном случае " = " предпочтительнее.

  • Использование " экспорта " распространение OUTDIR в concat.py (который, как я полагаю, так как concat.py не принимает никаких параметров) является запахом кода. Если возможно, передайте его в качестве параметра.

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top