3

私は愚かかもしれませんが、Makefile で最も基本的な変数の割り当てを行うことができません。

TEST = $(pwd);

all:
    echo $(TEST)

FreeBSD (v9.1) で Bash (v4.2.42) から「make all」を実行すると、次のようになります。

echo

私が何を台無しにしているのか分かりません。$(shell ...) を使用して変数を割り当てようとしましたが、同じ結果が得られました。

バックティック (`) を使用すると、基本的な代入は機能しますが、結果は保存されず、コマンドが保存されます。これは、次の Makefile の例では壊れています。

SERVERIP = `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}'`

all:
    echo $(SERVERIP)
    sed -e 's/%LISTENIP%/${SERVERIP}/g' test.conf > work/test.conf.tmp

結果は次のとおりです。

[pete@pete] ~/make
echo `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $2}'`
10.128.28.151
sed -e 's/%LISTENIP%/`ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $2}'`/g' test.conf > work/test.conf.tmp
sed: 1: "s/%LISTENIP%/`ifconfig  ...": unescaped newline inside substitute pattern
*** [all] Error code 1

基本的な変数の割り当てが機能しているように見えますが、結果を sed に挿入すると、結果ではなくコマンド全体が挿入され、壊れます!

何か案は?

ピート。

4

3 に答える 3

4

makefileには次のものが含まれます。

TEST = $(pwd);

all:
    echo $(TEST)

make最初の行は、変数の値pwdとセミコロンをmake変数に割り当てますTEST。次に、ルールはそれをエコーし​​ます。あなたは、それがと$(...)の両方にとって重要であることを忘れたと思います。コマンドの出力をエコーする場合は、2ドルを使用して、1ドルに拡張します。makeshellpwdmake

TEST = $$(pwd)

all:
    echo $(TEST)

シェルコマンドの出力をmake変数に取り込むには、GNUmake拡張機能を使用する必要があります。使用中の拡張機能は2つあります。使用時点ではなく定義時点で:=の値を評価する即時割り当て。SERVERIPこれは、シェルコマンドを実行して$(shell ...cmd...)その出力をキャプチャするために使用されます。

SERVERIP := $(shell ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}')

all:
    echo ${SERVERIP}
    sed -e 's/%LISTENIP%/${SERVERIP}/g' test.conf > work/test.conf.tmp

これは機能するはずです。正規表現の改行に関する元のエラーsedは奇妙です。バックティックは、ifconfigパイプラインの出力から末尾の改行を削除する必要があります。ただし、実際に複数の行が返された場合は、内部に改行が残っているため、からの苦情が正当化されsedます。

これにより、苦情が発生します。

SERVERIP = `printf "%s\n" a b c`

all:
    echo $(SERVERIP)
    sed -e "s/%LISTENIP%/${SERVERIP}/g" test.conf > work/test.conf.tmp

これは機能します:

SERVERIP = `printf "%s\n" c`

all:
    echo $(SERVERIP)
    sed -e "s/%LISTENIP%/${SERVERIP}/g" test.conf > work/test.conf.tmp

FreeBSDを使用しているので、GNUを持っていない可能性がありますmake。その場合、次のことを行う必要があります。

  1. ifconfigコマンドパイプラインが1行の出力のみを生成することを確認してください。
  2. 次のようなコマンドを使用makeします。

    SERVERIP = `ifconfig em0 | grep -E 'inet.[0-9]' | awk '{ print $$2}'`
    
    all:
        echo ${SERVERIP}
        sed -e "s/%LISTENIP%/${SERVERIP}/g" test.conf > work/test.conf.tmp
    

    makeこれは、提供された条件1が満たされているすべてのバージョンで機能するはずです。

于 2013-03-23T11:52:34.913 に答える
1

これは、あなたのものに似たテスト makefile です。コマンドはifconfig$(shell ...) コマンドに配置され、結果は に格納されSERVERIPます。

TOP:= $(shell pwd)
SERVERIP:= $(shell ifconfig en1 | grep -E 'inet.[0-9]' | awk '{ print $$2}')
LISTENIP:=240.12.4.63

all:
     echo $(SERVERIP)
     sed -e 's/$(LISTENIP)/$(SERVERIP)/g' test.conf > work/test.conf.tmp
于 2013-03-23T11:45:40.027 に答える