Export 是否可以在make中覆盖特定于目标的全局变量?
考虑以下makefile: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
# 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。我只在
- 我想把工作分成两部分
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!非常感谢您的反馈