0

我正在尝试实现论文“ Recursive Make Considered Harmful ”中概述的非递归 make 解决方案。我目前坚持要生成 *.d 依赖文件。我在下面提供了 makefile、示例 module.mk 和错误。有什么想法可以解决这个问题吗?

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.

更新 完成的makefile和示例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 
4

1 回答 1

4

即使不存在这样的源文件,它看起来好像添加了一些模块types.cppSRCS

至于警告,当你第一次运行这个 makefile 时,依赖文件 ( foo.d) 还不存在,所以 Make 抱怨它不能include。这不是问题,当这些文件事先确实存在时,警告不会出现在后续运行中。要完全抑制警告,请更改include-include.

于 2012-10-05T23:19:11.680 回答