2

次の状況があります: test.mk
のソース:

test_var := test_me

test.shのソース:

$test_var = some method that get test_var from .mk
if [ "$test_var" = "test_me" ] ; then    
   do something
fi

他の解析手法を使用せず.mkに、ファイルからファイルに変数を取得するにはどうすればよいですか。.shgrep + sed

編集ファイル
を変更できません.mk

4

4 に答える 4

4

その場でmakefileを作成してファイルをロードしtest.mk、変数を出力します。

value=$(make -f - 2>/dev/null <<\EOF
include test.mk
all:
    @echo $(test_var)
EOF
)

echo "The value is $value"
于 2012-12-18T16:42:09.683 に答える
3

sedまたはを使用できない場合はgrep、次のような構文解析後にmakefileデータベースを読み取る必要があります。

make -pn -f test.mk > /tmp/make.db.txt 2>/dev/null
while read var assign value; do
    if [[ ${var} = 'test_var' ]] && [[ ${assign} = ':=' ]]; then
        test_var="$value"
        break
    fi
done </tmp/make.db.txt
rm -f /tmp/make.db.txt

これにより、次のようになります。

value := 12345
test_var := ${value}

12345の代わりにを出力します${value}

makefileからすべての変数を表す変数を作成する場合は、内部のifを次のように変更できます。

if [[ ${assign} = ':=' ]]; then
    # any variables containing . are replaced with _
    eval ${var//./_}=\"$value\"
fi

test_varしたがって、適切な値に設定されたような変数を取得します。で始まるmake変数がいくつかあります。これは、search-replaceが実行している.ようなシェル変数の安全な値に置き換える必要があります。_

于 2012-12-18T08:55:32.257 に答える
2

少し前に自分で思いついた@Idelic回答のバリエーション:

function get_make_var()
{
    echo 'unique123:;@echo ${'"$1"'}' | 
      make -f - -f "$2" --no-print-directory unique123
}

test_var=`get_make_var test_var test.mk`

これは、GNU make のあまり知られていない機能 (Makefile複数のオプションを使用してコマンド ラインから複数のを読み取る機能) を使用し-fます。

于 2015-12-15T09:28:11.190 に答える
2

print_var次のコードを使用して、makefile にルールを作成します。

print_var:
        echo $(test_var)

で、次のようtest.shにします。

 $test_var = $(make print_var)

セクションにprint_varルールを入れることも考慮する必要があります.PHONY

于 2012-12-18T08:02:12.207 に答える