如何在目标执行期间定义$(MAKEFILE)变量? 基本上我在子目录中有一些make文件,这些子目录是为特定平台“Makefile.aix”命名的,而在所有其他目录中只是Makefile。我想为每个子目录中定义的$(MAKEFILE)设置一个变量。代码看起来像这样。
MAKEFILE = Makefile
SUBDIR = ./sub ./sub2
ifneq ($(wildcard Makefile),)
MAKEFILE = Makefile
else
MAKEFILE = Makefile.$(PLATFORM)
endif
all:;
@for i in $(SUBDIR);\
do (\
echo Making $$i ...;\
cd $$i;\
make -f $(MAKEFILE)\
); done
答案 0 :(得分:1)
对于不同的平台,每个子目录中只有一个Makefile.$(PLATFORM)
,还是有几个?{
在第一种情况下,你可以这样做:
SUBDIR = ./sub ./sub2 define script cd $(1); \ $(MAKE) -f Makefile* endef all: $(foreach dir, $(SUBDIR), $(call script,$(dir)))
(define中的空行很重要。如果你在行$(MAKE) ...
的末尾添加一个分号,可以省略它,导致一个长命令行,包含所有目录的命令,然后将在一个块中执行。)
替代script
将是(只是个人喜好的问题,你更喜欢):
define script $(MAKE) -C $(1) -f $(notdir $(wildcard $(1)/Makefile*)) endef
如果目录中有多个Makefile.$(PLATFORM)
个文件,则会变得更加困难。我将不得不考虑那个。
更新:在回复你的评论时,这样的事情应该有效:
define script $(MAKE) -C $(1) -f $(notdir $(wildcard $(1)/Makefile $(1)/Makefile.$(PLATFORM))) endef
答案 1 :(得分:0)
按照你的逻辑,我建议更新do()部分:
do (\
echo Making $$i ...;\
cd $$i;\
if [ -f Makefile.$(PLATFORM) ] \
then\
make -f Makefile.$(PLATFORM) \
else\
make -f Makefile\
fi\
); done
这实际上不是一种制作风格,但如果没有具体的项目,我无法提出更好的建议
答案 2 :(得分:0)
你可以使用GNU make的内置函数来完成大部分工作,包括循环目录。将以下内容置于中心位置,例如$(TOP_DIR)/mk/subdir.mk
:
makefile-for-dir = \
$(if $(wildcard $(1)/Makefile),Makefile,Makefile.$(PLATFORM))
make-recursive = \
$(foreach _d,$(1),$(MAKE) -C $(_d) -f $(call makefile-for-dir,$(_d)) && ) :
在每个启动递归make的makefile中,使用
include $(TOP_DIR)/mk/subdir.mk
SUBDIRS = dir1 dir2 dir3
.PHONY: all
all:
+@$(call make-recursive,$(SUBDIRS))