具体目标变量作为先决条件的一个Makefile(Target-specific Variab

2019-07-03 20:50发布

我试图写一个GNU使Makefile文件具有类似的目标,在构建命令它们之间略有不同的负载。 我试图使用特定目标变量来表示这些变化。 其中的一些变量值的参考我想作为先决条件使用的文件。 例如:

target_1:special_filename=target1_prereq
target_2:special_filename=target2_prereq

target_1 target_2: common_filename $(special_filename)
    do_something common_filename --a-weird-option=$(special_filename)

当我打电话“做target_1”,我想它做target1_prereq如果它不存在。 目前,它似乎并没有使用target1_prereq作为前提,即使生成命令(do_something)被调用合适的参数。

我使用GNU使3.80。


编辑:从现实系统中的一些并发症较多。 是一些变量本身基于其他变量的值。 手动指定的先决条件无法扩展。 稍微复杂一点的例子:

target_1:special_filename_base=target1_prereq
target_2:special_filename_base=target2_prereq

some_filename_a = $(special_filename_base).exta
some_filename_b = $(special_filename_base).extb

target_1 target_2: common_filename $(special_filename_b) $(special_filename_a)
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b)

Answer 1:

靶特异性变量被定义仅在目标的命令(或其它靶特异性分配); 它不能被用来作为目标的prereqs之一。 我不认为有一个干净的方式做你的制作想要的东西,但有几个kludgey方法,如以下几点:

EXTENSIONS = .exta .extb
target_1: $(addprefix target1_prereq,$(EXTENSIONS))
target_2: $(addprefix target2_prereq,$(EXTENSIONS))

target_1 target_2: common_filename
    do_something common_filename --a-weird-option=$(filter %.exta,$^) --second=$(filter %.extb,$^)


Answer 2:

作为一个简单的解决方法:

target_1:special_filename=target1_prereq
target_1:target1_prereq
target_2:special_filename=target2_prereq
target_2:target2_prereq

target_1 target_2: common_filename $(special_filename)
    do_something common_filename --a-weird-option=$(special_filename)

有一些冗余,但它是局部的,所以它不是太糟糕了。



Answer 3:

我发现的边踩着这个限制相当干净的方式。 它会去是这样的:

target_1:export special_filename_base=target1_prereq
target_2:export special_filename_base=target2_prereq

some_filename_a = $(special_filename_base).exta
some_filename_b = $(special_filename_base).extb

target_1 target_2:
    $(MAKE) -f $(firstword $(MAKEFILE_LIST)) target-proxy

target-proxy: common_filename $(special_filename_b) $(special_filename_a)
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b)

两点很重要:

  1. export的目标变量,这样他们就可以访问,当我们重新运行Makefile文件。
  2. 创建具有的所有原始先决条件的代理目标target_1 target_2target_1 target_2与此代理对象再次调用Makefile文件。 由于目标特定变量届时将有值(我们由当时的配方) 他们export版,他们将在提供target-proxy -瞧:)

这种方法的缺点是,我们正在创造另一个make过程-如果它只是另一个则它可能是好的,但情况因人而异,所以要格外小心。



文章来源: Target-specific Variables as Prerequisites in a Makefile