代码之家  ›  专栏  ›  技术社区  ›  Jonathan Leffler

有没有充分的理由不利用“#”/bin/make-f'在makefile的顶部,以提供一个可执行的makefile?

  •  4
  • Jonathan Leffler  · 技术社区  · 16 年前

    主要是为了消遣,我创作了一部电影 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. 然而,在一台特定的机器上(仅),我想添加一个makefile来构建一组特殊的工具。因此,这些工具得到一个特殊的makefile,我称之为 rebuild.mk 对于这个问题(我的机器上有另一个名称)。
    4. make -f rebuild.mk “通过使用” rebuild.mk “相反。
    5. 定位 跨平台的实用程序存在问题。
    6. 这个 #!/usr/bin/env make -f 这项技术可能会奏效,不过我相信官方的交战规则是,行必须少于32个字符,并且命令只能有一个参数。
    7. @dF注释,该技术可能会阻止您传递参数进行设置。无论如何,这在我的Solaris机器上都不是问题。我测试的三个不同版本的'make'(Sun、GNU、mine)都得到了我输入的额外命令行参数,包括选项('-u'在我的自制版本上)和目标'someprogram'和宏CC='CC'WFLAGS=-v(使用不同的编译器并取消Sun编译器不理解的GCC警告标志)。

    如上所述,这主要是为了我的娱乐。我可以为这份工作保留它;我不太可能在分布式工作中使用它。如果我这样做了,我会提供并应用 fixin '脚本以修复解释器的路径名;事实上,我已经在我的机器上做到了。该脚本是骆驼书(Larry Wall的“编程Perl”)第一版的遗物。

    7 回复  |  直到 16 年前
        1
  •  5
  •   Greg Hewgill    16 年前

    对于一般可分发的Makefiles,这样做的一个问题是 make gmake .

    当然,人们总是可以手动运行适当的命令,但这种方式违背了使Makefile可执行的全部目的。

        2
  •  5
  •   Norman Ramsey    16 年前

    debian/rules

        3
  •  3
  •   dF.    16 年前

    解决 make 不总是在同一个地方(例如,在我的系统中 /usr/bin ),你可以用

    #!/usr/bin/env make -f
    

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

    make CFLAGS=...

        4
  •  2
  •   dicroce    16 年前

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

        5
  •  0
  •   grepsedawk    16 年前

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

        6
  •  0
  •   PEZ    16 年前

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

        7
  •  0
  •   Kaz    13 年前

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

    你不需要这样一个机制来建立一个基于已知名称的约定。示例:Autoconf的 ./configure