3

コマンド(fa2fb)で一連のファイル(フォーマットfaとしましょう)を別のフォーマット(fb)に変換する必要があります。各ターゲット fb は、1 つの fa ファイルのみに依存します。

データ構造は次のような形式です。

ソース:

./DATA/L1/fa/L1.fa
./DATA/L2/fa/L2.fa
...
./DATA/Ln/fa/Ln.fa

目標:

./DATA/L1/fb/L1.fb
./DATA/L2/fb/L2.fb
...
./DATA/Ln/fb/Ln.fb

makeで実装するにはどうすればよいですか?

私はこれを試しましたが、もちろんうまくいきませんでした:

./DATA/%/fb/%.fb :  ./DATA/%/fa/%.fb

    @fa2fb $< $@

データディレクトリを変更せずに簡単な解決策はありますか?

どうもありがとう!

4

3 に答える 3

2

二次拡張subst関数を使用して、前提条件がターゲット名のより複雑な関数として構築されるルールを作成します。

.SECONDEXPANSION:
DATA/%.fb: $$(subst fb,fa,$$@)
    @fa2fb $< $@

このアプローチは、ファイル名の他の場所では発生しないことを前提としていることに注意してください(これは、すべてのファイル名が整数fbの場合、の形式である場合に当てはまります)。DATA/Ln/fb/Ln.fbn

于 2011-07-13T05:10:35.663 に答える
1

これは、私が今までに書いた中で最もずさんな makefile かもしれません。

define template
 $(2) : $(1)
        echo hi
endef

sources=DATA/L1/fa/L1.fa DATA/L2/fa/L2.fa
$(foreach source,$(sources),$(eval $(call template,$(source),$(subst /fa/,/fb/,$(subst .fa,.fb,$(source))))))

アイデアは、マクロを定義してルールを生成し、 + を使用foreachevalcallソースごとに 1 回呼び出すことです。source は の最初の引数なcallので$(1)、マクロ内になります。2 番目の引数は、ソース ファイル名から宛先ファイル名への単なる変換です。$(2)マクロになります。

独自のルールに置き換えれecho hiば、準備完了です。そして、はっきりとした素晴らしいコメントを必ず書いてください。

于 2011-07-13T04:41:36.847 に答える
0

これは基本的にNemoの答えと同じです。完全なソース名のリストではなく、foreach単に を含むモジュールのリストを作成することで、呼び出しをもう少し読みやすくしようとしました。L1 L2 ... Ln

MODULES := $(notdir $(wildcard ./DATA/L*))

define rule
./DATA/$(1)/fb/$(1).fb: ./DATA/$(1)/fa/$(1).fa
    @fa2fb $< $@
endef

$(foreach module, $(MODULES), $(eval $(call rule,$(module))))
于 2011-07-13T12:43:43.290 に答える