从子目录设置makefile名称的目标变量

时间:2011-04-14 18:29:50

标签: makefile

如何在目标执行期间定义$(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

3 个答案:

答案 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))