# 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* *.cgo[12].* 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
	@test -d $(QUOTED_GOROOT)/pkg && 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
	@test -d $(QUOTED_GOROOT)/pkg && 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
