一个关于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
------解决方案--------------------
利用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中的清除而已,则可忽略此错误。用"-"
------解决方案--------------------是个好办法,谢谢分享!