代码之家  ›  专栏  ›  技术社区  ›  notnoop

make中的默认规则

  •  4
  • notnoop  · 技术社区  · 14 年前

    make中是否有一种机制允许默认的全局隐式规则在任何地方都可用,类似于内置规则?

    为编译C/C++/FORTRAN文件提供了一些内置的隐式规则,甚至不需要 Makefile 对于简单情况。但是,在编译其他语言(例如go编程语言文件)时, 生成文件 始终是必需的。我希望扩展makeenvironment,使默认情况下隐式规则可用。

    3 回复  |  直到 14 年前
        1
  •  6
  •   dmazzoni    14 年前

    这通常是不可取的,因为它会使您的makefile不那么便携;如果别人的机器没有这样设置,它就不能在上面工作。

    但是,如果要这样做,请使用go文件的默认规则在某处创建一个“全局”makefile,然后将其路径添加到makefiles环境变量。当您运行“make”时,这个全局make file将在任何make file之前被处理,就像您在文件的顶部包含了它的源一样。

        2
  •  3
  •   psmears Touffy    14 年前

    我假设你指的是你能做到的事实

    make hello.o
    

    make会自动知道如何 .o 从A .c 文件(或确实来自 .f .p ,如果存在),但您要为自定义文件类型(例如,构建 .bar 从A .foo .

    最可移植的方法如下(在makefile中):

    .SUFFIXES: .foo .bar
    .foo.bar:
            foo2bar -in $> -out $@
    

    第一行( .SUFFIXES )警告make,您将把这些作为特殊后缀处理;第二行说“这是一个制作 酒吧 从A . 第三行给出了执行此操作的命令- $> $@ 通过对输入和输出文件名进行make更改。

    注意:第三行的缩进必须是制表符。

    一个更灵活的方法是使用它的支持 implicit rules . 如果您可以保证您将使用GNU make,那么这可能是推荐的。

        3
  •  3
  •   Morten Siebuhr    14 年前

    虽然我同意德马佐尼的观点,但我只是想加上我的制作方法 Makefile :

    # Include default Golang Make magic
    include $(GOROOT)/src/Make.$(GOARCH)
    
    # Hack the following line    
    your_program: your_program.$O
        $(LD) -o $@ $^
    
    # Compiles .go-files into architecture-specific binaries
    %.$O: %.go
        $(GC) -o $@ $^
    
    clean:
        rm your_program *.$O
    

    (注: $O 是美元+大写-O-不是零!)

    虽然我还没有在所有可用的机器上测试它,但我相信它应该可以很好地移植。