Makefile中自动生成依赖关系?

shelf 2006-05-22 08:23:15
我看过一些文档,说自动生成依赖关系(目标文件和头文件),可以采用如下模式规则:
%.d: %.c

$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \

rm -f $@.$$$$

sources = foo.c bar.c

sinclude $(sources:.c=.d)

我不知道是否将这加入到MAKEFILE中,我尝试加进去,但是没有任何反应
请问要自动生成头文件的依赖关系,MAKEFILE中到底如何写?
请教!!

...全文
229 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoyuhang 2006-05-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/yaoyuhang/archive/2006/05/10/721156.aspx
shelf 2006-05-23
  • 打赏
  • 举报
回复
我按照这个模式写的为什么不能自动产生依赖关系呢?
能给个更详尽的解释吗?
lbaby 2006-05-22
  • 打赏
  • 举报
回复
注意
make文件中的第一个目标项是make的默认目标
lbaby 2006-05-22
  • 打赏
  • 举报
回复
把俺N年前写的makefile弄出来了:
Make.rules:
#By lbaby on 2005 06

#
# Define GPL_BUILD as yes if you want to build a copy
# the GNU Public License v2.
# This adds a "no-warranty" notice and accompanying show commands
# to interactive programs.
#

GPL_BUILD := yes

#if the environment varible ICE_HOME is not set
#we should not contiue

ifeq ($(ICE_HOME),)
$(error You should set the environment ICE_HOME if you have installed ICE)
endif

#Do not print the message "Entering directory..."
MAKEFLAGS += --no-print-directory

I_DIR = $(TOP_DIR)/include
L_DIR = $(TOP_DIR)/lib
BIN_DIR = $(TOP_DIR)/bin

#get mysql compile flags
MYSQLFLAGS :=$(shell mysql_config --cflags)
MYSQLLIBS :=$(shell mysql_config --libs)

C++ :=g++
CC :=gcc

#Map our ice file to cpp
SLICE_TO_CPP :=$(ICE_HOME)/bin/slice2cpp
ICEFLAGS :=-I.

#library
AR :=ar
ARFLAGS :=rv


CPPFLAGS := -c $(MYSQLFLAGS) -I$(ICE_HOME)/include \
-D_REENTRANT -I$(I_DIR) -g -Wall
CFLAGS := -c -g -I$(I_DIR)
LDFLAGS := -lIceStorm -lIce -lIceUtil -lpthread -g -Wall -lmy_design
LIBS := -L$(ICE_HOME)/lib -L$(L_DIR) $(MYSQLLIBS)

#The rules for ice to cpp's mapping
%.cpp $(I_DIR)/%.h:%.ice
@echo $(SLICE_TO_CPP) $^;$(SLICE_TO_CPP) $(ICEFLAGS) $^
@mv $(subst .ice,.h,$^) $(I_DIR)


#The rules for compiling cpps to object files

#NOTE:For our depend file is generated by compiler
#the format looks like this:
#XXX.cpp XXX.d :XXX.cpp include/XXX.h
#Unfortunately ,it matchs our compile pattern
#when we use "-o" and "-c" option with this ,
#there will encounter error .So we only use the cpp file
#an alternative way is to use $^ and remove "-o $@"
%.o:%.cpp
@echo C++ $@;$(C++) -o $@ $(CPPFLAGS) $(filter %.cpp,$^)

%.o:%.c
@echo CC $@;$(CC) -o $@ $(CFLAGS) $(filter %.c,$^)

#The rules for generating c and cpp's depends
#the Python script: makedep.py is to filter out standard library header files
%.d:%.cpp
@echo Making depends for $(filter %.cpp,$^);\
$(C++) -M $(filter %.cpp,$^) $(CPPFLAGS) |\
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g'\
|$(TOP_DIR)/config/mkdep.py>$@

%.d:%.c
@echo Making depends for $^;\
$(CC) -M $(filter %.c,$^) $(CFLAGS) \
|sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g'\
|$(TOP_DIR)/config/mkdep.py > $@



lib文件夹下的makefile
TOP_DIR =../..

include $(TOP_DIR)/config/Make.rules

ICES :=data.ice dbdef.ice
ICE_CPPS :=$(ICES:%.ice=%.cpp)
ICE_HDRS :=$(ICES:%.ice=%.h)
SRCS :=mysqldb.cpp generator.cpp server.cpp \
client.cpp global.cpp dbopI.cpp $(ICE_CPPS)

TESTCPP :=tst.cpp
TESTO :=tst.o
TEST :=test


OBJS :=$(SRCS:%.cpp=%.o)
ALLOBJS :=$(OBJS) $(TESTO)

DEPENDS :=$(ALLOBJS:%.o=%.d)
DEPENDS +=$(ICES:%.ice=%ice.d)

MY_LIB_FILE :=$(TOP_DIR)/lib/libmy_design.a


.PHONY:all clean
all:$(MY_LIB_FILE) $(TESTO)

$(MY_LIB_FILE):$(OBJS)
@echo AR $@ ;$(AR) $(ARFLAGS) $@ $^

data.ice:dbdef.ice

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPENDS)
endif

test:
@echo LD $@;c++ -o $(TEST) $(TESTO) $(LIBS) $(LDFLAGS)
clean:
@echo -n CLEAN $(CURDIR)...;\
rm -f *.o *.core $(MY_LIB_FILE) $(TEST) $(ICE_CPPS) $(ICE_HDRS) *.d;\
echo DONE


23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧