web-dev-qa-db-ja.com

Makefileアクションでシェル変数を使用するにはどうすればよいですか?

必要に応じてデータベースを破棄するなど、データベースを再作成するために、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
31
hekevintran

少なくとも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
45
William Pursell

完了のために、$(eval $(call ...)

動的生成ルールで使用するには、$$$$でシェル変数をエスケープする必要があります。

「GNU Make 4.2.1」でテストされた例を次に示します。

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

0
Clemens1509