Makefile中的别名目标名称

时间:2014-04-17 14:25:00

标签: makefile alias target synonym

问题:

是否可以为目标指定不同的名称或别名,以便可以使用原始目标名称或别名来调用它。

例如

/very/long/path/my_binary: dep_a dep_b dep_c
    # Compile

# Desired command
ALIAS my_binary = /very/long/path/my_binary

# NOTE: Notice the use of 'my_binary' in the dependencies
data1: my_binary datafile
    # Build data file using compiled my_binary

尝试1:.PHONY

我尝试过使用.PHONY目标:

.PHONY: my_binary
my_binary: /very/long/path/my_binary

从命令行调用时,这很有用:

# Runs rule 'my_binary' and then *only* runs rule '/very/long/path/my_binary'
# if the rule '/very/long/path/my_binary' needs updating.
make my_binary

但是,当别名my_binary被列为依赖项时,这不能很好地工作:

# *Always* thinks that rule 'data1' needs updating, because it always thinks that
# the .PHONY target 'my_binary' "needs updating". As a result, 'data1' is
# rebuilt every time.
make /very/long/path/my_binary

可能的黑客攻击?

可能的hack是使用an answer to this question中建议的空目标,但这需要引入名称与别名对应的伪文件:

my_binary: /very/long/path/my_binary
    touch my_binary

这会使主目录与文件混乱!将伪文件放在子目录中会失败,因为别名必须被称为'directory / my_binary'

2 个答案:

答案 0 :(得分:13)

我不认为有任何方法可以使用makefile和命令行中的别名,除非创建这些临时文件。

为什么不能在makefile中设置变量,例如:

my_binary = /very/long/path/my_binary

然后在makefile中的任何地方使用$(my_binary)?我没有看到创建一个真正的别名目标,以便在 makefile中使用

答案 1 :(得分:12)

好的,我需要类似的东西。我的输出工件的路径很长,但我想要短目标名称,并且从bash-completion中也很容易受益。

以下是我提出的建议:

$ make os
$ make platform

使用上面的Makefile,您可以说:

{{1}}

这将是长工件名称的别名。我已经将上面的代码片段制作了很长时间,因为查看.PHONY别名和真实目标之间的关系非常重要。我希望这对你有用。

注意:我没有从上面的示例中删除干净的目标,因为很多人没有将其作为.PHONY目标。但是,在语义上它应该是。