一套完整的makefile样板
近来,经常看到有人询问makefile的写法,这里根据本人经验给出一个应用系统的完整例子,便于各位参考。 [b:569e1de998]应用系统的目录结构如下:[/b:569e1de998] [code:1:569e1de998] ~/bin可执行程序目录 ~/etc配置文件目录 ~/inc头文件目录 ~/lib函数库文
近来,经常看到有人询问makefile的写法,这里根据本人经验给出一个应用系统的完整例子,便于各位参考。
[b:569e1de998]应用系统的目录结构如下:[/b:569e1de998]
[code:1:569e1de998]
~/bin 可执行程序目录
~/etc 配置文件目录
~/inc 头文件目录
~/lib 函数库文件目录
~/log 日志文件目录
~/src 源程序文件目录
~/src/lib 函数库源程序目录
~/src/lib/LIB_1 函数库libLIB_1源程序目录
~/src/APP_A 子系统APP_A源程序目录
~/src/APP_A/mod_a 子系统APP_A模块mod_a源程序目录
~/.profile
~/makefile
[/code:1:569e1de998]
[b:569e1de998]~/makefile文件内容如下:[/b:569e1de998]
[code:1:569e1de998]
all:
@MakeSubDir() \
{ \
for DIR in `ls|grep&nbs'''l''';ls|grep -v&nbs'''l'''`; do \
if [ -d $${DIR} ]; then \
cd $${DIR}; \
MakeSubDir; \
if [ -f makefile -o -f Makefile ]; then \
echo ""; \
pwd; \
make all; \
fi; \
cd ..; \
fi; \
done; \
}; \
MakeSubDir
tar:
@tar -cf `date +%Y%m%d-%H%M%S`.tar .profile `ls|grpbpv&nbs;'''.tar''''`
[/code:1:569e1de998]
[b:569e1de998]~/src/lib/LIB_1/makefile文件内容如下:[/b:569e1de998]
[code:1:569e1de998]
ALL: INFO all
BASEDIR = $(HOME)
INC = $(BASEDIR)/inc
LIB = $(BASEDIR)/lib
PRDNAME = $(LIB)/libLIB_1
PRODUCT = $(PRDNAME).a $(PRDNAME).so
OBJS = LIB_1_f1.o LIB_1_f2.o
AR = ar <特定平台ar可选参数>
CC =
clearcase/" target="_blank" >cc <特定平台cc可选参数>
all: $(PRODUCT)
$(PRDNAME).a: $(OBJS)
@echo " Making $@ ..."
@$(AR) -r $@ $(OBJS)
$(PRDNAME).so: $(OBJS)
@echo " Making $@ ..."
@$(CC) -G -o $@ $(OBJS)
.c.o: *.h $(INC)/*.h
@echo " Compiling $< ..."
@$(CC) -c -I$(INC) $<
INFO:
@echo " make all - samenpwh&nbs;'''make'''' except this message"
@echo " make clear - remove object files"
@echo " make clean - remove all object and target files"
@echo ""
clear: FORCE
@rm -f *.o
clean: FORCE clear
@rm -f $(PRODUCT)
FORCE:
[/code:1:569e1de998]
[b:569e1de998]~/src/APP_A/mod_a/makefile文件内容如下:[/b:569e1de998]
[code:1:569e1de998]
ALL: INFO all
BASEDIR = $(HOME)
INC = $(BASEDIR)/inc
LIB = $(BASEDIR)/lib
BIN = $(BASEDIR)/bin
MODULE = $(BIN)/APP_A_mod_a
TESTER = APP_A_mod_a_t
PRODUCT = $(SERVER) $(TESTER)
CC = cc <特定平台cc可选参数>
all: $(PRODUCT)
$(MODULE): APP_A_mod_a.o
@echo " Making $@ ..."
@$(CC) $? -o$@ -L$(LIB) -lLIB_1
APP_A_mod_a_t: APP_A_mod_a_t.o
@echo " Making $@ ..."
@$(CC) $? -o$@ -L$(LIB) -lLIB_1
.c.o: *.h $(INC)/*.h
@echo " Compiling $< ..."
@$(CC) -c -I$(INC) $<
INFO:
@echo " make all - samenpwh&nbs;'''make'''' except this message"
@echo " make clear - remove object files"
@echo " make clean - remove all object and target files"
@echo ""
clear: FORCE
@rm -f *.o
clean: FORCE clear
@rm -f $(PRODUCT)
FORCE:
[/code:1:569e1de998]
[b:569e1de998]使用方法:[/b:569e1de99]b>在主目录下用'''make''''命令能够首先建立函数库,然后建立所有目标
2.在主目录下使用''mk&bsp;tar''''命令能够对整个系统进行打包,生成的文件以日期和时间命名。
在下目录中直接用'''make''''命令会首先给出用法提示,然后建立本目录所有目标。
<>.在最下层子目录中使用''mk&bsp;all''''命令不出现提示信息,直接建立本目录所有目标。
<>.最层子目录中使用''''k&bp;clear''''命令可以清除本目录的所有.o文件。
<>.最层子目录中使用''''k&bp;clean''''命令可以清除本目录的所有.o文件和建立的所有目标。
[b:569e1de998]注:[/b:569e1de998]在某些环境下,由于make中调用shell命令的机制,可能不支持递归。
rootclown 回复于:2005-04-22 22:57:31
|
收藏了,一直也没静下心学习makefile的写法:(
|
wildworf 回复于:2005-04-23 13:52:01
|
我们现在的项目里,我写的和这个也差不多哦,但没这么全,学习学习
|
brucewoo 回复于:2005-04-25 14:48:51
|
真的很不错
|
温暖的夏季 回复于:2005-04-26 16:14:40
|
好贴子!!多些楼主!!!
|
silverwolf 回复于:2005-04-26 16:39:16
|
有句不太理解
for DIR in&nbs;sgp&nbp'''lib'''';l'''';ls|grpbpv&nbp'''lib''''`; do
.......
done
为什么不写成:
for DIR in `ls`; do
......
done
有什么区别?
|
FH 回复于:2005-04-26 23:31:10
|
[quote:3821ea2993="silverwolf"]有句不太理解
for DIR in&nbs;sgp&nbp'''lib'''';ls|grpbpv&nbp'''lib''''`; do
......
done
为什么不写成:
for DIR in `ls`; do
......
done
有什么区别?[/quote:3821ea2993]
lib需要先make
|
king1981 回复于:2005-04-27 13:34:39
|
无聊。。。。。。。。
|
yuxh 回复于:2005-04-27 13:49:33
|
[quote:e13e45f60d="king1981"]无聊。。。。。。。。[/quote:e13e45f60d]
年青人,不懂不要乱说
|
天祥星辰 回复于:2005-04-27 15:22:38
|
真的很不错 高手就是高手 敬礼 收藏
|
duke_gun 回复于:2005-04-27 17:27:32
|
[quote:e46df39909="king1981"]无聊。。。。。。。。[/quote:e46df39909]
多看看就有得聊了。我当初写Makefile时到SMTH上看了半天才转过弯来。FH谢谢!
|
landu_liu 回复于:2005-04-27 22:27:55
|
这在学这个呢,谢谢楼主
|
独行侠1 回复于:2005-04-28 09:59:17
|
这个比较有参考价值,已经放到自己的bolg里。在这和楼主说一声
|
dayou 回复于:2005-04-28 22:27:15
|
action = new (clean, scan, codegen, compile, link)
= update (scan, compile, link)
= remake (compile, link)
= label_build (clean, retrieve, scan, compile, link)
= clean (clean)
= get (retrieve)
= codegen (codegen)
|
foxmanzj 回复于:2005-05-08 16:56:14
|
建议想学make还是man make,man cc看看吧。更全面
|
albcamus 回复于:2005-05-08 17:04:16
|
[quote:8c00f3762e="foxmanzj"]建议想学make还是man make,man cc看看吧。更全面[/quote:8c00f3762e]
这话过分了点儿吧?make和cc的手册里有Makefile的写法?
|
dolink 回复于:2005-05-08 21:20:38
|
[quote:67c70a570d="king1981"]无聊。。。。。。。。[/quote:67c70a570d]
高手的话 沉默就是最高尚的
不要出语刺激人啊
很煞人意志的
|
BetonArmEE 回复于:2005-05-14 18:43:05
|
补充:
应用系统里推荐再加上~/tbin ~/tmp目录
tbin放的是专为系统写的工具程序,比如 备份日志 的脚本
tmp目录我就不说了
个人不同意见:
头文件存放目录名改成~/include
源代码文件存放目录结构
~/src/
~/src/AppA/ 应用程序A源代码文件目录
~/src/AppB/ 应用程序B源代码文件目录
~/libsrc/ 本系统专用库源代码文件目录
~/toolsrc/ 本系统工具源代码文件目录
如果有另外通用函数库(ū热鏳own了个open函数库为自己所用),建议另开一系统目录
我单位都这样管理系统目录的,偷偷的来与大家分享,呵呵 ^_^
|
mq110 回复于:2005-07-14 11:54:01
|
不错 收藏了.~
最开始的时候不会写makefile.现在会写了 感觉这些东西很有价值了.
|
prc 回复于:2005-07-14 17:56:47
|
收藏,赞!!
|
巡道工 回复于:2005-07-15 09:43:57
|
makefile 挺难的,在CSDN上看到了一个高手写得一个教程,各位兄台可以去看一下
about "makefile"命令
http://dev.csdn.net/article/20/20025.shtm
http://dev.csdn.net/user/haoel ------这是他的blog,是个牛的blog,是个牛 |
原文转自:http://www.ltesting.net
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
|