我试图写一个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)
靶特异性变量被定义仅在目标的命令(或其它靶特异性分配); 它不能被用来作为目标的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,$^)
作为一个简单的解决方法:
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)
有一些冗余,但它是局部的,所以它不是太糟糕了。
我发现的边踩着这个限制相当干净的方式。 它会去是这样的:
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)
两点很重要:
-
export
的目标变量,这样他们就可以访问,当我们重新运行Makefile文件。 - 创建具有的所有原始先决条件的代理目标
target_1 target_2
和target_1 target_2
与此代理对象再次调用Makefile文件。 由于目标特定变量届时将有值(我们是由当时的配方) 和他们export
版,他们将在提供target-proxy
-瞧:)
这种方法的缺点是,我们正在创造另一个make
过程-如果它只是另一个则它可能是好的,但情况因人而异,所以要格外小心。