4

主要是为了我的娱乐,我makefile在我的$HOME/bin目录中创建了一个名为rebuild.mk,并使其可执行,文件的第一行读取:

#!/bin/make -f
#
# Comments on what the makefile is for

...

all: ${SCRIPTS} ${LINKS} ...

...

我现在可以输入:

rebuild.mk

这会导致make执行。

除此以外,不永久利用此功能的原因是什么:

  • makefile 绑定到单个目录,因此它确实不适合我的主bin目录。

有没有人见过以前被利用的把戏?


收集一些评论,并提供更多背景信息。

  1. Norman Ramsey 报告说这种技术被用于 Debian。这很有趣。谢谢你。
  2. 我同意输入“make”更习惯用语。
  3. 但是,这种情况(以前未说明)是我的 $HOME/bin 目录中已经有一个跨平台的主 makefile,它是目录中 500 多个命令的主要维护工具。
  4. 但是,在一台特定的机器上(仅),我想添加一个生成文件来构建一组特殊的工具。因此,这些工具得到了一个特殊的 makefile,我rebuild.mk为这个问题调用了它(它在我的机器上有另一个名字)。
  5. 我确实可以make -f rebuild.mk通过使用 ' rebuild.mk' 来节省键入 ' ' 的时间。
  6. make跨平台修复实用程序的位置是有问题的。
  7. #!/usr/bin/env make -f技术可能会奏效,尽管我相信官方的交战规则是该行必须少于 32 个字符,并且命令可能只有一个参数。
  8. @dF 评论说该技术可能会阻止您传递要制作的参数。无论如何,这在我的 Solaris 机器上不是问题。我测试的三个不同版本的“make”(Sun、GNU、我的)都得到了我输入的额外命令行参数,包括选项(我的自制版本上的“-u”)和目标“someprogram”和宏 CC ='cc' WFLAGS=-v(使用不同的编译器并取消 Sun 编译器不理解的 GCC 警告标志)。

我不会提倡将其作为一种通用技术。

如前所述,这主要是为了我的消遣。我可以为这项特殊的工作保留它;我不太可能在分布式工作中使用它。如果我这样做了,我会提供并应用一个' fixin'脚本来修复解释器的路径名;事实上,我已经在我的机器上这样做了。该脚本是 Camel 书第一版(Larry Wall 的“Programming Perl”)的遗物。

4

7 回答 7

5

对于一般可分发的 Makefile 来说,这样做的一个问题是,make跨平台的位置并不总是一致的。此外,某些系统可能需要备用名称,例如gmake.

当然,人们总是可以手动运行适当的命令,但这违背了使 Makefile 可执行的整个目的。

于 2008-12-22T04:19:57.050 回答
5

我以前在每个 Debian 软件包的文件中都看到过这个技巧。debian/rules

于 2008-12-22T04:36:25.753 回答
3

为了解决make不总是在同一个地方的问题(例如在我的系统上/usr/bin),您可以使用

#!/usr/bin/env make -f

如果您使用的是类 UNIX 系统。

另一个问题是,通过这种方式使用 Makefile,您无法覆盖变量,例如make CFLAGS=....

于 2008-12-22T04:26:55.337 回答
2

“make”比“./Makefile”短,所以我不认为你在买任何东西。

于 2008-12-22T04:24:04.607 回答
0

我不这样做的原因是键入“make”对于构建基于 Makefile 的项目更为惯用。想象一下,如果您构建的每个项目都必须搜索某人创建的不同名称的 makefile,而不仅仅是键入“make && make install”。

于 2008-12-22T04:22:10.353 回答
0

您也可以为此使用 shell 别名。

于 2008-12-22T11:13:42.237 回答
0

我们可以换一种方式来看待这个问题:设计一种语言,如果你不给它一个固定的文件名,它的解释器会寻找一个固定的文件名,这是一个好主意吗?如果在没有脚本名称的情况下python查找怎么办?Pythonfile;)

您不需要这样的机制来制定基于已知名称的约定。示例:Autoconf 的./configure脚本。

于 2012-03-15T05:48:36.043 回答