Ошибка генерации зависимостей с помощью make

Я пытаюсь реализовать нерекурсивное решение make, описанное в статье «Рекурсивный Сделать ВреднымMsgstr «В настоящее время я застрял при получении файлов зависимостей * .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.

ОБНОВИТЬ
Готовый make-файл и образец 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

0

Решение

Похоже, что какой-то модуль добавляет types.cpp в SRCSдаже если такого исходного файла не существует.

Что касается предупреждений, при первом запуске этого make-файла, файлы зависимостей (foo.d) пока не существует, так что Make жалуется, что не может include их. Это не проблема, и предупреждения не появятся при последующих запусках, если эти файлы существуют заранее. Чтобы полностью исключить предупреждения, измените include в -include,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]