4

単純なメイク ファイルがあり、現在の日付と時刻を作成する実行可能ファイルに挿入したいと考えています。

のようなもの: NOW=$(date +"%c")exe 名に追加されます。それを行う最良の方法は何ですか?

ありがとう!

4

1 に答える 1

7

Makefileアプリケーションを作成するがすでにあると思います。したがって、ここに追加できるものがあります。

# Use ':=' instead of '=' to avoid multiple evaluation of NOW.
# Substitute problematic characters with underscore using tr,
#   make doesn't like spaces and ':' in filenames.
NOW := $(shell date +"%c" | tr ' :' '__')

# Main target - your app + "date"
all: foo_$(NOW)

# Normal taget for your app which already have.
foo: foo.cpp

# Copy "normal" app to app_DATE
# You'll rater want copy then move, otherwise make will have
#   to link your app again during each execution (unless that's
#   exactly what you want).
foo_$(NOW): foo
    cp $^ $@

の置き換えに注意し':'てください'_'ここで示されているように、date にコロンが含まれていると、make はおそらく Makefile の解析に失敗します。

現時点では Mac OS X にアクセスできないため、これは Ubuntu でのみテストされましたが、以前は Mac マシンで作業したことがあり、make. したがって、それはあなたにとってもうまくいくはずです。

- - 編集 - -

makeBeta が正しくコメントしたように、上記のメソッドは、呼び出されるたびに現在の日付で新しいコピーを作成します。時々それが望まれるかもしれないので、私はそれをそのままにし、そうでない場合に次の代替案を提案します:

# Same as above...
NOW := $(shell date +"%c" | tr ' :' '__')

# Default target
all: foo  # <-- not foo_$(NOW) anymore, foo_$(NOW) target is removed altogether

OBJ := foo.o bar.o  # other ...

# Normal taget for your app which already have, but...
foo: $(OBJ)
    $(CXX) $(LDFLAGS) $^ -o $@
    cp $@ $@_$(NOW)  # <-- additional copy at the end (read on below)

なぜfoo_$(NOW)ターゲットがなくなったのですか?アプリ自体を変更した場合にのみ、日付がスタンプされたアプリのコピーを作成する必要があるためです。つまり、(上記のシナリオのように)常にmakeコピーが作成されるため、ターゲットを作成することはできません。

ただし、これはmakeコピーの存在を認識していないことを意味します。makeコピーは、起動時に作成される依存関係グラフには存在しません。そのため、コピーを他のターゲットの前提条件として使用することはできません。これは欠点ではありませんが、コピーを作成するかどうかを事前に知ることができないという事実の直接的な結果です。(誰かがセカンダリ make run を実行せずにこれを克服する方法を持っている場合は、私を甘やかしてください:))。

于 2012-09-17T17:42:54.773 に答える