Gnu Makefile - Handling dependencies

后端 未结 12 2507
滥情空心
滥情空心 2021-02-07 20:24

What approach do C++ programmers on Unix platform use to create and manage Makefiles?

I was using hand made Makefiles for my projects but they don\'t handle header file

12条回答
  •  离开以前
    2021-02-07 21:04

    The makedepend utility is installed on many systems and can be quite useful for generating dependency information.

    Here is an example Makefile that uses the include directive (plus a little Perl magic) to incorporate the output from makedepend:

    # the name of the executable that we'll build
    TARGET = foo_prog
    # our .cc source files
    SRCS = foo.cc main.cc
    
    # the .o versions of our source files
    OBJS := $(patsubst %.cc, %.o, $(filter %.cc, $(SRCS)))
    # some flags for compiling
    CXXFLAGS = -Wall -Werror
    
    # In order to build $(TARGET), we first build each of the $(OBJS).
    # Then we use the given command to link those $(OBJS) into our
    # $(TARGET) executable.  $^ is a shortcut for $(OBJS).  $@ is a
    # shortcut for $(TARGET).
    #
    # The default compile rule will compile each of the $(OBJS) for us.
    $(TARGET): $(OBJS)
            $(CXX) $(CXXFLAGS) $^ -o $@
    
    # Use "make clean" to remove all of the support files.
    clean:
            rm -f $(OBJS) $(TARGET) Makefile.depend *~
    
    # This automatically uses the 'makedepend' utility to add any
    # dependencies that our source files have, namely .h files.  This way,
    # if the .h files change, the code will be re-compiled.
    include Makefile.depend
    Makefile.depend: $(SRCS)
            makedepend -f- -Y $(SRCS) 2> /dev/null | \
            perl -p -e "s/(^.*?:)/Makefile.depend \1/" > Makefile.depend
    

    If both foo.cc and main.cc depend on foo.h, then the contents of Makefile.depend would be:

    Makefile.depend foo.o: foo.h
    Makefile.depend main.o: foo.h
    

    The end result is that the dependency information from makedepend is injected into the Makefile as a series of rules. It's similar to the approach of using a .d file for each .cc file, but keeps the dependency information in one file instead of scattered all over the place.

提交回复
热议问题