Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # make <target>
- #
- # Targets:
- # + all (the default)
- # - This will build all of the dependencies for and link gobir
- # + clean
- # - This will delete the binary and the object directory
- # + format
- # - This will format all of your source code with gofmt
- ### Directories and files
- # Search/output directories
- ROOT = $(subst " ",\ ,$(GOROOT))
- GOBIN = $(subst " ",\ ,$(HOME))/bin
- OBJDIR = _obj/
- LIBDIR = _lib/
- # CGO output files and extensions
- CGC = _cgo_defun.c
- CGG = _cgo_gotypes.go
- CG1 = cgo1.go
- CG2 = cgo2.c
- ### Load architecture variables
- include $(ROOT)/src/Make.$(GOARCH)
- include $(ROOT)/src/Make.$(GOOS)
- ### Compiling and Linking
- # Go commands
- COMP = $(GOBIN)/$(GC) -I$(OBJDIR)
- LINK = $(GOBIN)/$(LD) -L$(OBJDIR)
- PACK = $(GOBIN)/gopack grc
- GFMT = $(GOBIN)/gofmt -w
- # C commands
- CGO = $(GOBIN)/cgo
- C_COMP = gcc $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -c
- C_LDSO = gcc $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS))
- C_GOCC = $(GOBIN)/$(CC) $(CFLAGS) $(RUNTIME_CFLAGS_$(GOARCH))
- ### Packages and Dependencies
- # Package: config
- CONFIG_OBJECT = config
- CONFIG_SOURCE = config.go
- # Package: main
- MAIN_OBJECT = gobir
- MAIN_SOURCE = gobir.go
- # Package: ibot
- IBOT_OBJECT = ibot
- 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
- # Package: clibrary
- CLIBRARY_OBJECT = clibrary
- CLIBRARY_SOURCE = c_library.go
- CLIBRARY_CFILES = test_library.c
- # Package: irc
- IRC_OBJECT = irc
- IRC_SOURCE = irc.go irc_constants.go irc_parser.go
- # Normal Go packages in dependencies-first order
- PACKAGES = CONFIG IRC IBOT CLIBRARY MAIN
- # Packages that require cgo processing
- CGOPKGS = CLIBRARY
- ### Aggregates
- OBJECTS = $(patsubst %,$(OBJDIR)%.$O,$(foreach PKG,$(PACKAGES),$($(PKG)_OBJECT)))
- DLOBJS = $(patsubst %,$(LIBDIR)%.so,$(foreach PKG,$(CGOPKGS),$($(PKG)_OBJECT)))
- ### Default rule
- all : $(OBJDIR) $(LIBDIR) $(OBJECTS) $(MAIN_OBJECT) $(DLOBJS)
- ### Main binary
- ifdef MAIN_OBJECT
- $(MAIN_OBJECT) : $(OBJECTS)
- $(LINK) -o $@ $(OBJDIR)$@.$O
- endif
- ### Objects
- define package_template
- $$(OBJDIR)$$($(1)_OBJECT).$$O: $$($(1)_SOURCE)
- $$(COMP) -o $$@ $$^
- $$(PACK) $$(@:.$$O=.a) $$@
- endef
- $(foreach PKG,$(filter-out $(CGOPKGS),$(PACKAGES)),$(eval $(call package_template,$(PKG))))
- ### CGo Objects
- define cgopkg_template
- $$($(1)_SOURCE:.go=.$$(CG1)) $$($(1)_SOURCE:.go=.$$(CG2)) $$(CGC) $$(CGG) : $$($(1)_SOURCE)
- CGOPKGPATH=$$(PWD)/_lib $$(CGO) $$^
- $$(OBJDIR)$$($(1)_OBJECT).$$O : $$($(1)_SOURCE:.go=.$$(CG1)) $$(CGG) $$(CGC:.c=.6)
- $$(COMP) -o $$@ $$(filter-out %.6,$$^)
- $$(PACK) $$(@:.$$O=.a) $$@ $$(filter %.6,$$^)
- $$(LIBDIR)$$($(1)_OBJECT).so : $$($(1)_SOURCE:.go=.$$(CG2:.c=.o)) $$($(1)_CFILES:.c=.o)
- $$(C_LDSO) -o $$@ $$^
- endef
- $(foreach PKG,$(CGOPKGS),$(eval $(call cgopkg_template,$(PKG))))
- ### Utility
- clean :
- rm -rf $(OBJDIR) $(LIBDIR) *.$(CG1) *.$(CG2) $(CGC) $(CGG) *.o *.$O $O.out $(MAIN_OBJECT)
- format :
- $(GFMT) $(foreach PKG,$(PACKAGES),$($(PKG)_SOURCE))
- $(OBJDIR) $(LIBDIR) :
- mkdir -p $@
- ### CGO implicit rules
- # Don't delete intermediate .6 files
- .PRECIOUS : %.6
- %.6 : %.c
- $(C_GOCC) -I$(GOROOT)/src/pkg/runtime $^
- %.o : %.c
- $(C_COMP) $^
Advertisement
Add Comment
Please, Sign In to add comment