【发布时间】:2014-02-16 02:51:27
【问题描述】:
我目前尝试编写一个 Makefile 来正确构建一个包含 git 子模块的项目。该子模块有自己的一组 makefile,并一次生成多个目标,包括一些库。
此 Makefile 应具有以下属性。
- 即使使用并行构建,也不要重新构建子模块两次。
- 当子模块代码改变时更新子模块目标(也许 因为我浏览了主存储库的修订版)。
- 当子模块库发生变化时重新链接主项目。
- 不要在顶层项目中复制粘贴子模块的 Makefile(即保持 Makefile 递归)。
只是为了设定想法,这似乎可行。
FOO_SUBDIR := $(CURDIR)/foo
LDFLAGS := -L$(FOO_SUBDIR)
FOO_LIBSFILES := $(FOO_SUBDIR)/libfoo.a $(FOO_SUBDIR)/libgnufoo.a
FOO_LDLIBS := -lfoo -lgnufoo
.PHONY: all
all: main
# There are theoretically 3 main binaries
main: main.c $(FOO_LIBSFILES)
gcc -o $@ $< $(LDFLAGS) $(FOO_LDLIBS)
$(FOO_LIBSFILES): libfoo
@# Do nothing
.PHONY: libfoo
libfoo:
$(MAKE) -C $(FOO_SUBDIR)
似乎我添加了空食谱,但我不明白为什么。
想法是始终依赖子模块的 Makefile 来重建(或不重建)libfoo.a 和 libgnufoo.a,并让主 Makefile 决定是否需要重建 main。没有空食谱,它就行不通。当 foo/foo.c 被修改时,libfoo.a 被重建,但 make 不会重建 main。
我感觉空配方强制检查目标文件的日期。但我找不到有关此行为的文档。
这是正确的方法吗?我应该注意什么陷阱?有什么不那么晦涩难懂的方法吗?或有关此行为的任何文档?
提前致谢。
【问题讨论】:
标签: git makefile gnu-make git-submodules