diff options
Diffstat (limited to 'src/Make.pkg')
-rw-r--r-- | src/Make.pkg | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/src/Make.pkg b/src/Make.pkg new file mode 100644 index 000000000..fc80cf6e6 --- /dev/null +++ b/src/Make.pkg @@ -0,0 +1,249 @@ +# 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) $(GCIMPORTS) -o $@ $(GOFILES) + +_gotest_.$O: $(GOFILES) $(GOTESTFILES) $(PREREQ) + $(GC) $(GCIMPORTS) -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) + $(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 |