一个关于Makefile里面清除文件的问题

mathe 2013-02-25 10:26:01
我在自己的工程里面需要使用一个外部的库,假设这个库为libtest,放在目录external/libtest下面
而编译这个库,我们需要先运行其下面的configure文件产生Makefile,然后make之。同样如果要清楚这个工程,可以使用Make clean来清除。
于是我在自己的Makefile里面添加:

external/libtest/Makefile:
cd external/libtest/configure

external/libtest/libtest.lib: external/libtest/Makefile
$(MAKE) -C external/libtest

clean:
$(MAKE) clean -C external/libtest
****//and other clean options

问题就处在这里,我另外一个同事从SVN里面更新代码以后,直接使用
make clean
来清除临时文件
由于这个时候external/libtest下面的Makefile还没有产生
$(MAKE) clean -C external/libtest
报错了。
大家有什么好的建议处理这个问题?也就是说我这里实际需要的是一个条件编译,只有文件external/libtest/Makefile存在的时候才执行
...全文
1036 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathe 2013-03-06
  • 打赏
  • 举报
回复
引用 7 楼 fdl19881 的回复:
简单的方法是忽略些错误 将$(MAKE) clean -C external/libtest改为:(前面加个"-",即遇到错误也继续执行。) -$(MAKE) clean -C external/libtest 没测试,应该是可行的。。既然只是用在lib中的清除而已,则可忽略此错误。用"-"
这个方法测试过,应该可行,就是会显示如下信息: make: [test.o] Error 1 (ignored)
sfd1234 2013-03-05
  • 打赏
  • 举报
回复
是个好办法,谢谢分享!
fdl19881 2013-03-01
  • 打赏
  • 举报
回复
简单的方法是忽略些错误 将$(MAKE) clean -C external/libtest改为:(前面加个"-",即遇到错误也继续执行。) -$(MAKE) clean -C external/libtest 没测试,应该是可行的。。既然只是用在lib中的清除而已,则可忽略此错误。用"-"
mathe 2013-02-28
  • 打赏
  • 举报
回复
$(auto_generate_folder)这个目录总是存在的。 另外,根据Makefile的规则,如果依赖的对象不存在,会导致报错而不是仅仅不执行。你对你自己的方法试验过了吗?
Franklin 2013-02-28
  • 打赏
  • 举报
回复
引用 5 楼 mathe 的回复:
$(auto_generate_folder)这个目录总是存在的。 另外,根据Makefile的规则,如果依赖的对象不存在,会导致报错而不是仅仅不执行。你对你自己的方法试验过了吗?
没有,你说得对的,我没去试过,我希望没误导你,光改那些应该不够 楼主还是考虑在利用configure 机制,在生成makefile的时候就拿掉不需要的东西 也许是个方法。。。
Franklin 2013-02-26
  • 打赏
  • 举报
回复
引用 3 楼 mathe 的回复:
我的测试结果上面两个方法都有问题 justkk的方法Make会报错,但是没有说明具体的错误原因 yellow_hill的方法同样不可以,如果make -C后面的目录非法,也是要报错的,于是Make过程就中断了。 不过我自己测试发现可以使用空命令,于是我们可以使用 ifeq( $(wildcard external/libtest/Makefile), ) ……
利用makefile的层次结构, 其实就是这个思路,把实际的命令用变量来代替,前文只考虑了你的目录 你可以在上一层的makefile里面,把你当前的可能生成的makefile看成变量来使用, 也就是把你的make(因为也是生成的)用变量代替,这样没生成根本就不可能执行 上层的makefile本例可以写成:

auto_generated_folder := $(your_system_path)/external/libtest
low_level_makefile := $(auto_generated_folder)/Makefile //这里是你将可能生成的makefile的位置
$(low_level_makefile): $(auto_generated_folder) //执行你的makefile
//...执行其他命令
mathe 2013-02-26
  • 打赏
  • 举报
回复
我的测试结果上面两个方法都有问题 justkk的方法Make会报错,但是没有说明具体的错误原因 yellow_hill的方法同样不可以,如果make -C后面的目录非法,也是要报错的,于是Make过程就中断了。 不过我自己测试发现可以使用空命令,于是我们可以使用 ifeq( $(wildcard external/libtest/Makefile), ) CLEAN_LIBTEST = else CLEAN_LIBTEST = $(MAKE) -C external/libtest clean endif clean: $(CLEAN_LIBTEST) ****//other clean command
Franklin 2013-02-25
  • 打赏
  • 举报
回复
解决这个问题很简单的,你这里,只要换个写法的顺序就好: 首先: 利用make -c的特性,你先定一个一个你的folder的变量,然后再make -c这个变量 很简单,如果没有生产目录,那么make -c 就不会正确执行进去,所以也不用担心报错: 所以,你的例子可以这样改写: auto_generated_folder := $(your_system_path)/external/libtest #注意clean的位置改变了 $(MAKE) -C $(auto_generated_folder) clean
justkk 2013-02-25
  • 打赏
  • 举报
回复
这里是支持shell判断的吧 试试 [ -f external/libtest/Makefile ] && $(MAKE) clean -C external/libtest

23,223

社区成员

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

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