Что является причиной ошибки `make: Ничего нельзя сделать для 'xo'. Для некоторых x?

Я добавил новую цель (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 ответ

Решение

Вам нужно добавить правило для указания 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

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

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

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

Другие вопросы по тегам