Makefile 运行 配置为自行生成。是否有可能在继续之前重新阅读自己

Makefile running configure to generate itself. Is it possible to reread itself before continuing

我有一个 Makefile,它是由带有选项的配置脚本生成的

在configure.ac中:

AC_ARG_ENABLE([mmi],
    AS_HELP_STRING([--enable-mmi], [Add the mmi function]),
    [
        AC_MSG_NOTICE([ * MMI: enabled])
        AC_DEFINE([WITH_MMI], [1])
        AC_SUBST(with_mmi, 1)
    ],
    [
        AC_MSG_NOTICE([ * MMI: disabled])
        AC_SUBST(with_mmi, 0)
    ])

这个选项也在 kconfig 文件中定义(因此我们可以使用 menuconfig 类型的命令更改配置,而不必直接使用配置脚本)

Makefile 检测 kconfig 文件何时被修改,在这种情况下配置脚本是 运行 并且 Makefile 被修改。

问题是 Makefile 正在继续并且没有使用配置脚本修改的参数。

如果 make 命令是 运行 第二次,它可以正常工作(更新参数)

当前使用的解决方法是在配置脚本完成后直接强制退出 Makefile。

在Makefile.in中:

%.o: %.c $(HEADERS) $(SELF_MAKEFILE) $(PTXDIST_PROJECT)/platform-myproject/state/myproject.prepare
  gcc $(CFLAGS) -c -o $@ $<

$(PTXDIST_PROJECT)/platform-myproject/state/myproject.prepare: $(PTXCONFIG_FULL_PATH)
  cd $(PTXDIST_PROJECT); ptxdist prepare myproject
  @echo ============================================
  @echo Makefile has been modified. Please run again
  @echo ============================================
  exit 1

注意:ptxdist prepare myproject 命令上方是 运行 配置脚本,然后是 $(PTXDIST_PROJECT)/platform-myproject/state/myproject.prepare 文件

如果修改后可以让Makefile重新读取自己,这样就可以运行一步不出错就更好了。

知道如何完成这个吗?

automake 生成的 Makefile 知道重新运行 autoconf,并在 makefile 等更改时进行配置。在我看来,如果您将 ptxdist prepare myproject 命令的调用移动到 autoconf 文件中,而不是在 makefile 中,这样每次调用 configure 时它总是完成,那么您就不会有这个问题。

如果您不想这样做,那么 make 将在其包含的任何 makefile 发生更改时自动重新调用自身。当你在上面回复 Etan 时,你没有说 myproject.prepare 的内容是什么,但如果它只是一个空文件,被触摸以告诉 make 准备工作是最新的,你可以包括:

include $(PTXDIST_PROJECT)/platform-myproject/state/myproject.prepare

它会发生的。如果此文件不为空并且包含您不能作为 makefile 包含的内容,那么您可以进行更改,使其只接触一个空文件:

PREPARE_SENTINEL = $(PTXDIST_PROJECT)/platform-myproject/state/prepare.sentinel

%.o: %.c $(HEADERS) $(SELF_MAKEFILE) $(PREPARE_SENTINEL)
        gcc $(CFLAGS) -c -o $@ $<

$(PREPARE_SENTINEL): $(PTXCONFIG_FULL_PATH)
        cd $(PTXDIST_PROJECT); ptxdist prepare myproject
        @touch $@

include $(PREPARE_SENTINEL)