Что является причиной ошибки `make: Ничего нельзя сделать для 'x.o'. Для некоторых x? - PullRequest
0 голосов
/ 04 июля 2018

Я добавил новую цель (main.o) в существующий проект:

DATS_FILES = main.dats
HFILES  = config.h es.h gc.h input.h prim.h print.h sigmsgs.h \
          stdenv.h syntax.h term.h var.h
CFILES  = access.c closure.c conv.c dict.c eval.c except.c fd.c gc.c glob.c \
          glom.c input.c heredoc.c list.c c_main.c match.c open.c opt.c \
          prim-ctl.c prim-etc.c prim-io.c prim-sys.c prim.c print.c proc.c \
          sigmsgs.c signal.c split.c status.c str.c syntax.c term.c token.c \
          tree.c util.c var.c vec.c version.c y.tab.c dump.c

src     :
        @echo ${OTHER} ${CFILES} ${HFILES} ${DATS_FILES}


list.o : list.c es.h config.h stdenv.h gc.h 
main.o : main.dats
match.o : match.c es.h config.h stdenv.h 

Как видно выше, я попытался присвоить новому исходному файлу .dats тот же статус, что и для файлов .c в проекте, без проблем при сборке.

Если я пытаюсь построить цель напрямую, я получаю:

make main.o
make: Nothing to be done for 'main.o'.

Это происходит, даже если я запускаю touch main.dats. Если я компилирую main.dats вручную после сбоя make, затем снова запускаю make, проект завершает сборку, и выходной исполняемый файл запускается без проблем. Вот полный Makefile.in .

1 Ответ

0 голосов
/ 04 июля 2018

вам нужно добавить правило, чтобы указать make, как воссоздать main.o, начиная с main.dats. Для файлов C make знает, что делать, а для .dats файлов - нет. В частности, вы должны изменить:

main.o : main.dats

с

main.o : main.dats
        (your-compiler) (your-compiler-options) -o main.o main.dats

(при условии, что в вашем компиляторе используется синтаксис для указания входных и выходных файлов)

ВАЖНО: отступ во второй (и последующих) строках должен выполняться с помощью табуляции, а не пробелов, потому что так работает make.

В вашем случае (при условии, что .dats является расширением для динамического языка ATS), я думаю, что это должно быть

main.o : main.dats
        patscc -c -o main.o main.dats

edit: если у вас есть более одного .dats файла для компиляции, вы можете добавить общее правило, которое учит make вызывать правильный компилятор для них (спасибо Тоби за синтаксис)

%.o : %.dats
        patscc -c -o $@ $<

Я не уверен, что является приоритетом для приложения, когда присутствуют оба main.c и main.dats (вероятно, правило, указанное вручную, имеет приоритет)

...