Guest User

Makefile example with CGO

a guest
Jun 3rd, 2010
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Make 3.20 KB | None | 0 0
  1. # make <target>
  2. #
  3. # Targets:
  4. # + all (the default)
  5. #   - This will build all of the dependencies for and link gobir
  6. # + clean
  7. #   - This will delete the binary and the object directory
  8. # + format
  9. #   - This will format all of your source code with gofmt
  10.  
  11. ### Directories and files
  12. # Search/output directories
  13. ROOT   = $(subst " ",\ ,$(GOROOT))
  14. GOBIN  = $(subst " ",\ ,$(HOME))/bin
  15. OBJDIR = _obj/
  16. LIBDIR = _lib/
  17.  
  18. # CGO output files and extensions
  19. CGC = _cgo_defun.c
  20. CGG = _cgo_gotypes.go
  21. CG1 = cgo1.go
  22. CG2 = cgo2.c
  23.  
  24. ### Load architecture variables
  25. include $(ROOT)/src/Make.$(GOARCH)
  26. include $(ROOT)/src/Make.$(GOOS)
  27.  
  28. ### Compiling and Linking
  29. # Go commands
  30. COMP = $(GOBIN)/$(GC) -I$(OBJDIR)
  31. LINK = $(GOBIN)/$(LD) -L$(OBJDIR)
  32. PACK = $(GOBIN)/gopack grc
  33. GFMT = $(GOBIN)/gofmt -w
  34.  
  35. # C commands
  36. CGO    = $(GOBIN)/cgo
  37. C_COMP = gcc $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -c
  38. C_LDSO = gcc $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS))
  39. C_GOCC = $(GOBIN)/$(CC) $(CFLAGS) $(RUNTIME_CFLAGS_$(GOARCH))
  40.  
  41. ### Packages and Dependencies
  42. # Package: config
  43. CONFIG_OBJECT = config
  44. CONFIG_SOURCE = config.go
  45.  
  46. # Package: main
  47. MAIN_OBJECT = gobir
  48. MAIN_SOURCE = gobir.go
  49.  
  50. # Package: ibot
  51. IBOT_OBJECT = ibot
  52. IBOT_SOURCE = ibot.go ibot_util.go ibot_botuser.go ctcp.go golang.go nickserv.go ibot_botchannel.go admin.go ibot_botcore.go ibot_registration.go seen.go
  53.  
  54. # Package: clibrary
  55. CLIBRARY_OBJECT = clibrary
  56. CLIBRARY_SOURCE = c_library.go
  57. CLIBRARY_CFILES = test_library.c
  58.  
  59. # Package: irc
  60. IRC_OBJECT = irc
  61. IRC_SOURCE = irc.go irc_constants.go irc_parser.go
  62.  
  63. # Normal Go packages in dependencies-first order
  64. PACKAGES = CONFIG IRC IBOT CLIBRARY MAIN
  65.  
  66. # Packages that require cgo processing
  67. CGOPKGS = CLIBRARY
  68.  
  69. ### Aggregates
  70. OBJECTS = $(patsubst %,$(OBJDIR)%.$O,$(foreach PKG,$(PACKAGES),$($(PKG)_OBJECT)))
  71. DLOBJS = $(patsubst %,$(LIBDIR)%.so,$(foreach PKG,$(CGOPKGS),$($(PKG)_OBJECT)))
  72.  
  73. ### Default rule
  74. all : $(OBJDIR) $(LIBDIR) $(OBJECTS) $(MAIN_OBJECT) $(DLOBJS)
  75.  
  76. ### Main binary
  77. ifdef MAIN_OBJECT
  78. $(MAIN_OBJECT) : $(OBJECTS)
  79.     $(LINK) -o $@ $(OBJDIR)$@.$O
  80. endif
  81.  
  82. ### Objects
  83. define package_template
  84. $$(OBJDIR)$$($(1)_OBJECT).$$O: $$($(1)_SOURCE)
  85.     $$(COMP) -o $$@ $$^
  86.     $$(PACK) $$(@:.$$O=.a) $$@
  87. endef
  88. $(foreach PKG,$(filter-out $(CGOPKGS),$(PACKAGES)),$(eval $(call package_template,$(PKG))))
  89.  
  90. ### CGo Objects
  91. define cgopkg_template
  92. $$($(1)_SOURCE:.go=.$$(CG1)) $$($(1)_SOURCE:.go=.$$(CG2)) $$(CGC) $$(CGG) : $$($(1)_SOURCE)
  93.     CGOPKGPATH=$$(PWD)/_lib $$(CGO) $$^
  94.  
  95. $$(OBJDIR)$$($(1)_OBJECT).$$O : $$($(1)_SOURCE:.go=.$$(CG1)) $$(CGG) $$(CGC:.c=.6)
  96.     $$(COMP) -o $$@ $$(filter-out %.6,$$^)
  97.     $$(PACK) $$(@:.$$O=.a) $$@ $$(filter %.6,$$^)
  98.  
  99. $$(LIBDIR)$$($(1)_OBJECT).so : $$($(1)_SOURCE:.go=.$$(CG2:.c=.o)) $$($(1)_CFILES:.c=.o)
  100.     $$(C_LDSO) -o $$@ $$^
  101.  
  102. endef
  103. $(foreach PKG,$(CGOPKGS),$(eval $(call cgopkg_template,$(PKG))))
  104.  
  105. ### Utility
  106. clean :
  107.     rm -rf $(OBJDIR) $(LIBDIR) *.$(CG1) *.$(CG2) $(CGC) $(CGG) *.o *.$O $O.out $(MAIN_OBJECT)
  108.  
  109. format :
  110.     $(GFMT) $(foreach PKG,$(PACKAGES),$($(PKG)_SOURCE))
  111.  
  112. $(OBJDIR) $(LIBDIR) :
  113.     mkdir -p $@
  114.  
  115. ### CGO implicit rules
  116. # Don't delete intermediate .6 files
  117. .PRECIOUS : %.6
  118.  
  119. %.6 : %.c
  120.     $(C_GOCC) -I$(GOROOT)/src/pkg/runtime $^
  121.  
  122. %.o : %.c
  123.     $(C_COMP) $^
Advertisement
Add Comment
Please, Sign In to add comment