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

Bash Makefile中无法在shell中调用的目标,bash,makefile,Bash,Makefile,我在Makefile中获得了多个不同的目标,但我不希望用户能够从shell调用其中一些目标,它们只是其他目标的先决条件。例如: target1: pre1 pre2 ... target2: target3 ... target3: ... 我想在bash中禁用调用target3,这种方式甚至可以防止bash在键入maketarget然后按下tab键时显示maketarget3 简而言之,我不希望使用我的Makefile调用make的人知道target3存在。有可能

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

target1: pre1 pre2
    ...

target2: target3
    ...

target3:
    ...
我想在bash中禁用调用
target3
,这种方式甚至可以防止bash在键入
maketarget
然后按下
tab
键时显示
maketarget3


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

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

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

常见选项是
.target3

declare-f\u make\u target\u extract\u脚本中

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

上面这一行是
sed
脚本的一部分,该脚本通过bash完成函数
\u make

免责声明打印
make
的目标列表:
此答案完全取决于您使用的linux发行版。这是在Ubuntu 16.04上测试的:

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

常见选项是
.target3

declare-f\u make\u target\u extract\u脚本中

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

上面这一行是
sed
脚本的一部分,该脚本通过bash完成函数
\u make
打印
make
的目标列表,无需专门查看页面

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

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

target1: pre1 pre2
    ...

target2: .target3
    ...

.target3:
    ...

要避免按下
选项卡时默认显示
target3

没有
make方面的专家,请查看页面

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

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

target1: pre1 pre2
    ...

target2: .target3
    ...

.target3:
    ...

要避免按下
tab
时默认显示
target3

一种方法是使用变量
MAKECMDGOALS
解析给定给
make
命令的目标

下面是
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
没有目标,它将执行
echo
make target3
将不会输出任何内容

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

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

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

下面是
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
没有目标,它将执行
echo
make target3
将不会输出任何内容

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

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

dot(.)
完成了任务!。谢谢,我正在寻找一些特殊的内置目标名称,但是
dot(.)
就足够了。它解决了,但只是部分解决了。当我键入
make target
并按
tab
键时,带有
dor(.)
的目标不会出现,但我仍然可以通过键入
make.target从bash调用此目标。
点(.)
完成了任务!。谢谢,我正在寻找一些特殊的内置目标名称,但是
dot(.)
就足够了。它解决了,但只是部分解决了。具有
dor(.)的目标
当我键入
make target
并按
tab
键时,不会出现,但我仍然可以通过键入
make.target
从bash调用此目标。只需记录有效的
make
目标。我可以这样做,但它不会保护我免受白痴的伤害。只需记录有效的
make
目标。我可以这样做,但它不会保护我免受白痴的伤害。好吧,我明白了,你的回答帮助我解决了这个问题。好吧,我明白了,你的回答帮助我解决了这个问题。