| # 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) | 
 |  | 
 | ifeq ($(TARGDIR),) | 
 | TARGDIR:=$(pkgdir) | 
 | endif | 
 |  | 
 | INSTALLFILES+=$(TARGDIR)/$(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,_obj/%.cgo1.go,$(CGOFILES)) _obj/_cgo_gotypes.go | 
 | CGO_OFILES+=$(patsubst %.go,%.cgo2.o,$(CGOFILES)) _cgo_export.o | 
 | OFILES+=_cgo_defun.$O _cgo_import.$O $(CGO_OFILES) | 
 | endif | 
 |  | 
 | ifdef SWIGFILES | 
 | GOFILES+=$(patsubst %.swig,_obj/%.go,$(patsubst %.swigcxx,%.swig,$(SWIGFILES))) | 
 | OFILES+=$(patsubst %.swig,_obj/%_gc.$O,$(patsubst %.swigcxx,%.swig,$(SWIGFILES))) | 
 | SWIG_PREFIX=$(subst /,-,$(TARG)) | 
 | SWIG_SOS+=$(patsubst %.swig,_obj/$(SWIG_PREFIX)-%.so,$(patsubst %.swigcxx,%.swig,$(SWIGFILES))) | 
 | INSTALLFILES+=$(patsubst %.swig,$(TARGDIR)/swig/$(SWIG_PREFIX)-%.so,$(patsubst %.swigcxx,%.swig,$(SWIGFILES))) | 
 | endif | 
 |  | 
 | PREREQ+=$(patsubst %,%.make,$(DEPS)) | 
 |  | 
 | coverage: | 
 | 	gotest | 
 | 	6cov -g $(shell pwd) $O.out | grep -v '_test\.go:' | 
 |  | 
 | CLEANFILES+=*.so _obj _test _testmain.go *.exe _cgo* test.out build.out | 
 |  | 
 | test: | 
 | 	gotest | 
 |  | 
 | testshort: | 
 | 	gotest -test.short -test.timeout=120 | 
 |  | 
 | bench: | 
 | 	gotest -test.bench=. -test.run="Do not run tests" | 
 |  | 
 | nuke: clean | 
 | 	rm -f $(TARGDIR)/$(TARG).a | 
 |  | 
 | testpackage-clean: | 
 | 	rm -f _test/$(TARG).a | 
 |  | 
 | install: $(INSTALLFILES) | 
 |  | 
 | $(TARGDIR)/$(TARG).a: _obj/$(TARG).a | 
 | 	@mkdir -p $(TARGDIR)/$(dir) | 
 | 	cp _obj/$(TARG).a "$@" | 
 |  | 
 | _go_.$O: $(GOFILES) $(PREREQ) | 
 | 	$(GC) $(GCFLAGS) $(GCIMPORTS) -p $(TARG) -o $@ $(GOFILES) | 
 |  | 
 | _gotest_.$O: $(GOFILES) $(GOTESTFILES) $(PREREQ) | 
 | 	$(GC) $(GCFLAGS) $(GCIMPORTS) -p $(TARG) -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 _obj/x.cgo1.go. Additionally, three other | 
 | # files are created: | 
 | # | 
 | #	_obj/_cgo_gotypes.go	- declarations needed for all .go files in the package; imports "unsafe" | 
 | #	_obj/_cgo_defun.c	- C trampoline code to be compiled with 6c and linked into the package | 
 | #	_obj/x.cgo2.c	- C implementations compiled with gcc to create a dynamic library | 
 | # | 
 |  | 
 | ifdef CGOFILES | 
 | _obj/_cgo_run: $(CGOFILES) | 
 | 	@mkdir -p _obj | 
 | 	CGOPKGPATH=$(dir) cgo -- $(CGO_CFLAGS) $(CGOFILES) | 
 | 	touch _obj/_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. | 
 | _obj/_load_cgo_flags: _obj/_cgo_run | 
 | 	$(eval include _obj/_cgo_flags) | 
 |  | 
 | # Include any previous flags in case cgo files are up to date. | 
 | -include _obj/_cgo_flags | 
 |  | 
 | # Ugly but necessary - cgo writes these files too. | 
 | _obj/_cgo_gotypes.go _obj/_cgo_export.c _obj/_cgo_export.h _obj/_cgo_main.c _obj/_cgo_defun.c: _obj/_load_cgo_flags | 
 | 	@true | 
 |  | 
 | _obj/%.cgo1.go _obj/%.cgo2.c: _obj/_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 | 
 |  | 
 | %.o: _obj/%.c | 
 | 	$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $^ | 
 |  | 
 | # 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. | 
 |  | 
 | _cgo1_.o: _cgo_main.o $(CGO_OFILES) $(CGO_DEPS) | 
 | 	$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ $^ $(CGO_LDFLAGS) $(_CGO_LDFLAGS) | 
 |  | 
 | _obj/_cgo_import.c: _cgo1_.o | 
 | 	@mkdir -p _obj | 
 | 	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: _obj/_cgo_defun.c | 
 | 	$(CC) $(CFLAGS) $(RUNTIME_CFLAGS) -I . -o "$@" _obj/_cgo_defun.c | 
 |  | 
 | # To use swig in a Go package, add a line | 
 | # | 
 | #	SWIGFILES=x.swig | 
 | # | 
 | # to the main Makefile.  This signals that SWIG should process the | 
 | #.swig file when building the package. | 
 | # | 
 | # To wrap C code, use an extension of .swig.  To wrap C++ code, use an | 
 | # extension of .swigcxx. | 
 | # | 
 | #	SWIGFILES=myclib.swig mycxxlib.swigcxx | 
 |  | 
 | ifdef SWIGFILES | 
 | _obj/%._swig_run _obj/%.go _obj/%_gc.c _obj/%_wrap.c: %.swig | 
 | 	@mkdir -p _obj | 
 | 	swig -go -module $* -soname $(SWIG_PREFIX)-$*.so -o _obj/$*_wrap.c -outdir _obj $< | 
 |  | 
 | _obj/%._swig_run _obj/%.go _obj/%_gc.c _obj/%_wrap.cxx: %.swigcxx | 
 | 	@mkdir -p _obj | 
 | 	swig -go -c++ -module $* -soname $(SWIG_PREFIX)-$*.so -o _obj/$*_wrap.cxx -outdir _obj $< | 
 |  | 
 | _obj/%_gc.$O: _obj/%_gc.c | 
 | 	$(CC) $(CFLAGS) -I . -I$(pkgdir) -o "$@" _obj/$*_gc.c | 
 |  | 
 | _obj/%_wrap.o: _obj/%_wrap.c | 
 | 	$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c $^ $(SWIG_CFLAGS) | 
 |  | 
 | HOST_CXX=g++ | 
 |  | 
 | _obj/%_wrapcxx.o: _obj/%_wrap.cxx | 
 | 	$(HOST_CXX) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c $^ $(SWIG_CXXFLAGS) | 
 |  | 
 | _obj/$(SWIG_PREFIX)-%.so: _obj/%_wrap.o | 
 | 	$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -o $@ $^ $(SWIG_LDFLAGS) $(_CGO_LDFLAGS_$(GOOS)) $(_SWIG_LDFLAGS_$(GOOS)) | 
 |  | 
 | _obj/$(SWIG_PREFIX)-%.so: _obj/%_wrapcxx.o | 
 | 	$(HOST_CXX) $(_CGO_CFLAGS_$(GOARCH)) -o $@ $^ $(SWIG_LDFLAGS) $(_CGO_LDFLAGS_$(GOOS)) $(_SWIG_LDFLAGS_$(GOOS)) | 
 |  | 
 | $(TARGDIR)/swig/$(SWIG_PREFIX)-%.so: _obj/$(SWIG_PREFIX)-%.so | 
 | 	@mkdir -p $(TARGDIR)/swig | 
 | 	cp $< "$@" | 
 |  | 
 | all: $(SWIG_SOS) | 
 |  | 
 | SWIG_RPATH=-r $(TARGDIR)/swig | 
 |  | 
 | endif | 
 |  | 
 | # Generic build rules. | 
 | # These come last so that the rules above can override them | 
 | # for more specific file names. | 
 | %.$O: %.c $(HFILES) | 
 | 	$(CC) $(CFLAGS) -o "$@" $*.c | 
 |  | 
 | %.$O: _obj/%.c $(HFILES) | 
 | 	$(CC) $(CFLAGS) -I . -o "$@" _obj/$*.c | 
 |  | 
 | %.$O: %.s | 
 | 	$(AS) $*.s |