シェルスクリプトの他のMakefileから変数を取得する方法

シェルスクリプトの他のMakefileから変数を取得する方法

~/kernelbuild/linux-3.14.37私のシェルスクリプトでこのディレクトリにある他のMakefileの変数を使用したいと思います。

必要な変数は次のとおりです。

VERSION = 3
PATCHLEVEL = 14
SUBLEVEL = 37

問題は、Makefileを変更できないことです。したがって、変数のエクスポートはここではオプションではありません。

また、必要なすべての共通変数を含む別々のファイルを持つことについて話している人もいます。これはうまくいきますが、すべてを単一のシェルスクリプトに入れる必要があります。

. ~/kernelbuild/linux-3.14.37/Makefileこれらの変数を使用できる必要があると思うシェルスクリプトに含めようとしていますが、次のエラーが発生します。

/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 1: VERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 2: PATCHLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 3: SUBLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 4: EXTRAVERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 5: NAME: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 17: MAKEFLAGS: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 20: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 26: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: syntax error near unexpected token `"$(origin V)",'
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: `ifeq ("$(origin V)", "command line")'

Makefileがシェルスクリプトの構文規則に従わないためだと思います。どうすればいいですか?

よろしくお願いします!

答え1

簡単なもの(例)が必要な場合は、grepMakefileから取り出します。

より複雑なケースのために、GNU Makeには-pMakeを実行した後にすべての変数定義(およびそれ以上)を含むデータベースを印刷するオプションがあります。これを一緒に使用することができます。-nこれにより、ジョブは実際には実行されません(したがって何も構築されません)。出力grepから変数を取得できます。-p

答え2

grepとsedを使用して値を抽出できます。たとえば、

filename="$HOME/kernelbuild/linux-3.14.37/Makefile"
version=$(grep -m 1 VERSION $filename | sed 's/^.*= //g')

この grep は Makefile で「VERSION」が最初に現れることを探します。

答え3

Makeはstdinでmakefileを読むことができるので、ここのドキュメントそれはメイクファイルです。以下は、カーネルmakefileを取得し、%.var指定されたmake変数の値を出力するレシピを持つ新しいワイルドカードターゲットを追加するmakefileです。 (.varもちろん、で終わるファイルや他のターゲットがないとします。)

showvar() {
make -f - ${1}.var <<'EOF'
include $(HOME)/kernelbuild/linux-3.14.37/Makefile

%.var:
    @echo $($*)
EOF
}

my_version=$(showvar VERSION)
patchlevel=$(showvar PATCHLEVEL)
the_sublevel=$(showvar SUBLEVEL)

$*Makeはターゲットのトランクに置き換えられます%.var

レシピ@echo行は実際のTAB文字で始まります。

関連情報