3
我在创建一个Makefile,它可以在调用时递归地构建/清理。我有构建工作,但我得到的干净命令错误。在Makefile中递归清理
我的目录结构是这样的:
main
|
+-- Makefile
|
+-- common
| |
| +-- gcas_debug
| | |
| | +-- Makefile
| + -- gcas_nvdata
| |
| +-- Makefile
+-- gcinit
+-- Makefile
当我在主目录中调用make
它经历和我想要建立的一切,但是当我打电话make clean
它的作用:
[email protected]:~/iCOM/framework$ make clean
for d in common/gcas_debug common/gcas_nvdata; \
do \
make --directory=$f clean; \
done
make: the `-C' option requires a non-empty string argument
Usage: make [options] [target] ...
Options:
-b, -m Ignored for compatibility.
...
我不明白为什么干净的命令不工作...有什么建议吗?
满(主)的Makefile:
lib_gcas_debug := common/gcas_debug
lib_gcas_nvdata := common/gcas_nvdata
libraries := $(lib_gcas_debug) $(lib_gcas_nvdata)
DESTDIR=$(PWD)/output
bindir=
gc_init := gcinit
EXE := $(gc_init)/$(gc_init)
.PHONY: all $(gc_init) $(libraries)
all: $(gc_init)
$(gc_init) $(libraries):
$(MAKE) [email protected]
$(gc_init): $(libraries)
install: $(gc_init)
install -d -m 0755 $(DESTDIR)$(bindir)
install -m 0755 $(EXE) $(DESTDIR)$(bindir)
clean:
for d in $(libraries); \
do \
$(MAKE) --directory=$$f clean; \
done
编辑:如果我换了for d
与for $d
我得到相反:
[email protected]:~/iCOM/framework$ make clean
for in common/gcas_debug common/gcas_nvdata; \
do \
make --directory= clean; \
done
/bin/sh: -c: line 0: syntax error near unexpected token `common/gcas_debug'
/bin/sh: -c: line 0: `for in common/gcas_debug common/gcas_nvdata; \'
make: *** [clean] Error 1
感谢您的输入,我并不十分熟悉制作/ shell语法,所以我下面的“使用GNU管理项目做第三版”和他们使用的语法只是'd'而不是'$ d'。当我根据您的建议进行交换时,它现在会失败(请参阅编辑的新问题)。所以我想你对'$ d'是正确的,因为看起来更好,但它似乎仍然不像我的for循环语法。 – Mike 2013-03-11 21:09:03
@Mike:您不会替换for循环标题中的d,而是替换正文中的$ f。循环变量是'$ d',而不是'$ f'。 – thiton 2013-03-11 21:10:32
就是这样,谢谢!这本书提到'$$ f'是目录或文件的特殊参数,所以我对此感到困惑,但'$ d'解决了它! – Mike 2013-03-11 21:23:06