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内で代わりに戻り値を取得できるかどうかはまだ知りたいです。
これは私にとってはうまくいきました-有効な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
$?
最後のコマンドの終了ステータスをエコーするには?
SVN_INFO:= $(Shell svn info。2>/dev/null; echo $$?) ifeq($(SVN_INFO)、1) $(error "Not SVNリポジトリ... ") endif
元の出力を保持したい場合は、いくつかのトリックを行う必要があります。運が良ければ、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)\"
たぶんこんな感じ?
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
.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)))