2012-10-05 3 views
0

J'essaie de mettre en œuvre la solution de création non récursive décrite dans l'article "Recursive Make Considered Harmful". Je suis actuellement bloqué pour obtenir les fichiers de dépendance * .d à générer. J'ai fourni le makefile, l'exemple module.mk et l'erreur ci-dessous. Des idées comment je peux résoudre ce problème?Erreur de génération de dépendances avec 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. 

MISE À JOUR makefile et de l'échantillon 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

Je pense que vous pourriez avoir besoin de mettre des guillemets autour de '\' dirname $ *. Cpp \ '' – jpm

+0

Essayez de déplacer le "include $ (OBJS: .o = .d)" à un point dans le makefile après le "% .d:% .cpp "règle de conversion. –

+0

@jpm Cela ne fonctionne pas, les coches de retour doivent être étendues – Graeme

Répondre

3

Terminé Il semble que si un module ajoute types.cpp à SRCS, même si tel fichier source existe. En ce qui concerne les avertissements, la première fois que vous exécutez ce makefile, les fichiers de dépendance (foo.d) n'existent pas encore, alors Make se plaint qu'il ne peut pas les include eux. Ce n'est pas un problème, et les avertissements n'apparaîtront pas dans les exécutions suivantes lorsque ces fichiers existent à l'avance. Pour supprimer complètement les avertissements, remplacez include par -include.

Questions connexes