GNU覆盖目标?

时间:2013-07-22 23:45:45

标签: makefile gnu-make

我想知道是否可以覆盖makefile中的目标!由于自动生成,我正在工作的环境不允许我这样做!我想知道如果我在静态目标上方或下方编码相同的规则会实现覆盖吗?

%_emul.flist: $(if ${GEN_FLIST},%_synth.flist,) ${rdlh_file_deps}
    ${QUIET}if test ${SYN_DEBUG} -eq 1 ; then set -xv ; fi; \
    $(if ${TOOL_VERILOG},rm -f $@; touch $@,$(if ${TOOL_BBOX_LIBS},echo ${TOOL_BBOX_LIBS} > $@,rm -f $@; touch $@))
    /bin/sed -e '/\/libs\//d' -e '/\/place\//d' $(foreach mod,$(filter %.vhd,$^),-e 's%^\(.*\/\)\{0,1\}$(basename $(notdir ${mod}))\.v$$%${mod}%') $*_synth.flist >> $@

1 个答案:

答案 0 :(得分:1)

是的,我认为这样可行....但你需要对编码方式更加小心。你不想覆盖可能有用的东西!

GNU make将采用它遇到的最新目标。所以,以下工作(但不是我希望它工作:()

输出:我认为你正在寻找类似的东西 -

Kaizen ~/make_prac $  make -nf mk.name
mk.name:20: warning: overriding recipe for target `name'
mk.name:17: warning: ignoring old recipe for target `name'
arg1="Kaizen" ;
echo "hello "" ;" ;
hello  ;

代码:此处目标“名称”出现两次并被覆盖。

Kaizen ~/make_prac $ cat mk.name
##
## make to accept name and display hello name
##

arg1="" ;

.PHONY : name \
  hello

#.DEFAULT :
#       hello

hello : name
        + echo "hello $(arg1)" ;

name :
        echo "name given is : $(arg1)" ;

name :
        arg1="Kaizen" ;

PS:注意:的使用 - 如果您使用::,则两个规则都会被执行。

输出中未显示的arg1 ....的解释:变量arg1,即使它在第一次解析中被分配,也会被忽略,因为它的赋值是依赖于目标的。如果你在其他地方有变量声明 - 例如像arg1一样在开始时定义 - 不会有任何解除引用问题。

相关问题