Bash Makefile中无法在shell中调用的目标
我在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存在。有可能
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
目标。我可以这样做,但它不会保护我免受白痴的伤害。好吧,我明白了,你的回答帮助我解决了这个问题。好吧,我明白了,你的回答帮助我解决了这个问题。