Makefile运行配置以生成自身。在继续之前是否可以重读

Makefile运行配置以生成自身。在继续之前是否可以重读,makefile,configure,Makefile,Configure,我有一个Makefile,它是由一个带有选项的configure脚本生成的 在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)

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

在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 type命令更改配置,而不必直接使用configure脚本)

Makefile会检测何时修改kconfig文件,在这种情况下,会运行configure脚本并修改Makefile

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

如果再次运行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
%.o:%.c$(HEADERS)$(SELF_MAKEFILE)$(PTXDIST_PROJECT)/platform myproject/state/myproject.prepare
gcc$(CFLAGS)-c-o$@$<
$(PTXDIST_项目)/平台myproject/state/myproject.prepare:$(PTXCONFIG_完整路径)
cd$(PTXDIST_项目);ptxdist准备我的项目
@回音============================================
@echo Makefile已被修改。请再跑一次
@回音============================================
出口1
注意:上面的
ptxdist prepare myproject
命令正在运行配置脚本,然后触摸
$(ptxdist\u PROJECT)/platform myproject/state/myproject.prepare
文件

如果可以要求Makefile在修改后再次读取它自己,以便它可以在一个步骤中运行而不会出错,那就更好了


你知道我该怎么做吗?

automake生成的Makefiles知道如何重新运行autoconf,并在Makefiles等更改时进行配置。在我看来,如果将
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)
PREPARE\u SENTINEL=$(PTXDIST\u PROJECT)/platform myproject/state/PREPARE.SENTINEL
%.o:%.c$(标题)$(自我制作文件)$(准备哨兵)
gcc$(CFLAGS)-c-o$@$<
$(准备哨兵):$(PTXCONFIG\u完整路径)
cd$(PTXDIST_项目);ptxdist准备我的项目
@触碰$@
包括$(准备哨兵)

$(PTXDIST_PROJECT)/platform myproject/state/myproject。准备
用作makefile中的目标或先决条件?如果配置更改,它是用于重新编译项目的依赖项。我添加了Makefile的另一个规则。(无法添加所有456行长的Makefile)
gcc
不使用该文件,为什么在每个
.c
文件发生更改时都要重新编译?是包含在头文件还是其他文件中?这个文件包含什么?这个文件是空的,被触碰表示配置变更包括makefile就是我提问的地方。关于汽车制造的观点是一个很好的观点。谢谢,只是增加了包括工作。注意:我没有使用automake