2011-09-02 9 views
17

ファイルに複数行の変数を出力するmakefileルールを作成するのに苦労しています。しかし、エコーは私には不明な理由のために、「終了していません引用符で囲まれた文字列を」伝える失敗GNU Makeでファイルに複数行の変数を出力します

define VAR1 
    /dev d 755 - - - - - 
endef 

define VAR2 
    /test d 777 - - - - - 
    /test2 d 777 - - - - - 
endef 

VARS += $(VAR1) 
VARS += $(VAR2) 

all: 
    echo "$(VARS)" > test 

:ここ

は、私が持っているコードです。 どうすれば別の行に宣言されたすべての行をファイルに入れることができますか?

echo " /dev d 755 - - - - - 

ここで私が来ることができる最善の解決策だ:メイクは別のシェルでのレシピの各行を実行し、最初の行があるので、あなたが「終了していません引用符で囲まれた文字列を」取得しているかのように見えます

答えて

19

あなたがシェルに変数をエクスポートし、シェル変数ではなく、メイク変数としてそれを参照する場合、あなたはより良い運を持っています:

define VAR1 
    /dev d 755 - - - - - 
endef 

define VAR2 
    /test d 777 - - - - - 
    /test2 d 777 - - - - - 
endef 

define VARS 
$(VAR1) 
$(VAR2) 
endef 
export VARS 

all: 
    echo "$$VARS" > test 

注意私はむしろ+=のシリーズとしてよりも、VARSを作成するためにdefineを使用

  • :あなたのメイクファイルを調整し、次のこれにより、VAR1VAR2の値の間の改行を簡単に得ることができます。
  • 私はシェルの呼び出しのために環境にプッシュされた変数を得るために、export VARSをあなたのmakefileに追加しました。
  • $(VARS)を逆参照するのではなく、を使用しました。これは、「展開されていない引用文字列」エラーを避けるために、作成するのではなくシェルに展開されます。
+0

どのように私はそれを逃したことができますか? +1 – Beta

4

アップ(と私はそれが非常に良いではありません認めるが、あなたはメイクの穀物に対してつもり)$(info ...)を呼び出したサブ作るためにVARSを渡すことです:

のMakefile:

define VAR1 
    /dev d 755 - - - - - 
endef 

define VAR2 
    /test d 777 - - - - - 
    /test2 d 777 - - - - - 
endef 

define VARS 
$(VAR1) 
$(VAR2) 
endef 

export VARS 

all: 
     $(MAKE) -f Makefile.print > test           

Makefile.print:

$(info $(VARS)) 

.PHONY:all 
all: 
     @# do nothing 
8

GNU 4.0を作るthe ability to write files directlyを追加します。あなたはまだVARSを定義するためにdefineを使用する必要がある、またはVAR1の最後の行とVAR2の最初の行が1行にglommedされます

define VAR1 
    /dev d 755 - - - - - 
endef 

define VAR2 
    /test d 777 - - - - - 
    /test2 d 777 - - - - - 
endef 

define VARS := 
$(VAR1) 
$(VAR2) 
endef 

all: 
     $(file > test,$(VARS)) 

注意。また、$(file ...)コンストラクトにコンマの後にスペースを入れないでください。そうしないと、出力に先行するスペースがあります。

+0

これはありがとうございます - この時点で私が知る必要があったのは、Windows上でコマンドライン引数の制限にぶつかり、自分の 'make'ビルドを壊したからです。これは、シェルにパラメータを渡す呼び出しがないので役に立ちます。乾杯! – sdaau

関連する問題