4

我有一个简单的 make 文件,我想将当前日期和时间插入到它创建的可执行文件中。

类似于: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 $^ $@

注意替换':''_'。如此处所示如果日期包含冒号,则 make 可能无法解析 Makefile。

我目前无法访问 Mac OS X,因此仅在 Ubuntu 上进行了测试,但我曾经在 Mac 机器上工作过一次,我没有注意到make. 所以它也应该对你有用。

- - 编辑 - -

正如 Beta 正确评论的那样,上述方法在每次make调用时都会创建具有当前日期的新副本。有时可能需要它,所以我会保留它,并针对不需要的情况提出以下替代方案:

# 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 回答