【问题标题】:Default rules in MakeMake 中的默认规则
【发布时间】:2010-06-14 15:00:26
【问题描述】:

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

Make 为编译 C/C++/Fortran 文件提供了一些内置的隐式规则,对于简单的情况甚至不需要 Makefile。但是,在编译其他语言(例如 Go 编程语言文件)时,始终需要 Makefile。我想扩展我的 Makeenvironment 以默认提供隐式规则。

【问题讨论】:

    标签: makefile compilation go rules


    【解决方案1】:

    这通常是不可取的,因为它会导致 Makefile 的可移植性降低;如果他们没有这样设置,它就无法在其他人的机器上运行。

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

    【讨论】:

    • 谢谢!同意你的谨慎。但是,我想编译一次性代码而不总是编写 Makefile。
    【解决方案2】:

    我假设你指的是你可以做到的事实

    make hello.o
    

    并且 make 将自动知道如何从 .c 文件(或者实际上从 .f 或 .p,如果存在)创建 .o - 但您想为自定义文件类型执行此操作(比如说,从.foo 构建一个.bar。

    最便携的方法如下(在您的 Makefile 中):

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

    第一行 (.SUFFIXES) 警告 make 你会将这些视为特殊后缀;第二行说“这是从.foo 制作.bar 的配方。第三行给出了执行此操作的命令-$> 和$@ 通过make 更改输入和输出文件名。

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

    仅适用于 GNU make 的更灵活的方法是使用它对implicit rules 的支持。如果你能保证你会使用 GNU make,那么这可能是值得推荐的。

    【讨论】:

      【解决方案3】:

      虽然我同意 dmazzoni 的观点,但我只是想为 Go 添加我的制作食谱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 是 DOLLAR + UPPERCASE-o - 不是零!)

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多