8

複数のディレクトリでタスクを実行したいのですが、これまで「makefileのような」ソリューションは見つかりませんでした。これはよくある質問であり、サブmakfileなどで解決する方法は知っていますが、もっと簡単なものを探しています。

する代わりに

copy: 
     cd module1 && mkdir foo
     cd module2 && mkdir foo
     cd module3 && mkdir foo

のようなものが欲しいのですが

directories = module1 module2 module3

copy: $(directories)
     cd $< && mkdir foo

ただし、受信者は最初のディレクトリで1回だけ呼び出されるため、これは機能しません。私はこのソリューションを思いつきましたが、これは機能しますが、おそらくMakefilesのスタイルではありません。

directories = module1 module2 module3

copy: 
     for d in $(directories); do cd $$d && mkdir foo && cd ..; done

どうすればこれをもっとうまく行うことができますか?

4

2 に答える 2

6

これを行う方法はたくさんあります。

プレフィックスをハードコーディングせずに、Andrew が提案することを行うことができます。

directories = module1 module2 module2

%/foo: ; mkdir -p -- "$@"

copy: $(addsuffix /foo,$(directories))

を与える

$ make -n copy
mkdir -p -- "module1/foo"
mkdir -p -- "module2/foo"
mkdir -p -- "module3/foo"

copymakefile からターゲットを生成することもできます。

directories = module1 module2 module2

define copy-target
  copy:: ; cd $1 && mkdir foo
endef

$(foreach dir,$(directories),$(eval $(call copy-target,$(dir))))

これは与える:

$ make -n copy
cd module1 && mkdir foo
cd module2 && mkdir foo
cd module3 && mkdir foo

ターゲットではなく、コマンドを生成することもできます。

directories = module1 module2 module2

copy: ; $(foreach dir,$(directories),(cd $(dir) && mkdir foo) &&) :

その結果、

$ make -n copy
(cd module1 && mkdir foo) && (cd module2 && mkdir foo) && (cd module3 && mkdir foo) && :
于 2012-11-29T20:00:34.113 に答える
2

Makefiles では、ファイルを作成するたびに、ファイルの名前をターゲットとしてルールを作成し、ターゲット ファイルを作成するようにコマンドを与えます。

copy: module1/foo module2/foo module3/foo

module%/foo:
        mkdir $@

重複を避けるために少しパラメータ化したい場合は、次のように書くこともできます

MODULE_NUMBERS = 1 2 3

copy: ${MODULE_NUMBERS:%=module%/foo}

module%/foo:
        mkdir $@
于 2012-11-29T16:47:09.653 に答える