make 中是否有一种机制允许在任何地方都可用的默认全局隐式规则,类似于内置规则?
Make 为编译 C/C++/Fortran 文件提供了一些内置的隐式规则,Makefile
对于简单的情况甚至不需要 a。但是,在编译其他语言(例如 Go 编程语言文件)时,Makefile
始终需要 a。我想扩展我的 Makeenvironment 以默认提供隐式规则。
make 中是否有一种机制允许在任何地方都可用的默认全局隐式规则,类似于内置规则?
Make 为编译 C/C++/Fortran 文件提供了一些内置的隐式规则,Makefile
对于简单的情况甚至不需要 a。但是,在编译其他语言(例如 Go 编程语言文件)时,Makefile
始终需要 a。我想扩展我的 Makeenvironment 以默认提供隐式规则。
这通常是不可取的,因为它会导致 Makefile 的可移植性降低;如果他们没有以这种方式设置它,它将无法在其他人的机器上运行。
但是,如果您想这样做,请在某处使用您的 Go 文件默认规则创建一个“全局”Makefile,然后将其路径添加到 MAKEFILES 环境变量。当您运行“make”时,此全局 Makefile 将在任何 Makefile 之前处理,就像您在文件顶部包含其源代码一样。
我假设您指的是您可以做到的事实
make hello.o
并且 make 将自动知道如何.o
从.c
文件(或者实际上从 a .f
or .p
,如果存在的话) - 但您想为自定义文件类型执行此操作(例如,.bar
从.foo
.
最便携的方法如下(在您的 Makefile 中):
.SUFFIXES: .foo .bar
.foo.bar:
foo2bar -in $> -out $@
第一行 ( .SUFFIXES
) 警告使您将这些视为特殊后缀;第二行说“这是.bar
从 a制作 a 的秘诀.foo
。第三行给出了执行此操作的命令 -$>
并$@
通过 make 更改输入和输出文件名。
注意:第三行的缩进必须是制表符。
仅适用于 GNU make 的更灵活的方法是使用它对隐式规则的支持。如果您可以保证您将使用 GNU make,那么这可能是值得推荐的。
虽然我同意 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 - 不是零!)
虽然我没有在所有可用的机器上测试它,但我相信它应该可以很好地移植。