目标特定变量作为Makefile中的必备条件

问题描述 投票:14回答:3

我正在尝试编写一个GNU make Makefile,该文件具有类似目标的负载,在这些目标之间,构建命令略有不同。我正在尝试使用target-specific variables代表这些变化。其中一些变量值引用了我要用作前提条件的文件。例如:

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)

[当我调用'make target_1'时,如果它不存在,我希望它使target1_prereq。目前,即使使用正确的参数调用了构建命令(do_something),它似乎也没有使用target1_prereq作为先决条件。

我正在使用GNU Make 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)
build-process build dependencies makefile
3个回答
4
投票

仅在目标的命令(或其他特定于目标的分配)中定义了特定于目标的变量;它不能用作目标的先决条件之一。我认为在Make中没有一种干净的方法可以完成您想要的事情,但是有几种繁琐的方法,例如:

扩展= .exta .extbtarget_1:$(addprefix target1_prereq,$(EXTENSIONS))target_2:$(addprefix target2_prereq,$(EXTENSIONS))target_1 target_2:common_filename    do_something common_filename --a-weird-option = $(过滤器%.exta,$ ^)--second = $(过滤器%.extb,$ ^)

3
投票

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

target_1:special_filename = target1_prereqtarget_1:target1_prereqtarget_2:特殊文件名= target2_prereqtarget_2:target2_prereqtarget_1 target_2:common_filename $ {special_filename)    do_something common_filename --a-weird-option = $(特殊文件名)

[有一些冗余,但是它是本地化的,所以还不错。


2
投票

我发现了一种避免此限制的相当干净的方法。它会像这样:

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_2的所有原始必备条件的代理目标,并在target_1 target_2中使用此代理目标再次调用Makefile。由于到那时目标特定变量将具有值(到那时我们在配方中为)已被export编辑,因此它们将在target-proxy-voila中可用:)] >此方法的缺点是,我们正在创建另一个make进程-如果只是另一个进程,那可能没问题,但是YMMV请格外小心。
© www.soinside.com 2019 - 2024. All rights reserved.