我目前面临以下问题:
如何创建一个全局 Makefile 以从我的源代码树构建不同的应用程序(可能使用相同或不同的库)?目前我只有一个应用程序,我所做的就是:
include $(ROOT)/SETUP.MAK
SUBDIRS = \
lib1 \
lib2 \
app1
include $(ROOT)/RULES.MAK
应用程序按应有的方式构建。但现在我将拥有更多的应用程序,也许还有更多的库。我不想为每个应用程序创建单独的 Makefile,因为库/代码库对于不同的应用程序是相同的。这是我尝试过的:
include $(ROOT)/SETUP.MAK
ifeq ($(strip $(MAKECMDGOALS)),proj1)
SUBDIRS = \
lib1 \
lib2 \
app1
endif
ifeq ($(strip $(MAKECMDGOALS)),proj2)
SUBDIRS = \
lib1 \
lib2 \
lib3 \
app2
endif
.PHONY: proj1
proj1: $(SUBDIRS)
.PHONY: proj2
proj2: $(SUBDIRS)
include $(ROOT)/RULES.MAK
但问题是make进入第一个目录,这里是“lib1”并尝试构建“lib1”,但是“lib1”中没有“proj1”的规则。这是如何正确完成的?我用“make proj1”在命令行调用make。
注意:SUBDIRS 的生成规则在文件 RULES.MAK 中
编辑 1: 这是 SUBDIRS 的规则:
# entering dir c; calculating deps; leaving dir c; entering dir c; making blah; leaving dir c
$(SUBDIRS) :
# call as make NOT_RECURSIVE=1 to avoid recursion
ifndef NOT_RECURSIVE
ifneq ($(MAKEFILE_DIR),./) # some makefile path given
$(VERBOSE) $(MKDIR) $@
ifneq ($(call isabspath, $(MAKEFILE_DIR)),) # absolute makefile path
@$(MAKE) -C $@ -f $(MAKEFILE_DIR)$@/$(MAKEFILE_NOTDIR) $(MAKECMDGOALS)
else # relative makefile path
@$(MAKE) -C $@ -f ../$(MAKEFILE_DIR)$@/$(MAKEFILE_NOTDIR) $(MAKECMDGOALS)
endif
else # no makefile path given
@$(MAKE) -C $@ $(MAKECMDGOALS)
endif
endif