2

GNU make 3.81 と、Wind River Tornado で配布されている古い make (make 3.76) の両方を使用して、Windows 上でいくつかのソフトウェアを構築しようとしています。

これまでのところ、Windowsから日付を取得することができました:

NOW=\"$(shell cmd /C date /T) $(shell cmd /C time /T)\"

しかし、コンパイラに渡すとき

CFLAGS = ... -DBUILD_TIMESTAMP=$(NOW) ...

タイムスタンプのスペース、コロン、スラッシュが原因で、ビルド エラーが発生します。$(NOW) 変数をエコーすると正しく引用されますが、$(CFLAGS) 変数をエコーすると引用符が消えます。

4

3 に答える 3

0

次のように設定する必要があると思います:CFLAGS = ... -DBUILD_TIMESTAMP = "$(NOW)"..。

つまり、引用符を追加します。

別の「ハッキー」な解決策があります-$(NOW)のスペースを削除します->試してみてください:

empty:=
space:= $(empty) $(empty)
NOW:=$(subst $space,_,$(NOW))
于 2010-11-09T20:00:25.210 に答える
0

シェルの変数を引用符で囲み(単語分割の対象にならないように)、Cの変数を再度引用符で囲みます(したがって、で置換するcppと、文字列リテラルになります)。これを試して:

NOW := "\"$(shell cmd /C date /T) $(shell cmd /C time /T)\""

:=の代わりに使用していることにも注意してください=。古いmakeものがそれをサポートしていない場合を除いて、を使用してください:=。これは、拡張のポイントではなく、定義のポイントで置換を評価します。を使用=すると、ファイルをコンパイルするたびに、これら2つのシェルコマンドが2回呼び出されます。パフォーマンスにはあまり良くありません。

于 2010-11-09T19:42:47.073 に答える
0

次のように、コンパイラのコマンドラインで引用符で囲まれた文字列を渡すというトリッキーさを排除すると、問題のデバッグが容易になる場合があります。

.PHONY: force
timestamp.h: force
    echo "#define BUILD_TIMESTAMP \"`cmd /c date /t` `cmd /c time /t`\"" > $@

...そして#include "timestamp.h"あなたのコードで。この方法では、make やコンパイラではなく、シェルのクォート動作についてのみ心配する必要があります。

かなり時間が経ちましたが、Tornado には csh スタイルのシェルが同梱されていることを覚えていると思います。このシェルは、より一般的な Bourne シェルとは異なる方法でクォートを処理します。timestamp.tclまた、次のようなコンテンツを作成することで代わりに使用できる TCL インタープリターも含まれています。

puts "#define BUILD_TIMESTAMP \"[clock format [clock seconds] -format {%D %T}]\""

と書く

timestamp.h: force
    tclsh timestamp.tcl > $@

メイクファイルで。

于 2010-12-05T15:30:46.573 に答える