日期:2014-05-16  浏览次数:20651 次

一个关于Makefile里面清除文件的问题
我在自己的工程里面需要使用一个外部的库,假设这个库为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存在的时候才执行

------解决方案--------------------
这里是支持shell判断的吧

试试
[ -f external/libtest/Makefile ] && $(MAKE) clean -C external/libtest
------解决方案--------------------
引用:
我的测试结果上面两个方法都有问题
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
//...执行其他命令




------解决方案--------------------
简单的方法是忽略些错误
将$(MAKE) clean -C external/libtest改为:(前面加个"-",即遇到错误也继续执行。)
-$(MAKE) clean -C external/libtest

没测试,应该是可行的。。既然只是用在lib中的清除而已,则可忽略此错误。用"-"
------解决方案--------------------
是个好办法,谢谢分享!