3

呼び出されたときに再帰的にビルド/クリーンアップできるMakefileを作成しようとしています。ビルドは機能していますが、cleanコマンドでエラーが発生します。

私のディレクトリ構造は次のようなものです。

main
 |
 +-- Makefile
 |
 +-- common
 |      |
 |      +-- gcas_debug
 |      |      |
 |      |      +-- Makefile
 |      + -- gcas_nvdata
 |             |
 |             +-- Makefile
 +-- gcinit
        +-- Makefile

メインディレクトリを呼び出すmakeと、必要に応じてすべてが処理されてビルドされますが、呼び出すmake cleanと次のようになります。

mike@mike-VirtualBox:~/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.
...

cleanコマンドが機能しない理由がわかりません...何か提案はありますか?
フル(メイン)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) --directory=$@

$(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

mike@mike-VirtualBox:~/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
4

2 に答える 2

4

これは私のために働いた:

SUBDIRS := foo bar baz

.PHONY: subdirs $(SUBDIRS) clean all

subdirs: $(SUBDIRS) 

$(SUBDIRS):
    $(MAKE) -C $@ $(MAKECMDGOALS)

clean: $(SUBDIRS)
    rm -rf dist

dist: $(SUBDIRS) dist/.build_marker

dist/.build_marker: 
    mkdir -p dist
    for d in $(SUBDIRS) ; do cp $$d/dist/* dist ; done
    touch dist/.build_marker

ファイルをコピーするには、 distターゲットのforループを使用するだけです。これによりmake -j、読みやすいMakefileは言うまでもなく、ビルドの並列処理が可能になります。

于 2018-09-25T17:34:46.413 に答える
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
于 2013-03-11T20:06:04.663 に答える