我在Makefile中有多个不同的目标,但我不希望用户能够从shell调用其中的一些,它们只是其他目标的先决条件。例如:
target1: pre1 pre2
...
target2: target3
...
target3:
...
我想禁用在bash中调用target3
,这样可以防止bash在键入make target3
时显示make target
,然后按下tab
键
简而言之,我不希望使用Makefile调用make的人知道target3
存在。有可能实现吗?
答案 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
没有目标,它将执行echo
。 make 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
的目标列表。