2012-02-13 12 views
0

依存関係のあるMakefileを設定しようとしています。依存関係は変数で指定されます。Makefile Linux各変数の関数の実行方法

MATH_VER=1.1 
EXTERNAL_DEPS=MATH GC LOG 

利用可能なものに基づいて各外部ライブラリの場所を把握しようとする機能を実行します。 だから、私はこのdosent仕事

checklib = ifeq ($(wildcard $(ROOT)/$(var)/$(var)_VER),) 
echo 'Bad dir' 
$(var)_ROOT=$SOMEOTHERDIR 
else 
echo 'Good dir' 
$(var)_ROOR=$(ROOT)/$(var)/$(var)_VER 
endif 

をチェックしない機能を持って、

all:setversion myexe 
setversion: 
    $(foreach CHKLIB, $(EXTERNAL_DEPS), $(call checklib, $(CHKLIB))) 

をルールsetversionを追加しました - しかし、私はそれがImが探しているものの良いアイデアを与えると思います。どのようにこれを達成することができますか?このsiteは役立つかもしれない おかげ

+0

遅かれ早かれ、あなたはautotoolsのを必要としている、なぜ今学んで起動しない:http://sourceware.org/autobook/autobook/autobook_toc.html – yasar

+0

あなたが外で変数を 'whatever_ROOT'使用しますか'setversion'ルール? – Beta

+0

はいexecをビルドするときにMATH_ROOTが使用される – excalibur

答えて

0

注例では、foreachの呼び出しの結果は、保存されたforeachループ内の各関数を呼び出すのではない副作用れているものであること。

2

編集:これを私のシステムでテストしたところ、あなたが必要とするように思えました。

define set_deps 
     ifeq ($(wildcard $(ROOT)/$(1)/$($(1)_VER)/),) 
       $(1)_ROOT=$(DEFAULT_DIR) 
     else 
       $(1)_ROOT=$(ROOT)/$(1)/$($(1)_VER)/ 
     endif 
endef 


$(foreach lib, $(EXTERNAL_DEPS), $(eval $(call set_deps,$(lib)))) 

$(foreach lib, $(EXTERNAL_DEPS), $(eval $(info $(lib) => $($(lib)_ROOT)))) 

documentation for the eval functionを必ず確認してください。

また、可能なディレクトリのリストと照合したい場合は、以下を使用することができます。

define set_deps 
    $(1)_ROOT = $(firstword $(wildcard $(ROOT)/$(1)/$($(1)_VER)/) $(DEFAULT_DIR)) 
endef 
+0

ありがとう。できます。しかし、これを "setversion"のコマンドセクションに追加するか、コマンドに入る前に追加しますか?これを前に追加していますが、動作しますが、条件付きの終了や印刷を試みて、いつも印刷しているようです。例:elseセクションに$(info WARN Missing dir)を追加しましたが、条件に関係なく常に出力されます。私は "exit"を追加しました。これは決して – excalibur

+0

を終了しませんでした。これは 'setversion'コマンドの代わりに使用することを意図していました。 また、文法 '$(1)_ROOT = $(ワイルドカード$(ROOT)/ $ならば1)/ $($(1)_VER)/)、$(ROOT)/ $(1)_VER)/ $(info hello)、$(DEFAULT_DIR)$(info world)) '現在の構文ではなく、評価されるブランチが1つしかないことがわかります。私の推測は条件付きのmakeが両方のブランチを解釈するか、バグを見つけました。 –

+0

さらなる質問があなたに帰りがないmakeの奇妙で暗い部分につながることを私は警告する必要があります。極限の注意を払ってください。 –

関連する問題