【发布时间】:2015-06-03 04:34:26
【问题描述】:
我有一个脚本,它会生成一个 version.h 文件,其中包含有关特定构建的各种详细信息
脚本运行各种命令,如:
readonly VERSION=$(git describe --always --dirty --long --tags)
readonly NUM_COMMITS=$(git rev-list HEAD | wc -l | bc)
readonly BRANCH=$(git rev-parse --abbrev-ref HEAD)
readonly AHEAD_BY=$(git log --oneline origin/${BRANCH}..${BRANCH} | wc -l | bc)
readonly NUM_UNTRACKED=$(git ls-files --exclude-standard --others --full-name -- . | wc -l | bc)
readonly HOSTNAME=$(hostname)
然后它会写入一个临时文件,检查预先存在的生成文件,如果它们不同,则用新文件覆盖旧的 version.h。
#pragma once
/*
* Version information
*
* - This is a generated file - do not edit
*/
namespace foo { namespace app {
static const char VERSION[] = "26b75cd";
static const char NUM_COMMITS[] = "224";
static const char BRANCH[] = "master";
static const char AHEAD_BY[] = "0";
static const char NUM_UNTRACKED[] = "0";
static const char USER[] = "steve";
static const char HOSTNAME[] = "steve-linux";
static const char BUILD_VARIANT[] = "debug";
static const char BUILD_DATE[] = __DATE__ " " __TIME__;
}}
文件更新时也会打印到标准输出
version updated: 26b75cd
版本脚本应该是第一个运行的东西,并且应该在每次调用 makefile 时运行。
目前我通过在makefile中使用简单扩展变量来实现这一点
new_ver := $(shell ./app/gen_version.sh $(BUILD))
它可以工作,但脚本的任何输出都在new_var 中捕获,我无法显示该输出。
这是一个可以接受的权衡(不显示新版本),但在理想情况下,我想显示脚本输出。
我不确定添加到默认 all 目标中的 .PHONY 目标是否有效,因为每个应用都有自己的目标,因此您可以构建它。
define do-make-bin
binaries += $(addprefix $(BIN_DIR),$1)
bin_sources += $2
# a target so users can call 'make <bin-name>' and build only the bin and its dependencies
$1: $(addprefix $(BIN_DIR),$1)
# the target to build the actual binary
$(addprefix $(BIN_DIR),$1): $(call src_to_obj,$2) $(addsuffix .so,$(addprefix $(LIB_DIR)lib,$3)) $(addsuffix .a,$(addprefix $(LIB_DIR)lib,$4))
@$(CXX) $(call src_to_obj,$2) -L/usr/lib -L$(SDK_LIB_DIR) -L$(LIB_DIR) $(TARGET_LINK_FLAGS) -Wl$(,)-Bstatic $(addprefix -l,$4) $(addprefix -l,$6) -Wl$(,)-Bdynamic -Wl$(,)-rpath$(,)$(RPATH) $(linkpath) -L$(LIB_DIR) $(sdk_libs) $(tcmalloc_libs) -lpthread -lrt $(addprefix -l,$3) $(addprefix -l,$5) -rdynamic -o $$@
endef
调用make foo 仍应检查version.h 是否需要更新
【问题讨论】:
-
这是最简单的方法。我不知道你说“更优雅”是什么意思。
-
@MadScientist 抱歉,我已经编辑了问题。鉴于您的回复,我意识到我要克服的问题是在分配后我无法
echo $(new_ver)