2012-10-05 32 views
0

我正在尝试实施文章“Recursive Make Considered Harmful”中概述的非递归制作解决方案。我目前坚持让* .d依赖文件生成。我提供了下面的makefile,sample module.mk和error。任何想法如何解决这个问题?使用make生成依赖关系时出错

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 [email protected] $(OBJS) $(LDFLAGS) $(LIBS) 

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

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

---------- 

#!/bin/sh 

# Evaluate dependencies for use by the makefile 

echo "Called" 
DIR="$1" 
shift 1 
case "$DIR" in 
    "" | ".") 
     $CC -MM -MG "[email protected]" | sed -e '[email protected]ˆ\(.*\)\.o:@\1.d \1.o:@' ;; 
    *) 
     $CC -MM -MG "[email protected]" | sed -e "[email protected]ˆ\(.*\)\.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 成品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 [email protected] $(OBJS) $(LDFLAGS) $(LIBS) 

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

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

# compile 
.cpp.o: 
    $(CC) $(CFLAGS) $(INCS) $< -c -o [email protected] 

# 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 
+0

我想你可能需要在'\'dirname $ *。cpp \'' – jpm

+0

周围加引号将“include $(OBJS:.o = .d)”移动到makefile中的“ .d:%.cpp“转换规则。 –

+0

@jpm这不起作用,后面的勾号需要扩大 – Graeme

回答

3

看起来好像有些模块添加到types.cppSRCS,即使没有这样的源文件存在。

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