【问题标题】:Makefile with two targets with the same name具有两个同名目标的 Makefile
【发布时间】:2012-06-20 17:35:39
【问题描述】:

我有一个包含包含语句的生成文件。我无法控制包含的 makefile 的内容。不过,我希望能够在“一些”(不是全部)目标之前添加一些预处理步骤。考虑以下示例:

install:
      @echo "install target"

include othermakefile.mk

othermakefile.mk 也包含 install 目标。如果我运行此脚本,make 会发出警告并忽略第一个 install 目标。

【问题讨论】:

  • 然后将您的目标重命名为不太可能发生冲突的名称(例如foo_blah_install)。
  • 正如我所说,我希望脚本在用户输入“make install”时运行一些预处理命令。我不想更改目标的名称。

标签: makefile


【解决方案1】:

再简单不过了:

install: pre_install

.PHONY: pre_install
pre_install:
    do preinstallation things

include othermakefile.mk

编辑:
如果你想在install 或其任何前置任务之前运行pre_install,这里有一个方法。它既粗鲁又丑陋,但它确实有效:

install: pre_install
    $(MAKE) -f othermakefile.mk $@

.PHONY: pre_install
pre_install:
    do preinstallation things

请注意,这不一定会重建 install 的所有先决条件,因此其中一些可能会保持旧状态,并且不会反映 pre_install 的效果。如果这还不够好,并且您希望pre_install所有其他先决条件之前,您可以添加一个选项标志:

install: pre_install
    $(MAKE) --always-make -f othermakefile.mk $@

现在 Make 将假定所有目标都已过期,并从头开始重建(在 pre_install 之后)。

【讨论】:

  • +1。但是是否保证 Make 会以自上而下的顺序处理 installs 依赖关系?即如果othermakefile.mk 包含install: foobar,是否保证pre_installfoorbar 之前得到处理?
  • @OliCharlesworth:不,没有这样的保证; Make 将在install 之前构建pre_install(这是我阅读问题的方式),但不一定在install 的其他先决条件之前。 一种方法可以让它领先于所有其他目标,但它更加激进。
  • 你能告诉我如何把它放在所有其他先决条件之前
猜你喜欢
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多