Search code examples
makefileats

What is causing the error `make: Nothing to be done for 'x.o'.` for some x?


I added a new target (main.o) to an existing project:

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 

As can be seen above, I have tried to give the new source .dats file the same status as the .c files in the project, which have no problems building.

If I try to build the target directly I get:

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

This happens even if I run touch main.dats. If I compile main.dats manually after make fails, then run make again, the project finishes building and the output executable runs without issue. Here is the complete Makefile.in.


Solution

  • you need to add a rule to specify to make how to re-create main.o starting from main.dats. For C files make knows what to do, but for .dats files it doesn't. In particular, you have to change:

    main.o : main.dats
    

    with

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

    (assuming that is the syntax in your compiler for specifying input and output files)

    IMPORTANT: indentation of the second (and the following) lines have to be done with tabs and not spaces, because that's how make works.

    In your case (assuming .dats is the extension for dynamic ATS language) I think it should be

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

    edit: if you have more than one .dats file to compile you can add a generic rule that teach make to invoke the right compiler for them (thanks to Toby for the syntax)

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

    I am not sure what is the priority for application when both a main.c and main.dats are present.