Make中的默认规则

时间:2010-06-14 15:00:26

标签: makefile compilation go rules

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

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

3 个答案:

答案 0 :(得分:6)

这通常不合适,因为它会导致Makefile的可移植性降低;如果他们没有按照这种方式进行设置,它就无法在别人的机器上运行。

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

答案 1 :(得分:3)

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

make hello.o

并且make会自动知道如何从.o文件(或者实际上来自.c.f(如果存在)制作.p - 但您想要为自定义文件类型执行此操作(例如,从.bar构建.foo

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

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

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

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

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

答案 2 :(得分: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 - 不是零!)

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