在编译之前总是在运行“ make”时运行脚本

时间:2018-06-25 13:34:30

标签: makefile automake

我正在使用自动制作。

我希望每次运行“ make”时都运行一个脚本。

此脚本执行git diff并生成diff的MD5总和。

散列在repos_version.h中作为#define写入 例如:

#define REPOS_DIFF "-190886e9f895e80c42cf6b426dc85afd"

仅当该文件不存在或差异与repos_version.h中的文件不同时,脚本才会重写该文件。但是该脚本需要针对每个品牌运行。

main.c包含repos_version.h并在运行可执行文件时打印出哈希值。

这里是Makefile.am的尝试1

all: config.h
        @chmod +x gen_diff_hash.sh
        @./gen_diff_hash.sh
        $(MAKE) $(AM_MAKEFLAGS) all-recursive

这项工作,但是出现以下错误

Makefile:1234:警告:目标all' Makefile:734: warning: ignoring old recipe for target全部的替代配方”

这里是Makefile.am的尝试2

all-local:
        @chmod +x gen_diff_hash.sh
        @./gen_diff_hash.sh

main.c: repos_version.h

但是,这不起作用,因为全本地运行似乎太迟了。第二次运行“ make”确实获得了预期的结果,但是那不是亚军。

所以都不是太好。 有任何想法吗? 我一直在阅读automake hooks文档,但是看不到任何适合我需要的东西。

1 个答案:

答案 0 :(得分:0)

通过$(shell ./gen_diff_hash.sh)执行该脚本并将其分配给一个可抛弃的变量(或在其他诸如ifeq之类的其他结构中使用它),可以确保每次Make脚本都始终运行。 请注意,this is not POSIX和在非GNU的Make实现上不是有效的语法。 GNU Make 4.x也支持使用VAR != ./gen_diff_hash.sh,至少与BSD Make兼容。

但是,最好创建一个运行脚本的.PHONY: gendiff目标,并使标头依赖于此gendiff。然后,每次Make检查repos_version.h是否是最新的,而不是每次Make运行时,都会重新评估目标。