Makefile 使用目标调用其他 makefile,给出错误的目标

发布于 2024-08-02 00:31:00 字数 610 浏览 4 评论 0原文

我有一个目标为 clean 的 makefile:

clean:
   $(MAKE) -f <other makefile location> clean

当我在此 makefile 中调用 make clean 时,它告诉我在另一个 makefile 中没有规则“clean-linux”。 具体来说,这是输出。

make -f /root/ovaldi-5.5.25-src/project/linux/Makefile clean
make[1]: Entering directory '/root/ovaldi-5.5.25-src'
make[2]: Entering directory '/root/ovaldi-5.5.25-src'
make[2]: *** No rule to make target 'clean-linux'. Stop.
make[2]: Leaving directory '/root/ovaldi-5.5.25-src'
make[1]: Leaving directory '/root/ovaldi-5.5.25-src'

为什么它给它 clean-linux 目标而不是像我指定的那样干净?

I have a makefile with a target clean:

clean:
   $(MAKE) -f <other makefile location> clean

When I call make clean in this makefile, it tells me that in the other makefile there is no rule 'clean-linux'. Specifically here is the output.

make -f /root/ovaldi-5.5.25-src/project/linux/Makefile clean
make[1]: Entering directory '/root/ovaldi-5.5.25-src'
make[2]: Entering directory '/root/ovaldi-5.5.25-src'
make[2]: *** No rule to make target 'clean-linux'. Stop.
make[2]: Leaving directory '/root/ovaldi-5.5.25-src'
make[1]: Leaving directory '/root/ovaldi-5.5.25-src'

Why is it giving it the clean-linux target and not just clean like I specified?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

池木 2024-08-09 00:31:00

当您 make(或 $(MAKE))时,默认情况下您使用那里的任何 makefile。 这就是我认为正在发生的事情。

  1. 你 cd 到某个位置。
  2. 你'make -f Makefile_A clean'。
  3. make 使用 Makefile_A 运行,并执行“$(MAKE) -f Makefile_B clean”。
  4. make[1] 使用 Makefile_B 运行,并执行“$(MAKE) clean-linux”。
  5. make[2] 与这里的任何 makefile 一起运行,这可能是任何东西(我怀疑它是 Makefile_A),但无论它是什么,它都没有针对 clean-linux 的规则。

解决方案:重写你的第二个 makefile(具有 clean-linux 的那个),以便 clean-linux 成为 clean 的先决条件(如果/当你在 Linux 系统上时)。 这样它就不会运行 make[2]。

ifeq ($(PLATFORM), LINUX)
clean: clean-linux
endif

ifeq ($(PLATFORM), SUNOS)
clean: clean-sunos
endif

clean:;

When you make (or $(MAKE)), by default you use whatever makefile is there. So here's what I think is happening.

  1. You cd to some location.
  2. You 'make -f Makefile_A clean'.
  3. make runs with Makefile_A, and does '$(MAKE) -f Makefile_B clean'.
  4. make[1] runs with Makefile_B, and does '$(MAKE) clean-linux'.
  5. make[2] runs with whatever makefile is here which might be anything (I suspect it's Makefile_A) but whatever it is it has no rule for clean-linux.

The solution: rewrite your second makefile (the one that has clean-linux) so that clean-linux becomes a prerequisite of clean (if/when you're on a linux system). That way it won't run make[2].

ifeq ($(PLATFORM), LINUX)
clean: clean-linux
endif

ifeq ($(PLATFORM), SUNOS)
clean: clean-sunos
endif

clean:;
属性 2024-08-09 00:31:00

只是猜测,但也许第二个 makefile 中的“clean”目标调用“clean-linux”?

你能发布第二个makefile的干净目标吗?

编辑:

根据您发布的 clean 目标,您似乎只是错误地调用了 clean-linux 目标。

Beta 已在其答案中发布了处理您的问题的正确方法,因此我将+1。

Just a guess but maybe the 'clean' target in the second makefile calls 'clean-linux'?

Can you post the clean target of the second makefile?

Edit:

In light of your posted clean target it seems you're just calling the clean-linux target incorrectly.

Beta has posted the correct way of dealing with your problem in their answer so I'm going to +1 that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文