【问题标题】:dependency check in automake rules自动生成规则中的依赖项检查
【发布时间】:2017-10-07 14:04:51
【问题描述】:

我在向自动工具项目添加特定规则时遇到了一些问题。

我有这个小示例项目:

项目/configure.ac:

AC_INIT([myprog], [0.1], [dev@corp.com])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AM_EXTRA_RECURSIVE_TARGETS([quality])
AC_PROG_CC
AC_SUBST([AM_CFLAGS])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

项目/Makefile.am:

SUBDIRS = src

项目/src/Makefile.am:

bin_PROGRAMS= myprog

myprog_SOURCES    = myprog.c

QUALITYDIR=$(builddir)/quality
QUALITY_FILE="$(QUALITYDIR)/quality.log"

quality-local: $(QUALITY_FILE)

$(QUALITY_FILE): myprog
    mkdir -p $(QUALITYDIR)
    valgrind ./myprog 2>&1 | tee $(QUALITY_FILE)

CLEANFILES =    $(QUALITY_FILE)

每次我这样做:

$ 制造质量

运行 valgrind 的东西,即使“myprog”还没有重建。 我希望它只会在 myprog 比 build/src/quality 中的 quality.log 文件更年轻时执行。

我做错了什么?

【问题讨论】:

    标签: makefile autotools automake


    【解决方案1】:

    深入了解您生成的project/src/Makefile,您会看到如下内容:

    .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
            ... quality-am quality-local ...
    

    .PHONY target 总是会被重新制作,所以是的,valgrind 总是会运行(我也观察到了这一点)。

    编辑:

    忘记这一切。在运行make -d quality 之后(在已经生成日志之后)我注意到:

      Considering target file '"./quality/quality.log"'.
       File '"./quality/quality.log"' does not exist.
    

    所以简单地改变:

    QUALITY_FILE="$(QUALITYDIR)/quality.log"
    

    QUALITY_FILE=$(QUALITYDIR)/quality.log
    

    应该让它的行为符合你的预期。至少对我有用。

    【讨论】:

    • 我认为这不能解释。是的,.PHONY 目标总是被重新制作,但这并不强制重建它们的最新先决条件(考虑到传统的“全部”目标通常是 .PHONY)。 OP 的 valgrind 命令是常规目标配方的一部分;仅当该规则的目标不存在或就其先决条件而言已过时时,它才应运行。
    • @JohnBollinger 在玩了一些之后,我发现你是对的。
    • 第二次尝试成功,+1。我要补充一点,这种事情是编写 DRY make 规则的绝佳理由,尤其是在规则的配方中使用内置变量 $@ 来引用该规则的目标。
    • 感谢 ldav1s,它有效!我真的不明白双引号有什么问题,是 automake 的错误吗?
    • 这不是 automake 错误。请参阅this answer 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多