如何在Eclipse预构建脚本中判断是否需要执行构建操作
Eclipse CDT本身没有直接提供「项目是否需要构建」的预定义变量,因为pre-build步骤的默认执行时机早于CDT的增量变更检测逻辑,你可以通过以下几种方案实现仅项目变更时更新版本号的需求:
方案1:Pre-Build脚本自行做变更检测(最常用)
不需要依赖Eclipse内置变量,直接在版本号更新脚本中增加变更校验逻辑即可:实现逻辑:遍历项目下所有纳入构建的源文件(.c/.cpp/.h等),比对最新的源文件修改时间和上次生成版本号的标记文件的修改时间,如果源文件更新时间更晚,说明有变更,执行版本更新,同时更新标记文件的修改时间。
如果你使用Makefile构建(CDT默认的Internal Builder也支持自定义Make规则),可以直接添加如下规则:.PHONY: pre-build pre-build: @find ./src -name "*.c" -o -name "*.cpp" -o -name "*.h" | xargs stat -c %Y | sort -nr | head -n1 > last_src_modify.tmp @if [ ! -f version_last_build.tmp ] || [ `cat last_src_modify.tmp` -gt `cat version_last_build.tmp` ]; then \ # 此处替换为你的版本号更新脚本调用命令 \ ./update_version.sh; \ cp last_src_modify.tmp version_last_build.tmp; \ fi @rm -f last_src_modify.tmp配置方式:进入项目属性→C/C++ Build→Settings→Build Steps→Pre-build steps,填入
make pre-build即可。方案2:配合CDT内置变量做变更校验
可以使用CDT提供的内置变量${build_artifact}(指向构建生成的目标文件,如exe/so/a静态库)和${ProjDirPath}(项目根目录绝对路径),传递给脚本后做时间比对:注意:该方案同时兼容增量构建和Clean后的全量构建场景,全量构建时目标文件不存在会判定为有变更,符合版本号更新的需求。
脚本示例(bash环境):# 接收Eclipse传入的两个参数:第一个为${build_artifact},第二个为${ProjDirPath} TARGET_FILE=$1 PROJ_ROOT=$2 # 统计所有源文件的最新修改时间 NEWEST_SRC_TIME=$(find "$PROJ_ROOT/src" -type f \( -name "*.c" -o -name "*.cpp" -o -name "*.h" \) -exec stat -c %Y {} + | sort -nr | head -n 1) # 判定是否需要更新版本号 if [ ! -f "$TARGET_FILE" ] || [ $NEWEST_SRC_TIME -gt $(stat -c %Y "$TARGET_FILE") ]; then # 此处写入你的版本号更新逻辑 echo "项目有变更,执行版本号更新" else echo "项目无变更,跳过版本号更新" fi配置方式:在Pre-build steps中填入
bash ./update_version.sh ${build_artifact} ${ProjDirPath},Eclipse会自动替换变量为实际路径传递给脚本。方案3:自定义CDT构建变量
你也可以在项目属性→C/C++ Build→Variables中自定义布尔变量PROJECT_CHANGED,再通过CDT构建扩展开发修改增量检测逻辑同步更新该变量值,但该方案复杂度较高,普通开发场景不推荐使用。
内容的提问来源于stack exchange,提问作者Patrick Wright

