| # 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 | |
| GOFILES+=$(patsubst %.go,%.cgo1.go,$(CGOFILES)) _cgo_gotypes.go | |
| CGO_OFILES+=$(patsubst %.go,%.cgo2.o,$(CGOFILES)) _cgo_export.o | |
| OFILES+=_cgo_defun.$O _cgo_import.$O $(CGO_OFILES) | |
| 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.* | |
| CLEANFILES+=_cgo_.c _cgo_import.c _cgo_main.c _cgo_flags _cgo_run | |
| CLEANFILES+=*.so _obj _test _testmain.go *.exe | |
| 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 | |
| # | |
| ifdef CGOFILES | |
| _cgo_run: $(CGOFILES) | |
| CGOPKGPATH=$(dir) cgo -- $(CGO_CFLAGS) $(CGOFILES) | |
| touch _cgo_run | |
| # _CGO_CFLAGS and _CGO_LDFLAGS are defined via the evaluation of _cgo_flags. | |
| # The include happens before the commands in the recipe run, | |
| # so it cannot be done in the same recipe that runs cgo. | |
| _cgo_flags: _cgo_run | |
| $(eval include _cgo_flags) | |
| # Include any previous flags in case cgo files are up to date. | |
| -include _cgo_flags | |
| # Ugly but necessary - cgo writes these files too. | |
| _cgo_gotypes.go _cgo_export.c _cgo_export.h _cgo_main.c _cgo_defun.c: _cgo_flags | |
| @true | |
| %.cgo1.go %.cgo2.c: _cgo_defun.c | |
| @true | |
| endif | |
| # Compile rules for gcc source files. | |
| %.o: %.c | |
| $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c | |
| # To find out which symbols are needed from external libraries | |
| # and which libraries are needed, we build a simple a.out that | |
| # links all the objects we just created and then use cgo -dynimport | |
| # to inspect it. That is, we make gcc tell us which dynamic symbols | |
| # and libraries are involved, instead of duplicating gcc's logic ourselves. | |
| # After main we have to define all the symbols that will be provided | |
| # by Go code. That's crosscall2 and any exported symbols. | |
| _cgo_main.o: _cgo_main.c | |
| $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) _cgo_main.c | |
| _cgo1_.o: _cgo_main.o $(CGO_OFILES) | |
| $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ $^ $(CGO_LDFLAGS) $(_CGO_LDFLAGS) | |
| _cgo_import.c: _cgo1_.o | |
| cgo -dynimport _cgo1_.o >_$@ && mv -f _$@ $@ | |
| # 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). | |
| # 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 | |
| _CGO_LDFLAGS_windows=-shared -lm -mthreads | |
| # Have to compile the runtime header. | |
| RUNTIME_CFLAGS=-I$(pkgdir) | |
| # 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 | |
| # 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) | |