go的多包makefile示例

go的多包makefile示例,makefile,go,Makefile,Go,我正在尝试设置一个多包围棋项目,比如 /main.go /子包1/子包1.go /分包1/分包2.go /分包2/分包1.go /子包2/子包2.go 其中main.go同时导入子包1和子包2。子包2导入子包1 我一直在寻找go makefile的例子,但我找不到任何支持这种设置的东西。有什么想法吗?(谷歌集团:golang nuts)像这样的东西应该行得通 # Makefile include $(GOROOT)/src/Make.$(GOARCH) all:main main:main.$O

我正在尝试设置一个多包围棋项目,比如

/main.go

/子包1/子包1.go

/分包1/分包2.go

/分包2/分包1.go

/子包2/子包2.go

其中main.go同时导入子包1和子包2。子包2导入子包1


我一直在寻找go makefile的例子,但我找不到任何支持这种设置的东西。有什么想法吗?

(谷歌集团:golang nuts)

像这样的东西应该行得通

# Makefile
include $(GOROOT)/src/Make.$(GOARCH)
all:main
main:main.$O
    $(LD) -Lsubpackage1/_obj -Lsubpackage2/_obj -o $@ $^
%.$O:%.go  subpackage1 subpackage2
    $(GC) -Isubpackage1/_obj -Isubpackage2/_obj -o $@ $^
subpackage1:
    $(MAKE) -C subpackage1
subpackage2:
    $(MAKE) -C subpackage2
.PHONY:subpackage1 subpackage2

# subpackage1/Makefile
TARG=subpackage1
GOFILES=sub1_1.go sub1_2.go
include $(GOROOT)/src/Make.$(GOARCH)
include $(GOROOT)/src/Make.pkg

# subpackage2/Makefile
TARG=subpackage2
GOFILES=sub2_1.go sub2_2.go
include $(GOROOT)/src/Make.$(GOARCH)
include $(GOROOT)/src/Make.pkg
GC+=-I../subpackage1/_obj
LD+=-L../subpackage1/_obj
sub2_1.$O sub2_2.$O:subpackage1
subpackage1:
    $(MAKE) -C ../subpackage1
.PHONY:subpackage1
如果不安装子包,则需要显式设置包含路径。提供的makefile Make.pkg主要用于构建软件包,这就是为什么它只包含在子包makefile中。

安装然后运行:

gd-o myapp

它将自动为
src/
目录中的所有依赖项构建一个有向无环图(DAG),然后按照正确的顺序编译和链接每个包

比手动维护Makefile容易得多,特别是因为在Go的最新版本中,$(GOROOT)/src/Make.*发生了变化(不再有Make.$(GOARCH))。同样有用的是:

gd clean
删除对象文件

gd-test
运行自动测试(请参阅测试包)

gd-dot=myapp.dot
生成包导入的图形,您可以使用GraphViz可视化该图形。

检查这是一个使用Makefiles积极维护的多包go项目


我注意到其中一些答案使用了过时的
Make.$(GOARCH)
include。因此,希望上面的链接比在这里的答案中试图停留在谷歌不断变化的API之上更稳定。

$(GOROOT)/src/Make.$(GOARCH)
是一种老方法,不再有效。上面使用的是
$(GOROOT)/src/Make.$(GOARCH)
这是一种老方法,不再有效。嗯,它不保留依赖项,并且使用递归make,这对于大型项目(尽管没有大型项目是用go-yet-AFAIK编写的)。对于依赖项,这是正确的。在我看来,递归Make似乎是使用go的Make.cmd或Make.pkg的唯一方法。到目前为止,我在自己的项目中使用递归Make很幸运,尽管它还很年轻。我手动进行依赖关系管理。递归make是在多包构建中使用make的唯一明智的方法,事实上,文档中推荐了它。然而,这是一种可怕的方式,效率低下且存在问题。Make本身是失败的,我认为go应该包括
gd
,作为制作go项目的标准方法。将它作为语言的一部分是非常必要的。我也发现,没有比使用像
gd
这样的构建工具更明智的方法来构建多个包了。自从ghc--make之后,我就没有见过这么简单的编译过程。