Makefile中无法在shell中调用的目标

时间:2016-06-30 07:17:41

标签: bash makefile

我在Makefile中有多个不同的目标,但我不希望用户能够从shell调用其中的一些,它们只是其他目标的先决条件。例如:

target1: pre1 pre2
    ...

target2: target3
    ...

target3:
    ...

我想禁用在bash中调用target3,这样可以防止bash在键入make target3时显示make target,然后按下tab

简而言之,我不希望使用Makefile调用make的人知道target3存在。有可能实现吗?

3 个答案:

答案 0 :(得分:1)

make中没有专家,有点环顾GNU make页面

  

默认情况下,make从第一个目标开始(而不是名称以“。”开头的目标)。

因此,当make标识默认目标时,不会考虑以句点开头的目标名称。您可以尝试在目标之前添加dot.

target1: pre1 pre2
    ...

target2: .target3
    ...

.target3:
    ...

,以便在您按下target3时显示默认显示tab

答案 1 :(得分:1)

实现此目的的一种方法是使用变量make解析给MAKECMDGOALS命令的目标。

以下是Makefile

的外观
ifeq ($(MAKECMDGOALS),)
ALLOWED=1
endif

target1: target2 target3
ifdef ALLOWED 
    echo "target1"
endif

target2:
ifdef ALLOWED 
    echo "target2"
endif

target3: 
ifdef ALLOWED 
    echo "target3"
endif

如果make没有目标,它将执行echomake target3不会输出任何内容。

如果您想允许特定目标,可以添加以下内容:

ifeq ($(filter target1,$(MAKECMDGOALS)),target1)
ALLOWED=1
endif

答案 2 :(得分:0)

免责声明:此答案完全取决于您使用的Linux发行版。这是在Ubuntu 16.04上测试的:

将其标记为隐藏目标。将其重命名为以非字母数字字符串开头的内容。

常用选项为.target3

来自declare -f _make_target_extract_script

  /^[^a-zA-Z0-9]/             d             # convention for hidden tgt

上面这一行是sed脚本的一部分,它通过bash-completion函数make打印_make的目标列表。