免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10399 | 回复: 20
打印 上一主题 下一主题

一套完整的makefile样板 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-22 22:45 |只看该作者 |倒序浏览
近来,经常看到有人询问makefile的写法,这里根据本人经验给出一个应用系统的完整例子,便于各位参考。
应用系统的目录结构如下:

  1. ~/bin        可执行程序目录
  2. ~/etc        配置文件目录
  3. ~/inc        头文件目录
  4. ~/lib        函数库文件目录
  5. ~/log        日志文件目录
  6. ~/src        源程序文件目录
  7. ~/src/lib        函数库源程序目录
  8. ~/src/lib/LIB_1        函数库libLIB_1源程序目录
  9. ~/src/APP_A        子系统APP_A源程序目录
  10. ~/src/APP_A/mod_a        子系统APP_A模块mod_a源程序目录
  11. ~/.profile
  12. ~/makefile
复制代码

~/makefile文件内容如下:

  1. all:
  2.         @MakeSubDir() \
  3.         { \
  4.                 for DIR in `ls|grep 'lib';ls|grep -v 'lib'`; do \
  5.                         if [ -d $${DIR} ]; then \
  6.                                 cd $${DIR}; \
  7.                                 MakeSubDir; \
  8.                                 if [ -f makefile -o -f Makefile ]; then \
  9.                                         echo ""; \
  10.                                         pwd; \
  11.                                         make all; \
  12.                                 fi; \
  13.                                 cd ..; \
  14.                         fi; \
  15.                 done; \
  16.         }; \
  17.         MakeSubDir

  18. tar:
  19.         @tar -cf `date +%Y%m%d-%H%M%S`.tar .profile `ls|grep -v '.tar'`
复制代码

~/src/lib/LIB_1/makefile文件内容如下:

  1. ALL:        INFO all

  2. BASEDIR        = $(HOME)
  3. INC        = $(BASEDIR)/inc
  4. LIB        = $(BASEDIR)/lib

  5. PRDNAME        = $(LIB)/libLIB_1

  6. PRODUCT        = $(PRDNAME).a $(PRDNAME).so

  7. OBJS        = LIB_1_f1.o LIB_1_f2.o

  8. AR        = ar <特定平台ar可选参数>;
  9. CC        = cc <特定平台cc可选参数>;

  10. all:        $(PRODUCT)

  11. $(PRDNAME).a:        $(OBJS)
  12.         @echo "  Making $@ ..."
  13.         @$(AR) -r $@ $(OBJS)

  14. $(PRDNAME).so:        $(OBJS)
  15.         @echo "  Making $@ ..."
  16.         @$(CC) -G -o $@ $(OBJS)

  17. .c.o:        *.h $(INC)/*.h
  18.         @echo "  Compiling $< ..."
  19.         @$(CC) -c -I$(INC) $<

  20. INFO:
  21.         @echo "  make all - same with 'make' except this message"
  22.         @echo "  make clear - remove object files"
  23.         @echo "  make clean - remove all object and target files"
  24.         @echo ""

  25. clear:        FORCE
  26.         @rm -f *.o

  27. clean:        FORCE clear
  28.         @rm -f $(PRODUCT)

  29. FORCE:
复制代码

~/src/APP_A/mod_a/makefile文件内容如下:

  1. ALL:        INFO all

  2. BASEDIR        = $(HOME)
  3. INC        = $(BASEDIR)/inc
  4. LIB        = $(BASEDIR)/lib
  5. BIN        = $(BASEDIR)/bin

  6. MODULE        = $(BIN)/APP_A_mod_a
  7. TESTER        = APP_A_mod_a_t
  8. PRODUCT        = $(SERVER) $(TESTER)

  9. CC        = cc <特定平台cc可选参数>;

  10. all:        $(PRODUCT)

  11. $(MODULE):        APP_A_mod_a.o
  12.         @echo "  Making $@ ..."
  13.         @$(CC) $? -o$@ -L$(LIB) -lLIB_1

  14. APP_A_mod_a_t:        APP_A_mod_a_t.o
  15.         @echo "  Making $@ ..."
  16.         @$(CC) $? -o$@ -L$(LIB) -lLIB_1

  17. .c.o:        *.h $(INC)/*.h
  18.         @echo "  Compiling $< ..."
  19.         @$(CC) -c -I$(INC) $<

  20. INFO:
  21.         @echo "  make all - same with 'make' except this message"
  22.         @echo "  make clear - remove object files"
  23.         @echo "  make clean - remove all object and target files"
  24.         @echo ""

  25. clear:        FORCE
  26.         @rm -f *.o

  27. clean:        FORCE clear
  28.         @rm -f $(PRODUCT)

  29. FORCE:
复制代码

使用方法:
1.在主目录下使用'make'命令能够首先建立函数库,然后建立所有目标。
2.在主目录下使用'make tar'命令能够对整个系统进行打包,生成的文件以日期和时间命名。
3.在最下层子目录中直接使用'make'命令会首先给出用法提示,然后建立本目录所有目标。
4.在最下层子目录中使用'make all'命令不出现提示信息,直接建立本目录所有目标。
5.在最下层子目录中使用'make clear'命令可以清除本目录的所有.o文件。
6.在最下层子目录中使用'make clean'命令可以清除本目录的所有.o文件和建立的所有目标。

注:在某些环境下,由于make中调用shell命令的机制,可能不支持递归。

论坛徽章:
0
2 [报告]
发表于 2005-04-22 22:57 |只看该作者

一套完整的makefile样板

收藏了,一直也没静下心学习makefile的写法:(

论坛徽章:
0
3 [报告]
发表于 2005-04-23 13:52 |只看该作者

一套完整的makefile样板

我们现在的项目里,我写的和这个也差不多哦,但没这么全,学习学习

论坛徽章:
0
4 [报告]
发表于 2005-04-25 14:48 |只看该作者

一套完整的makefile样板

真的很不错

论坛徽章:
0
5 [报告]
发表于 2005-04-26 16:14 |只看该作者

一套完整的makefile样板

好贴子!!多些楼主!!!

论坛徽章:
0
6 [报告]
发表于 2005-04-26 16:39 |只看该作者

一套完整的makefile样板

有句不太理解
for DIR in `ls|grep 'lib';ls|grep -v 'lib'`; do
......
done

为什么不写成:
for DIR in `ls`; do
......
done

有什么区别?

论坛徽章:
0
7 [报告]
发表于 2005-04-26 23:31 |只看该作者

一套完整的makefile样板

原帖由 "silverwolf" 发表:
有句不太理解
for DIR in `ls|grep 'lib';ls|grep -v 'lib'`; do
......
done

为什么不写成:
for DIR in `ls`; do
......
done

有什么区别?

lib需要先make

论坛徽章:
0
8 [报告]
发表于 2005-04-27 13:34 |只看该作者

一套完整的makefile样板

无聊。。。。。。。。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-04-27 13:49 |只看该作者

一套完整的makefile样板

[quote]原帖由 "king1981"]无聊。。。。。。。。[/quote 发表:

年青人,不懂不要乱说

论坛徽章:
0
10 [报告]
发表于 2005-04-27 15:22 |只看该作者

一套完整的makefile样板

真的很不错 高手就是高手 敬礼  收藏
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP