Chinaunix首页 | 论坛 | 博客
  • 博客访问: 389166
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 560
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-10 08:38
文章分类
文章存档

2016年(32)

2015年(48)

我的朋友

分类: LINUX

2015-10-19 09:35:44

写了个makefile:


  1. #goto every sub foler(single book)'s src dir to do 'make xxx' action
  2. clean clean_all clean_release all release release_copy:
  3.     @echo "Current path="`pwd`;
  4.     @echo "LS_OUTPUT="$(LS_OUTPUT);
  5.     for each_item in $(LS_OUTPUT); \
  6.     do \
  7.         if [ -d $$each_item/src ]; then \
  8.                 cd $$each_item/src && \
  9.                 echo `pwd` && \
  10.                 if [ -f Makefile ]; then \
  11.                     make $@; \
  12.                 fi; \
  13.                 cd ../..; \
  14.         fi; \
  15.     done;




然后对应的src中的子makefile中,是去执行对应的动作。

比如执行make release_copy,其会对于每一个子文件夹去执行此make release_copy。

现在问题是,对于某个子文件夹下面,单独执行make release_copy,是会出现错误,并且makefile会正常的停止继续执行的。

但是对于顶层的去执行makefile release_copy的话,其虽然也同样显示错误,但是却会继续执行后续的动作。

【解决过程】

1。默认makefile遇到错误就会停止,对于此处却失效了。所以很是悲剧。

2.到网上找资料,找到这个9.6 Testing the Compilation of a Program,其中倒是有关于想要在出错的时候,仍然让其继续运行,有解释,即用-k参数。

但是我此处就是已经有了此现象了,想不让其遇到错误却继续运行,但是却没有相应的参数可以用。

3.后来找到:,其指出了原因,并给出了解决方法,

那是因为对于子makefile执行的结果,没有判断返回值,所以导致子makefile错误的时候,其实是停止了,然后返回错误值了,但是上层的makefile却没有判断返回值,导致会继续执行,所以表现形式就是虽然makefile执行过程中出错,但是却还是继续运行。

然后照葫芦画瓢去改为:

  1. #goto every sub foler(single book)'s src dir to do 'make xxx' action
  2. clean clean_all clean_release all release release_copy:
  3.     @echo "Current path="`pwd`;
  4.     @echo "LS_OUTPUT="$(LS_OUTPUT);
  5.     for each_item in $(LS_OUTPUT); \
  6.     do {\
  7.         if [ -d $$each_item/src ]; then \
  8.                 cd $$each_item/src && \
  9.                 echo `pwd` && \
  10.                 if [ -f Makefile ]; then \
  11.                     make $@; \
  12.                 fi; \
  13.                 cd ../..; \
  14.         fi; \
  15.         } || exit "$$?";\
  16.     done;




然后注意到,是需要在对子makefile返回值做判断,所以又改为:

点击(此处)折叠或打开

  1. #goto every sub foler(single book)'s src dir to do 'make xxx' action
  2. clean clean_all clean_release all release release_copy:
  3.     @echo "Current path="`pwd`;
  4.     @echo "LS_OUTPUT="$(LS_OUTPUT);
  5.     for each_item in $(LS_OUTPUT); \
  6.     do \
  7.         if [ -d $$each_item/src ]; then \
  8.                 cd $$each_item/src && \
  9.                 echo `pwd` && \
  10.                 if [ -f Makefile ]; then \
  11.                     make $@ || exit "$$?"; \
  12.                 fi; \
  13.                 cd ../..; \
  14.         fi; \
  15.     done;




如此,就可以了,遇到错误,就会停止了。

【总结】

makefile执行错误,结果还会继续执行,此处是由于是上层makefile调用下层子makefile,子makefile执行出错,停止返回到上层后,上层没有判断返回值,导致还是会继续执行。

解决办法是,对于子makefile调用,判断返回值,

比如将:

make $@;

改为:

make $@ || exit "$$?";

这样make执行错误返回值为非0,然后就可以执行后面的exit而退出了。

阅读(2314) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~