1

私は次の(非常に単純化された)Makefileを持っています:

# Makefile

MAKESH=shell
USER=$($MAKESH logname)

これは、コマンドが呼び出さUSERれたかのように、ログイン名を変数に格納することを目的としています。$(shell logname)しかし、これは起こりません。make変数の評価方法が原因だと思います。

誰かがこれまたは可能な回避策についてもう少し洞察を持っていますか?つまり、makeそれ$MAKESHが実際にshellコマンドであると明示的に伝えますか?

ありがとう。

編集

次の例を考えてみましょう。

#parent.mk

...
include child.mk
...

-------------------
#child.mk

export $(shell logname)/path1
export $(shell logname)/path2

-------------------
#bash_script.sh

...
source child.mk
...

(この例では、child.mkのソーシングは失敗します)

基本的に、私がやりたかったのは、現在のユーザーに応じてパス名をエクスポートするファイルを作成することです。構文は、makefileとbashスクリプトの両方で有効である必要があります。これは、両方の場所からインクルード/ソースできるためです。

また、これらのファイルはより大きなプロジェクトの一部であり、相互接続が少し混乱しているため、これらのファイルに微妙な変更を加えたいと思いました。

私はついにこれで行くことにしました:

#parent.mk

...
export logname=$(shell logname)
include child.mk
...

-------------------
#child.mk

export $(logname)/path1
export $(logname)/path2

-------------------
#bash_script.sh

...
source child.mk
...

これはかなりハッキーで、少し危険ですが、機能します。よりエレガントな方法/アプローチをご存知の場合は、お知らせください。

最後に、事前に編集された質問に有効な解決策(および警告)に感謝します。

4

2 に答える 2

5

構文は次のようになります

USER = $(shell logname)

なぜ「シェル」を変数に入れて関数構文を台無しにしたいのかわかりませんが、本当に主張する場合は、次のことを試してください。

$(eval USER=$$($MAKESH logname))

ただし、$(eval ...)関数は、上記の最初の形式に変換するだけなので、無駄な作業になります。(あなたが本当にあなたの例が示唆するよりもトリッキーなことをしようとしているのでない限り。)

于 2013-01-28T16:51:51.380 に答える
2
MAKESH=shell
$(eval USER=$$($(MAKESH) logname))
$(info USER is $(USER))

可能であれば避けてください。

于 2013-01-28T17:01:34.417 に答える