是否可以向另一个 Makefile 添加依赖项?
Is it possible to add a dependency to another Makefile?
我不是在问是否可以 call Makefile from another Makefile。
假设我有一个生成如下所示的可执行文件的规则:
my-prog: some.o local.o dependencies.o
请注意,我在这里利用 built-in rules。
现在假设我开始使用第三方库。我想保留此内置语法,并将外部规则添加到依赖项列表中:
my-prog: some.o local.o dependencies.o somelib/libsomelib.a
但这行不通:
No rule to make target 'somelib/libsomelib.a', needed by 'my-prog'.
我知道我可以通过显式调用另一个 Makefile 来解决这个问题:
my-prog: some.o local.o dependencies.o
$(MAKE) -C somelib/ libsomelib.a
$(CC) $(LDFLAGS) -o $@ $^ somelib/libsomelib.a
但这正是我要避免的。有什么想法吗?
在 select 的情况下,可能只 include
另一个 Makefile,但在那些情况下,它们很可能一开始就写成一个,所以...失败了,使依赖项跟踪工作的最佳方法是扩展递归 make 方法——您自己的 makefile 无法跟踪 somelib/libsomelib.a
的依赖项,因此您将不得不要求其他 Makefile 为你每一次。恐怕没有办法解决这个问题。
但是,您可以让自己继续使用隐式规则,并将外部库的依赖性跟踪转移到另一个 makefile。我正在考虑这些外国构建的虚假目标,如下所示:
somelib/libsomelib.a:
$(MAKE) -C somelib/ libsomelib.a
# This target needs to be phony so it is run every time because only the other
# makefile can determine that there's nothing to be done.
.PHONY: somelib/libsomelib.a
# then you can use it as a dependency just like locally built targets
my-prog: some.o local.o dependencies.o somelib/libsomelib.a
这可以像这样扩展到多个外国目标:
# list foreign targets here
FOREIGN_TARGETS = \
somelib/libsomelib.a \
foo/libfoo.a \
bar/libbar.a
$(FOREIGN_TARGETS):
# split the target into directory and file path. This assumes that all
# targets directory/filename are built with $(MAKE) -C directory filename
$(MAKE) -C $(dir $@) $(notdir $@)
.PHONY: $(FOREIGN_TARGETS)
我不是在问是否可以 call Makefile from another Makefile。
假设我有一个生成如下所示的可执行文件的规则:
my-prog: some.o local.o dependencies.o
请注意,我在这里利用 built-in rules。
现在假设我开始使用第三方库。我想保留此内置语法,并将外部规则添加到依赖项列表中:
my-prog: some.o local.o dependencies.o somelib/libsomelib.a
但这行不通:
No rule to make target 'somelib/libsomelib.a', needed by 'my-prog'.
我知道我可以通过显式调用另一个 Makefile 来解决这个问题:
my-prog: some.o local.o dependencies.o
$(MAKE) -C somelib/ libsomelib.a
$(CC) $(LDFLAGS) -o $@ $^ somelib/libsomelib.a
但这正是我要避免的。有什么想法吗?
在 select 的情况下,可能只 include
另一个 Makefile,但在那些情况下,它们很可能一开始就写成一个,所以...失败了,使依赖项跟踪工作的最佳方法是扩展递归 make 方法——您自己的 makefile 无法跟踪 somelib/libsomelib.a
的依赖项,因此您将不得不要求其他 Makefile 为你每一次。恐怕没有办法解决这个问题。
但是,您可以让自己继续使用隐式规则,并将外部库的依赖性跟踪转移到另一个 makefile。我正在考虑这些外国构建的虚假目标,如下所示:
somelib/libsomelib.a:
$(MAKE) -C somelib/ libsomelib.a
# This target needs to be phony so it is run every time because only the other
# makefile can determine that there's nothing to be done.
.PHONY: somelib/libsomelib.a
# then you can use it as a dependency just like locally built targets
my-prog: some.o local.o dependencies.o somelib/libsomelib.a
这可以像这样扩展到多个外国目标:
# list foreign targets here
FOREIGN_TARGETS = \
somelib/libsomelib.a \
foo/libfoo.a \
bar/libbar.a
$(FOREIGN_TARGETS):
# split the target into directory and file path. This assumes that all
# targets directory/filename are built with $(MAKE) -C directory filename
$(MAKE) -C $(dir $@) $(notdir $@)
.PHONY: $(FOREIGN_TARGETS)