2011-02-09 4 views
3

を取得します。は、これは私のMakefileの一部をインストールしている `あなたbash_completionを調達するためにinstall`を作る

最後の行が問題の原因です。 bash_completion.dディレクトリにファイルを追加した後、sourcebash_completionにします。しかしsourceまたは.収量を呼び出す:

. /etc/bash_completion 
/etc/bash_completion: 32: [[: not found 
/etc/bash_completion: 38: [[: not found 
/etc/bash_completion: 50: Bad substitution 
make: *** [install] Error 2 
+0

どのバージョンのbashを使用していますか? –

答えて

2

メイクはデフォルトで/bin/shを使用しています。 [[は通常のshでサポートされていないので、bashを使用するように強制する必要があります。

gnu makeは、[makefile内の]変数をbashを使用するように設定することができます。だから、私は2つの問題を参照メイクファイル

+0

と組み合わせて:http://stackoverflow.com/questions/589276/how-can-i-use-bash-syntax-in-makefile-targets – Mikhail

+0

コロンは必要ありません。コロンなしで試してみてください(この場合は両方とも受け入れられます) –

+0

私はより具体的にしましょう:=は即時の評価です[その場で処理されます] =は遅延されています –

3

の上部にライン

SHELL=/bin/bash 

を追加する必要があります。Makefileルールでsudoを使用して

  1. を悪い考えです。それを避け、代わりにsudo make installに電話してください。
  2. makeルールである非対話型シェル内のbash_completionファイルをソースにしたいのはなぜですか?意味がない。それらを解決するよう

install: 
    $(INSTALL) -m 0755 -d $(DESTDIR)$(bindir) 
    $(INSTALL) -m 0755 -p $(EXEC) $(DESTDIR)$(bindir)/ 
    $(INSTALL) -m 0755 -d $(DESTDIR)$(sysconfdir)/bash_completion.d 
    $(INSTALL) -m 0644 -p ${CURDIR}/bin/stage2.d $(DESTDIR)$(sysconfdir)/bash_completion.d/stage2 

メイクルールの一部と、そのコマンドの実際の走行に

sudo make install && . /etc/bash_completion.d/stage2 

ため。後者は、README、または終了時にターゲットが印刷する行に文書化するとよいでしょう。

+0

'$(INSTALL)'とは何ですか? – Mikhail

+0

'$(INSTALL)'は、 'Makefile'から' install(1) 'を呼び出すためによく使われる、複雑で柔軟な方法です。あなたの 'Makefile'の先頭に' INSTALL = install'行を追加して、デフォルトを提供してください。 – ndim