【问题标题】:always run a script when running 'make' before compiling在编译之前运行'make'时总是运行一个脚本
【发布时间】:2018-06-25 13:34:29
【问题描述】:

我正在使用自动制作。

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

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

哈希在 repos_version.h 中写为 #define 例如:

#define REPOS_DIFF "-190886e9f895e80c42cf6b426dc85afd"

脚本仅在此文件不存在或差异与 repos_version.h 中的内容不同时才重写此文件。但是需要为每个 make 运行脚本。

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 targetall' 的配方

这是 Makefile.am 的尝试 2

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

main.c: repos_version.h

但是,这不起作用,因为 all-local 似乎运行得太晚了。 'make' 的第二次运行确实得到了预期的结果,但这不是跑步者。

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

【问题讨论】:

    标签: makefile automake


    【解决方案1】:

    您可以确保每次 Make 加载 Makefile 时始终运行脚本,方法是通过$(shell ./gen_diff_hash.sh) 执行它并将其分配给一次性变量(或在其他一些构造中使用它,例如 ifeq 或其他东西)。 请注意,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 时,都会重新评估目标。

    【讨论】:

    • 我正在运行最新的 CentOS 7。我已经安装了 GNU make。我安装的 make 有问题吗?如果我添加以下内容: GENDIFF=$(shell ./gen_diff_hash.sh) 我得到: src/Makefile.am|215|警告:shell ./gen_diff_hash.sh:非 POSIX 变量名 src/Makefile.am|215| (可能是 GNU make 扩展)相反,如果我添加: .PHONY: gendiff gendiff: chmod +x gen_diff_hash.sh ./gen_diff_hash.sh 没有任何反应 - 不会调用 gendiff 规则。
    • 那是因为 $(shell somecommand) 不是 POSIX,所以如果你使用 Make 的另一种实现(而不是 GNU 实现),它会中断。您可以使用 != 来实现 BSD make 的可移植性...而且您仍然需要 gendiff 成为 repos_version.h 的依赖项
    • 不幸的是,制作 4.x 目前似乎不是我的选择。 CentOS 7 附带 GNU Make 3.82。
    • 如果您不关心始终在非 GNU make 上运行的特殊脚本,您可以在顶级 Makefile.amMakefile.inMakefile 旁边添加一个单独的 GNUmakefile。让GNUmakefileinclude Makefile 开头,然后将$(shell ...) 内容添加到GNUmakefile。然后 GNU make 将发挥作用,非 GNU make 仍将运行正常构建而不运行 $(shell ...) 东西。我的github.com/ndim/ndim-utils 包中提供了非最小示例。
    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多