web-dev-qa-db-ja.com

Shellディレクティブからの戻り値を確認する方法

Makefileで、現在のディレクトリがSVNリポジトリであるかどうかをテストする必要があります。そうでない場合は、Makefileの$(error)ディレクティブを使用してエラーを示します。

そのため、$(Shell svn info。)の戻り値を使用する予定ですが、Makefile内からこの値を取得する方法がわかりません。

注:レシピで戻り値を取得するのではなく、Makefileの途中で取得します。

現在、私は次のようなことをしています。これは、エラーであるときにstdoutが空白であるために機能します。

SVN_INFO := $(Shell svn info . 2> /dev/null)
ifeq ($(SVN_INFO),)
    $(error "Not an SVN repo...")
endif

Makefile内で代わりに戻り値を取得できるかどうかはまだ知りたいです。

26
Tuxdude

これは私にとってはうまくいきました-有効なsvnリポジトリのsvn infoからの出力をスキップするためにstdoutをリダイレクトするわずかな変更を加えた@eriktousの回答に基づいています。

SVN_INFO := $(Shell svn info . 1>&2 2> /dev/null; echo $$?)
ifneq ($(SVN_INFO),0)
    $(error "Not an SVN repo...")
endif
11
Tuxdude

$?最後のコマンドの終了ステータスをエコーするには?

 SVN_INFO:= $(Shell svn info。2>/dev/null; echo $$?)
 ifeq($(SVN_INFO)、1)
 $(error "Not SVNリポジトリ... ")
 endif 
26
eriktous

元の出力を保持したい場合は、いくつかのトリックを行う必要があります。運が良ければ、GNU Make 4.2(2016-05-22にリリース)以降)を自由に使用できます。.SHELLSTATUS変数は次のとおりです。

var := $(Shell echo "blabla" ; false)

ifneq ($(.SHELLSTATUS),0)
  $(error Shell command failed! output was $(var))
endif

all:
    @echo Never reached but output would have been $(var)

あるいは、一時ファイルを使用するか、Makeのevalを操作して、文字列や終了コードをMake変数に格納することもできます。以下の例はこれを実現していますが、この恥ずかしいほど複雑なバージョンよりも優れた実装を期待しています。

ret := $(Shell echo "blabla"; false; echo " $$?")
rc := $(lastword $(ret))
# Remove the last Word by calculating <Word count - 1> and
# using it as the second parameter of wordlist.
string:=$(wordlist 1,$(Shell echo $$(($(words $(ret))-1))),$(ret))

ifneq ($(rc),0)
  $(error Shell command failed with $(rc)! output was "$(string)")
endif

all:
    @echo Never reached but output would have been \"$(string)\"
11
stefanct

たぶんこんな感じ?

IS_SVN_CHECKED_OUT := $(Shell svn info . 1>/dev/null 2>&1 && echo "yes" || echo "no")
ifne ($(IS_SVN_CHECKED_OUT),yes)
    $(error "The current directory must be checked out from SVN.")
endif
6
Roland Illig

.NOTPARALLELとmake関数を使用します。

.NOTPARALLEL:   

# This function works almost exactly like the builtin Shell command, except it
# stops everything with an error if the Shell command given as its argument
# returns non-zero when executed.  The other difference is that the output
# is passed through the strip make function (the Shell function strips only
# the last trailing newline).  In practice this doesn't matter much since
# the output is usually collapsed by the surroundeing make context to the
# same result produced by strip.
Shell_CHECKED =                                                      \
  $(strip                                                            \
    $(if $(Shell (($1) 1>/tmp/SC_so) || echo nonempty),              \
      $(error Shell command '$1' failed.  Its stderr should be above \
              somewhere.  Its stdout is in '/tmp/SC_so'),            \
      $(Shell cat /tmp/SC_so)))
1
Britton Kerin