8

目標:ユーザーが「makepackages」と入力すると、パッケージlibx11-dev(プログラムをコンパイルするために必要)を自動的に検索し、見つからない場合はインストールします。これが私のmakefileの簡略版です:

PACKAGES = $(shell if [ -z $(dpkg -l | grep libx11-dev) ]; then sudo apt-get install libx11-dev; fi)

[other definitions and targets]

packages: $(PACKAGES)

「makepackages」と入力すると、スーパーユーザーのパスワードの入力を求められます。正しく入力すると、無期限にハングします。

私がやろうとしていることは、makefile内からでも可能ですか?もしそうなら、どのように?

本当にありがとう。

4

2 に答える 2

8

問題は、shell関数がシェルのバックティックのように機能することです。出力をstdoutに受け取り、関数の値として返します。したがって、apt-getはハングしていません。質問に対する応答を入力するのを待っています。しかし、makeが出力を取得したため、質問は表示されません。

これを行う方法は機能しません。shell原則として書くのではなく、なぜ使っているのですか?

packages:
        [ -z `dpkg -l | grep libx11-dev` ] && sudo apt-get install libx11-dev
.PHONY: packages
于 2012-05-16T12:20:14.320 に答える
4

ifステートメントに予期しない引数があるという問題を回避するより良い方法を考え出しました。

if ! dpkg -l | grep libx11-dev -c >>/dev/null; then sudo apt-get install libx11-dev; fi

grepの-cフラグは、文字列libx11-devを含むdpkg -lの行数を返します。これは、0(アンインストールされている場合)または1(インストールされている場合)のいずれかになります。

dpkg -l | grep libx11-dev -c  

通常のブール変数のように扱われます。

于 2012-05-18T00:31:47.890 に答える