2013-03-11 65 views
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 dfor $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 

回答

3

for循环再次阅读:

for d in [...]; do make --directory=$f 

您是不是指$d,如

for d in [...]; do make --directory=$d 

所以,Makefile中应该看看:

for d in common/gcas_debug common/gcas_nvdata; \ 
do \ 
    make --directory=$d clean; \ 
done 
+0

感谢您的输入,我并不十分熟悉制作/ shell语法,所以我下面的“使用GNU管理项目做第三版”和他们使用的语法只是'd'而不是'$ d'。当我根据您的建议进行交换时,它现在会失败(请参阅编辑的新问题)。所以我想你对'$ d'是正确的,因为看起来更好,但它似乎仍然不像我的for循环语法。 – Mike 2013-03-11 21:09:03

+0

@Mike:您不会替换for循环标题中的d,而是替换正文中的$ f。循环变量是'$ d',而不是'$ f'。 – thiton 2013-03-11 21:10:32

+0

就是这样,谢谢!这本书提到'$$ f'是目录或文件的特殊参数,所以我对此感到困惑,但'$ d'解决了它! – Mike 2013-03-11 21:23:06