How do make dependency generation work for C? (Also..decode this sed/make statement!)

Posted by Derek on Stack Overflow See other posts from Stack Overflow or by Derek
Published on 2010-05-26T18:46:04Z Indexed on 2010/05/26 18:51 UTC
Read the original article Hit count: 190

Filed under:
|
|
|
|

Hi all. I have a make build system that I am trying to decipher that someone else wrote. I am getting an error when I run it on a redhat system, but not when I run it on my solaris system. The versions of gmake are the same major revision (one off on minor revision).

This is for building a C project, and the make system has a global Makefile.global that is inherited by each directory's local Makefile

The Makefile.global has all the targets in it, starting with

 all: $(LIB) $(BIN)

where LIB builds libs and BIN builds binaries.

jumping down the targets I have

 $(LIB) : $(GEN_LIB) 

 $(GEN_LIB) : $(GEN_DEPS) $(GEN_OBJS)
      $(AR) $(ARFLAGS) $(GEN_LIB) $(GEN_OBJS)
 $(GEN_DEPS) :
      @set -e; rm -f $@; \
      $(CC) $(CDEP_FLAG) $(CFLAGS) $(INCDIRS) `basename $@ | sed 's/\.d/\.c/' | sed 's,^,$(HOME_SRC)/,'` | sed 's,\(.*\)\.o: ,$(GEN_OBJDIR)/\1.o $@ :,g' > [email protected] ; \
      cat [email protected] > $@ ; \
      cat [email protected] | cut -d: -f2 | grep '\.h' | sed 's,\.h,.h :,g' >> $@ ; \
      rm [email protected]
  $(GEN_OBJS) :
       $(CC) $(CFLAGS) $(INCDIRS) -c $(*F).c -lmpi -o $@

I think these are all the relevant targets I need to include to answer my question.

Definitions of those variables:

 CC = icc
 CDEP_FLAG = -M
 CFLAGS = various compiler flags ifdef type flags
 INCDIRS = include directory where all .h files are
 GEN_OBJDIR = /lib/objs
 HOME_SRC = .
 GEN_LIB = lib/$(LIB)
 GEN_DEPDIR=/lib/deps
 GEN_DEPS = $(addprefix $(GEN_DEPDIR)/,$(addsuffix .d,$(basename $(OBJS))))

I think this has everything covered you need. Basically self explanatory from the names.

Now as best I can tell, this is generating in /lib/deps a .d file that has the object and source dependencies in it. In other words, for the utilities.a library, I will get a utils.o and utils.c dependency stack, all in the file utils.d

There is some syntax error that is being generated in that file I think, because I get the following error:

 ../lib/deps/util.d:25: *** target pattern contains no '%'. Stop.
 gmake[2]: *** [all] Error 2
 gmake[1]: *** [all] Error 2
 gmake: *** [all] Error 2

I am not sure if my error is in the dependency generation, or some further down part, like the object generation target?

If you need further info, let me know, I will add to post

© Stack Overflow or respective owner

Related posts about sed

Related posts about dependencies