# Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. all: package package: _obj/$(TARG).a testpackage: _test/$(TARG).a include $(QUOTED_GOROOT)/src/Make.common # The quietgcc wrapper is for our own source code # while building the libraries, not arbitrary source code # as encountered by cgo. ifeq ($(HOST_CC),quietgcc) HOST_CC:=gcc endif ifeq ($(HOST_LD),quietgcc) HOST_LD:=gcc endif # GNU Make 3.80 has a bug in lastword # elem=$(lastword $(subst /, ,$(TARG))) TARG_words=$(subst /, ,$(TARG)) elem=$(word $(words $(TARG_words)),$(TARG_words)) ifeq ($(elem),$(TARG)) dir= else dir=$(patsubst %/$(elem),%,$(TARG)) endif pkgdir=$(QUOTED_GOROOT)/pkg/$(GOOS)_$(GOARCH) INSTALLFILES+=$(pkgdir)/$(TARG).a # The rest of the cgo rules are below, but these variable updates # must be done here so they apply to the main rules. ifdef CGOFILES CGOTARG=cgo_$(subst /,_,$(TARG)) GOFILES+=$(patsubst %.go,%.cgo1.go,$(CGOFILES)) GOFILES+=_cgo_gotypes.go OFILES+=_cgo_defun.$O GCC_OFILES=$(patsubst %.go,%.cgo2.o,$(CGOFILES)) INSTALLFILES+=$(pkgdir)/$(CGOTARG).so endif PREREQ+=$(patsubst %,%.make,$(DEPS)) coverage: gotest 6cov -g $(shell pwd) $O.out | grep -v '_test\.go:' CLEANFILES+=*.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* *.so _obj _test _testmain.go test: gotest bench: gotest -benchmarks=. -match="Do not run tests" nuke: clean rm -f $(pkgdir)/$(TARG).a testpackage-clean: rm -f _test/$(TARG).a _gotest_.$O install: $(INSTALLFILES) $(pkgdir)/$(TARG).a: _obj/$(TARG).a @test -d $(QUOTED_GOROOT)/pkg && mkdir -p $(pkgdir)/$(dir) cp _obj/$(TARG).a "$@" _go_.$O: $(GOFILES) $(PREREQ) $(GC) -o $@ $(GOFILES) _gotest_.$O: $(GOFILES) $(GOTESTFILES) $(PREREQ) $(GC) -o $@ $(GOFILES) $(GOTESTFILES) _obj/$(TARG).a: _go_.$O $(OFILES) @mkdir -p _obj/$(dir) rm -f _obj/$(TARG).a gopack grc $@ _go_.$O $(OFILES) _test/$(TARG).a: _gotest_.$O $(OFILES) @mkdir -p _test/$(dir) rm -f _test/$(TARG).a gopack grc $@ _gotest_.$O $(OFILES) importpath: @echo $(TARG) dir: @echo $(dir) # To use cgo in a Go package, add a line # # CGOFILES=x.go y.go # # to the main Makefile. This signals that cgo should process x.go # and y.go when building the package. # There are three optional variables to set, CGO_CFLAGS, CGO_LDFLAGS, # and CGO_DEPS, which specify compiler flags, linker flags, and linker # dependencies to use when compiling (using gcc) the C support for # x.go and y.go. # Cgo translates each x.go file listed in $(CGOFILES) into a basic # translation of x.go, called x.cgo1.go. Additionally, three other # files are created: # # _cgo_gotypes.go - declarations needed for all .go files in the package; imports "unsafe" # _cgo_defun.c - C trampoline code to be compiled with 6c and linked into the package # x.cgo2.c - C implementations compiled with gcc to create a dynamic library # _cgo_defun.c: $(CGOFILES) CGOPKGPATH=$(dir) cgo -- $(CGO_CFLAGS) $(CGOFILES) # Ugly but necessary _cgo_gotypes.go _cgo_export.c _cgo_export.h %.cgo1.go %.cgo2.c: _cgo_defun.c @true %.cgo2.o: %.cgo2.c $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $*.cgo2.c _cgo_export.o: _cgo_export.c _cgo_export.h $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -o $@ -c $(CGO_CFLAGS) _cgo_export.c # The rules above added x.cgo1.go and _cgo_gotypes.go to $(GOFILES), # added _cgo_defun.$O to $OFILES, and added the installed copy of # package_x.so (built from x.cgo2.c) to $(INSTALLFILES). RUNTIME_CFLAGS_amd64=-D_64BIT RUNTIME_CFLAGS=-I"$(GOROOT)/src/pkg/runtime" $(RUNTIME_CFLAGS_$(GOARCH)) # Have to run gcc with the right size argument on hybrid 32/64 machines. _CGO_CFLAGS_386=-m32 _CGO_CFLAGS_amd64=-m64 _CGO_LDFLAGS_freebsd=-shared -lpthread -lm _CGO_LDFLAGS_linux=-shared -lpthread -lm _CGO_LDFLAGS_darwin=-dynamiclib -Wl,-undefined,dynamic_lookup # Compile x.cgo4.c with gcc to make package_x.so. # Compile _cgo_defun.c with 6c; needs access to the runtime headers. _cgo_defun.$O: _cgo_defun.c $(CC) $(CFLAGS) $(RUNTIME_CFLAGS) _cgo_defun.c $(CGOTARG).so: $(GCC_OFILES) $(CGO_DEPS) $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -o $@ $(GCC_OFILES) $(CGO_LDFLAGS) $(_CGO_LDFLAGS_$(GOOS)) $(pkgdir)/$(CGOTARG).so: $(CGOTARG).so @test -d $(QUOTED_GOROOT)/pkg && mkdir -p $(pkgdir) cp $(CGOTARG).so "$@" ifneq ($(CGOFILES),) testpackage: $(CGOTARG).so endif # Generic build rules. # These come last so that the rules above can override them # for more specific file names. %.$O: %.c $(CC) $(CFLAGS) $*.c %.$O: %.s $(AS) $*.s %.$O: $(HFILES)