必要に応じてデータベースを破棄するなど、データベースを再作成するために、Makefileに次のものがあります。それは動作しません。
.PHONY: rebuilddb
exists=$(psql postgres --tuples-only --no-align --command "SELECT 1 FROM pg_database WHERE datname='the_db'")
if [ $(exists) -eq 1 ]; then
dropdb the_db
fi
createdb -E UTF8 the_db
実行するとエラーが発生します:
$ make rebuilddb
exists=
if [ -eq 1 ]; then
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [rebuilddb_postgres] Error 2
なぜこれが間違っているのですか?私が知る限り、それは有効なBashのように見えますか? Makefileでこれを行う際に考慮しなければならない特別な考慮事項はありますか?
更新:
答えを使用して、私は作業バージョンに到着しました:
.PHONY: rebuilddb
exists=$$(psql postgres --tuples-only --no-align --command "SELECT 1 FROM pg_database WHERE datname='the_db'"); \
if [ "$$exists" == "1" ]; then \
dropdb the_db; \
fi;
createdb -E UTF8 the_db
少なくとも2つの考慮事項があります。 $()
はMake変数を参照します。コマンド置換を行うには、$
をエスケープする必要があります。また、シェルコマンドはすべて1行である必要があります。試してください:
exists=$$(psql postgres --tuples-only --no-align --command "SELECT 1 FROM \
pg_database WHERE datname='the_db'"); \
if [ "$$exists" -eq 1 ]; then \
dropdb the_db; \
fi; \
createdb -E UTF8 the_db
一方、常にデータベースを削除して失敗を許可する方が簡単なようです:
rebuilddb:
-dropdb the_db # Leading - instructs make to not abort on error
createdb -E UTF8 the_db
動的生成ルールで使用するには、$$$$でシェル変数をエスケープする必要があります。
MY_LIBS = a b c
a_objs = a1.o a2.o
b_objs = b1.o b2.o b3.o
c_objs = c1.o c2.o c3.o c4.oデフォルト:libs
#関数lib_rule(name、objs)
lib_ruleを定義する
lib $(1).a:$(2)
exit 1 | tee make.log;テスト$$$$ {PIPESTATUS [0]} -eq 0
endef#ルールを生成する
$(foreach L、$(MY_LIBS)、$(eval $(call lib_rule、$(L)、$($(L)_objs))))#生成されたルールを呼び出す
libs:$(patsubst%、lib%.a、$(MY_LIBS))#ダミーオブジェクト生成
%。o:%。c
$ @をタッチ#ダミーソース生成
%。c:
$ @をタッチ掃除::
rm -f * .c * .o lib * .a make.log
出力: 'make -Rr'
出口1 | tee make.log;テスト$ {PIPESTATUS [0]} -eq 0
make:*** [Makefile:18:liba.a]エラー1
パイプの最後のコマンドの結果はtrue from teeです。 bash変数を見ることができますPIPESTATUS [0]は値を持っていますfalse from exit 1
データベースを見る: 'make -Rrp'
lib_ruleを定義する
lib $(1).a:$(2)
exit 1 | tee make.log;テスト$$$$ {PIPESTATUS [0]} -eq 0
endef
...
libc.a:c1.o c2.o c3.o c4.o
exit 1 | tee make.log;テスト$$ {PIPESTATUS [0]} -eq 0