LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1566|回复: 16

问一个makefile问题,再求pc-lint工具

[复制链接]
发表于 2004-7-20 10:33:24 | 显示全部楼层 |阅读模式
写makefile,更改了头文件,如何使引用它的*.c/*.cc自动重新编译?
发表于 2004-7-20 11:02:05 | 显示全部楼层
给你个例子,自己看把,简单的说就是利用.d依赖文件.

### Customising
#
#
#Adjust the following if necessary; EXECUTABLE is the target
#executable's filename, and LIBS is a list of libraries to link in
#(e.g. alleg, stdcx, iostr, etc). You can override these on make's
#command line of course, if you prefer to do it that way.
#

CC := gcc
CLIBS :=
STDLIBS :=
STDLIBS := $(addprefix -l,$(STDLIBS))
RM-F := rm -f
EXECUTABLE := db

#Now alter any implicit rules' variables if you like
#

CFLAGS := -g -Wall -O3

TOPDIR        := $(shell /bin/pwd)
INC = \
        -I $(TOPDIR)/libnet
       
CFLAGS := $(CFLAGS) $(INC)

#You shouldn't need to change anything below this point.
#

SOURCE := $(wildcard *.c) $(wildcard *.cc)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE)))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) $(patsubst %.d,%.cc,$(MISSING_DEPS)))
CPPFLAGS += -MD

.PHONY: everything deps objs clean veryclean rebuild

everything: $(EXECUTABLE)

deps: $(DEPS)

objs: $(OBJS)

clean: CMD := clean
clean: $(CLIBS)
        @$(RM-F) *.o
        @$(RM-F) *.d

veryclean: clean
        @$(RM-F) $(EXECUTABLE)

rebuild: veryclean everything

force:

$(CLIBS): force
        cd $(@D);$(MAKE) $(CMD)
       
ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
        @$(RM-F) $(patsubst %.d,%.o,$@)
endif

-include $(DEPS)

$(EXECUTABLE) : $(OBJS) $(CLIBS)
        $(CC) ${CFLAGS} $(OBJS) $(CLIBS) $(STDLIBS) -o $@
 楼主| 发表于 2004-7-22 11:20:53 | 显示全部楼层
谢谢,可以了,忘记加:-include $(DEPS)

另一个问题:makefile中如何获取当前目录名:

如当前目录是: /a/b/c/d, 那么我在目录d下如何获取d,或者说如何从串/a/b/c/d中得到d
发表于 2004-7-22 11:28:13 | 显示全部楼层
`basename \`pwd\``
注意是反引号
 楼主| 发表于 2004-7-22 11:47:47 | 显示全部楼层

谢谢回复,但怎么用啊?

比如将得到的目录名赋给变量DIR应该怎么写:

DIR := ...
发表于 2004-7-22 12:34:44 | 显示全部楼层
DIR=`basename \`pwd\``
发表于 2004-7-22 12:34:58 | 显示全部楼层
DIR=`basename \`pwd\``
发表于 2004-7-22 12:35:40 | 显示全部楼层
对不起,又发多了
 楼主| 发表于 2004-7-22 13:00:16 | 显示全部楼层
不行啊,是不是shell不一样啊? 我的是sh
DIR :=`basename \`pwd\``

$(warning 当前目录名是$(DIR))  
显示结果是:
current directory name is:`basename \`pwd\``
不是预期的目录名!

对于目录/a/b/c/d, 我 当前是在d目录下, basename可以取出/a/b/c/d,但我想要的是目录部分的最后一层,也就是 d.
 楼主| 发表于 2004-7-22 13:01:13 | 显示全部楼层

贴错了,sorry

不行啊,是不是shell不一样啊? 我的是sh
DIR :=`basename \`pwd\``

$(warning current directory name is:$(DIR))
显示结果是:
current directory name is:`basename \`pwd\``
不是预期的目录名!

对于目录/a/b/c/d, 我 当前是在d目录下, basename可以取出/a/b/c/d,但我想要的是目录部分的最后一层,也就是 d.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表