summaryrefslogtreecommitdiff
path: root/src/Make.pkg
diff options
context:
space:
mode:
Diffstat (limited to 'src/Make.pkg')
-rw-r--r--src/Make.pkg249
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