make中是否有一种机制允许在任何地方都可以使用的默认全局隐式规则,类似于内置规则?
Make为编译C / C ++ / Fortran文件提供了一些内置的隐式规则,甚至不需要Makefile
来处理简单的情况。但是,在编译其他语言(例如Go编程语言文件)时,始终需要Makefile
。我想扩展我的Makeenvironment,默认情况下可以使用隐式规则。
答案 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 - 不是零!)
虽然我没有在我可用的所有机器上测试它,但我相信它应该能很好地移植。