Export 是否可以在make中覆盖特定于目标的全局变量?

Export 是否可以在make中覆盖特定于目标的全局变量?,export,overriding,target,gnu-make,Export,Overriding,Target,Gnu Make,考虑以下makefile: # various settings, lots of them # (supposed to be in defaults.mk) option1="glob_val1" option2="glob_val2" #option3="glob_val3" # uncomment and it will override target-specific in sub-make option4="glob_val4" # goal is to make many ite

考虑以下makefile:

# various settings, lots of them
# (supposed to be in defaults.mk)
option1="glob_val1"
option2="glob_val2"
#option3="glob_val3" # uncomment and it will override target-specific in sub-make
option4="glob_val4"

# goal is to make many items with various options
# which share common setup, but change in details.
all: item1 item2

# Item 1 is common + changed option3
item1: export option3="i1_val3"
item1:
    @echo "start item1:option3=$(option3)"
    $(MAKE) generic_item
    @echo "done item1"

# Item 2 is common + another option3
item2: export option3="i2_val3"
item2:
    @echo "start item2: option3=$(option3)"
    $(MAKE) generic_item
    @echo "done item2"

# This is generic item that does everything
# basing on options settings
generic_item:
    @echo "do generic option3=$(option3) [expecting i<X>_val3 here]"
#各种设置,很多
#(应该在defaults.mk中)
option1=“全球价值1”
option2=“全球价值2”
#option3=“glob_val3”#取消注释,它将覆盖sub make中的特定目标
option4=“全球价值4”
#目标是使许多项目与各种选择
#共享公共设置,但在细节上有所更改。
全部:第1项第2项
#项目1为普通+更改选项3
项目1:导出选项3=“i1_val3”
项目1:
@echo“开始项1:option3=$(option3)”
$(制作)通用项目
@回显“完成项目1”
#项目2为通用+另一选项3
第2项:出口选项3=“i2_val3”
项目2:
@echo“开始项2:option3=$(option3)”
$(制作)通用项目
@回显“完成项目2”
#这是一个通用的项目,做一切
#基于选项设置
一般项目:
@echo“do generic option3=$(option3)[此处应为i_val3]”
我想要的是覆盖target和 然后调用“generic_item”中的generic例程

问题是,如果在Makefile顶部定义了option3, 它会原封不动地传递到sub make中。如果顶部的选项3被注释 完成后,所有工作均按预期进行:

start item1:option3=i1_val3
make generic_item
make[1]: Entering directory `/tmp/make_items'
do generic option3=i1_val3 [expecting i<X>_val3 here]
make[1]: Leaving directory `/tmp/make_items'
done item1
start item2: option3=i2_val3
make generic_item
make[1]: Entering directory `/tmp/make_items'
do generic option3=i2_val3 [expecting i<X>_val3 here]
make[1]: Leaving directory `/tmp/make_items'
done item2
start item1:option3=i1_val3
制作通用项目
make[1]:输入目录“/tmp/make\u items”
do generic option3=i1_val3[此处应为i_val3]
make[1]:离开目录“/tmp/make\u items”
完成项目1
开始项2:选项3=i2_val3
制作通用项目
make[1]:输入目录“/tmp/make\u items”
do generic option3=i2_val3[此处应为i_val3]
make[1]:离开目录“/tmp/make\u items”
完成项目2
我不想使用$(MAKE)option1=。。。选项2=。。。通用项目 语法,因为它看起来不好,而且有很多选项 长值,所有这些都会进入日志,看起来不太好

目标是有一个共同的目标,根据价值观做事 选项的数量(很多)以及通过额外的 仅需要覆盖特定值/添加新操作的目标 剩下的留给共同的目标


如果我的错误,请建议另一种方法。

主要修复方法是将
-e
添加到submake

我建议进行一些增强。GNU Make手册是这种高级脚本编写的宝库

请注意,使用下面所示的方法,几乎不需要使用submake。我只在

    由于更改的内容,我需要重新加载主文件(我认为是设计气味并设法避免)
  • 我想把工作分成两部分
为方便起见,我坚持使用submake方法向您展示它是可以做到的:

export option="glob_val"

.SECONDEXPANSION: # http://www.gnu.org/s/hello/manual/make/Secondary-Expansion.html

TARGETS=item1 item2 item3 item4 item5

all: $(TARGETS)

$(TARGETS): option="$(@)_val"
$(TARGETS):
    @echo "start $@:option=$(option)"
    $(MAKE) -e generic_item
    @echo "done $@"

generic_item:
    @echo "do generic option=$(option)"
make-s的输出

start item1:option=item1_val
start item2:option=item2_val
start item3:option=item3_val
start item4:option=item4_val
start item5:option=item5_val
do generic option=item1_val
do generic option=item2_val
done item1
do generic option=item4_val
done item2
do generic option=item3_val
done item4
do generic option=item5_val
done item5
done item3

谢谢大家!-e是缺少的。@VLH:感谢您接受并欢迎来到StackOverflow!非常感谢您的反馈