Graeme
Graeme

Reputation: 4602

Error generating dependencies with make

I am trying to implement the non-recursive make solution outlined in the paper "Recursive Make Considered Harmful". I'm currently stuck on getting the *.d dependency files to generate. I've provided the makefile, sample module.mk and error below. Any ideas how I can fix this?

MODULES :=      \
    module1     \
    module2     

# define compiler
CC = /opt/local/bin/clang++-mp-3.1

# exclude the following warnings for clang
CLANG_NO_WARN =                 \
    -Wno-c++98-compat           \
    -Wno-weak-vtables           \
    -Wno-padded                 \
    -Wno-global-constructors    \
    -Wno-exit-time-destructors   

# look for include files in each of the modules
CFLAGS +=                                                               \
    -g -Weverything -Wall -std=c++11 -stdlib=libc++ $(CLANG_NO_WARN)    \
    -I../ -I/usr/local/include $(patsubst %, -I%, $(MODULES))

# linker flags
LDFLAGS :=                                                  \
    -stdlib=libc++                                          \
    -L/usr/local/boost_1_50_0/stage/lib -L/usr/local/lib

# extra libraries if required (each module will add to this)
LIBS :=                     \
    -lboost_program_options \
    -lboost_system          \
    -lglog                  \
    -lpugixml

# source files to be compiled (each module will add to this)
SRCS := \
    Main.cpp

# include the descriptions for each module
include $(patsubst %, %/module.mk, $(MODULES))

# determine the object files
OBJS := \
    $(patsubst %.cpp, %.o, $(filter %.cpp, $(SRCS)))

# link the program
prog: $(OBJS)
    $(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

# include the C include dependencies
include $(OBJS:.o=.d)

# calculate C include dependencies
%.d: %.cpp
    depend.sh `dirname $*.cpp` $(CFLAGS) $*.cpp > $@  

----------

#!/bin/sh

# Evaluate dependencies for use by the makefile

echo "Called"
DIR="$1"
shift 1
case "$DIR" in
    "" | ".")
        $CC -MM -MG "$@" | sed -e 's@ˆ\(.*\)\.o:@\1.d \1.o:@' ;;
    *)
        $CC -MM -MG "$@" | sed -e "s@ˆ\(.*\)\.o:@$DIR/\1.d \ $DIR/\1.o:@" ;;
esac    

------------

# module.mk
SRCS += \
    Algo.cpp        \
    CommandHandler.cpp  \
    Exchange.cpp        \
    TCPSocket.cpp       \
    TradingEngine.cpp       

----------

$ make
makefile:68: Main.d: No such file or directory
makefile:68: view_string.d: No such file or directory
makefile:68: Algo.d: No such file or directory
makefile:68: CommandHandler.d: No such file or directory
makefile:68: Exchange.d: No such file or directory
makefile:68: TCPSocket.d: No such file or directory
makefile:68: TradingEngine.d: No such file or directory
makefile:68: Exchange.d: No such file or directory
makefile:68: Requests.d: No such file or directory
makefile:68: TickCapture.d: No such file or directory
makefile:68: types.d: No such file or directory
make: *** No rule to make target `types.d'.  Stop.

UPDATE Finished makefile and sample module.mk

$cat makefile
# executable name
BINARY := my_prog

# clang config
CLANG := /opt/local/bin/clang++-mp-3.1

CLANG_WARNINGS :=               \
    -Wno-c++98-compat           \
    -Wno-weak-vtables           \
    -Wno-padded                 \
    -Wno-global-constructors    \
    -Wno-exit-time-destructors

CLANG_CFLAGS := \
    -g -Weverything -Wall -std=c++11 -stdlib=libc++

CLANG_LDFLAGS := \
    -stdlib=libc++

# generic compiler config
CC :=       $(CLANG)
CFLAGS :=   $(CLANG_WARNINGS) $(CLANG_CFLAGS) 
LDFLAGS :=  $(CLANG_LDFLAGS)

INCS :=                             \
    -I../                           \
    -I/usr/local/include            \
    $(patsubst %, -I%, $(SUBDIRS))

LIBS :=                                 \
    -L/usr/local/boost_1_50_0/stage/lib \
    -L/usr/local/lib                    \
    -lboost_program_options             \
    -lboost_system                      \
    -lglog                              \
    -lpugixml

# list subdirectories in which to look for dependencies
# must define SRCS first as subdirs will append to this
# their src files
SRCS := Main.cpp

SUBDIRS :=  \
    module1 \
    module2

include $(patsubst %, %/module.mk, $(SUBDIRS))

# derive object files from srcs
OBJS := $(patsubst %.cpp, %.o, $(filter %.cpp, $(SRCS)))

# link the program
$(BINARY): $(OBJS)
    $(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

# include generated dependency files
DEPS := $(OBJS:.o=.d)
-include $(DEPS)

# generate include dependencies
%.d: %.cpp
    ./depend.sh `dirname $*.cpp` $(INCS) $*.cpp > $@

# compile
.cpp.o:
    $(CC) $(CFLAGS) $(INCS) $< -c -o $@

# clean, obviously
clean:
    rm -f $(BINARY)
    rm -f $(OBJS)
    rm -f $(DEPS)

# et voila!   

-----

$cat module1/module.mk
SRCS_PATH := module1
SRCS += \
    $(SRCS_PATH)/Algo.cpp           \
    $(SRCS_PATH)/CommandHandler.cpp \
    $(SRCS_PATH)/Exchange.cpp       \
    $(SRCS_PATH)/TCPSocket.cpp      \
    $(SRCS_PATH)/TradingEngine.cpp 

Upvotes: 0

Views: 2371

Answers (1)

Beta
Beta

Reputation: 99144

It looks as if some module adds types.cpp to SRCS, even though no such source file exists.

As for the warnings, the first time you run this makefile, the dependency files (foo.d) do not yet exist, so Make complains that it can't include them. It's not a problem, and the warnings won't appear in subsequent runs when those files do exist beforehand. To supress the warnings entirely, change include to -include.

Upvotes: 4

Related Questions