2016-06-15 11 views
0

ある自体、ファイルの内容から動的目標を:GNUは作る:私はこのような何かをやってみたかったターゲット

target_list = target.list 
targets = $(shell cat $(target_list)) # assume this yields a list of "*.o" 
sources = $(subst .o,.c,$(targets)) 

all: $(target_list) $(targets) 

$(target_list): 
    some_command > [email protected] 

$(targets): %.o: %.c 

しかし、make(実際cat)しようとすると、target.listが見つからないと文句を言い$(targets)を定義します。これを回避する方法はありますか?

私は上記の例については、以下を使用することができます理解:

targets = $(shell some_command) 

を本当の単語の状況は、単純なcatよりも複雑で、some_command高価であり、後期の他の用途を持っているので、私は本当にしたいですその出力を保存したい。

ありがとうございました。

+1

これはXY問題のような匂いがします。もし 'some_command'が実際に何をしているのか、なぜ高価なのかについてもっと詳しく解説すれば、より良い答えを得るかもしれません。 – user657267

答えて

1

some_commandがオブジェクトファイル名のスペース区切りリストを生成する場合、これは機能します。 (フォーマットは何か他のものであるならば、我々はそれを回避することができます。)

include target.list 

all: $(targets) 

$(targets): %.o: %.c 

target.list: 
    some_command | sed 's/^/targets:=/' > [email protected] 

メイクは、それがinclude target.listなければならないことを見て、そのファイルを再構築するためのルールがあること、それはそうしてから行うようにしようとしたときやり直す。 target.listのルールでは、リストに "targets:="が追加されているので、ファイル全体をそのまま引き出すことができます。

+0

'-include'を使うと、' target.list'が存在しなくても動作します。 –

+0

@Beta Thanks!前に 'include'について知りませんでした。これはまさに私が必要なものです。 –

関連する問題