2017-02-06 5 views
0

GNU makefileにはマクロ(変数)が必要です。これは、いくつかの最上位ディレクトリで指定されたマスクによってファイル/ディレクトリを検索します。たとえば、現在の作業ディレクトリは/ home/sysop/powerup/native/apps/tooplです。/home/sysop/powerup/native/SDK/buildディレクトリにも存在します。私はSDK /ディレクトリの現在の場所に相対的な場所を見つけるしたい。だから、私は、そのための再帰的なマクロを書いた:GNU makefileで変数を展開する際の再帰の深さを制限する方法は?

upfind = $(if $(wildcard $(1)),$(1),$(if $(filter $(abspath $(1)),$(abspath ../$(1))),$(error "can't find $(1)"),$(call upfind,../$(1)))) 

をそして私は今の方法を以下にそれを使用することができます。

relpath = $(call upfind, ../SDK/build) 

そして、これは値を割り当て「../../SDK/build」RELPATHへ変数。

すべて罰金ですが、私はそのようなマクロを複数のメイクファイルに伝播する必要がありますので、私はそれを最小限に抑える方法を見ています(マクロをアップフェインド)。私は、誰も私はこのマクロをよりコンパクトに書き直す方法を提案してくれることを願っています。たとえば、あるレベルで再帰を制限するだけで十分です。$(abspath)マクロを使用する必要はありません。しかし、どのようにして再帰レベルや測定引数($(1))の長さを決定できますか?

答えて

0

ここで何を尋ねているのかわからないので、これはおそらく答えではありません。

再帰制限は十分に簡単です。 まず、片付けのビット:

assert-root = $(if $(filter $(abspath $1),$(abspath ../$1)),$(error Can't find $1)) 
upfind = $(if $(wildcard $1),$1,${assert-root}$(call upfind,../$1)) 

(。$assert-rootが呼び出されていない、それは単にexisiting $1を継承する方法に注意してください) たちは再帰の深さを制限することができますどのようにそれは少し明確にします:ちょうど絶えず延長を渡します$2

maxup := 3 
assert-depth = $(if $(filter ${maxup},$(words $2)),$(error Can't find [$1] within ${maxup} parents)) 
upfind = $(if $(wildcard $1),$1,${assert-depth}$(call upfind,../$1,_ $2)) 

あなたは

upfind = $(if $(wildcard $1),$1,${assert-depth}${assert-root}$(call upfind,../$1,_ $2)) 
が好きであれば、両方を同時に行います
関連する問題