4

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

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

4

3 回答 3

6

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

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

于 2010-06-14T15:04:02.523 回答
4

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

make hello.o

并且 make 将自动知道如何.o.c文件(或者实际上从 a .for .p,如果存在的话) - 但您想为自定义文件类型执行此操作(例如,.bar.foo.

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

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

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

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

仅适用于 GNU make 的更灵活的方法是使用它对隐式规则的支持。如果您可以保证您将使用 GNU make,那么这可能是值得推荐的。

于 2010-06-14T15:22:51.077 回答
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 - 不是零!)

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

于 2010-09-06T07:59:40.600 回答