# 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 elem=`{echo $TARG | sed 's@.*/@@'} dir=`{echo $TARG | sed 's@/[^/]**@@'} pkgdir=$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. GOFILES=`{echo $GOFILES; for(f in $CGOFILES) echo $f | sed 's/(.*)\.go/\1.cgo1.go \1.cgo2.go/'} OFILES=`{echo $OFILES; for(f in $CGOFILES) echo $f | sed 's/(.*)\.go/\1.cgo1.go \1.cgo3.$O/'} INSTALLFILES=`{echo $INSTALLFILES; for(f in $CGOFILES) echo $f | sed 's/(.*)\.go/$pkgdir/$dir/$elem_\1.so/'} PREREQ=`{echo $PREREQ; for(f in $DEPS) echo $f.make} coverage: gotest 6cov -g `{pwd} | grep -v '_test\.go:' clean: rm -rf *.[o$O] *.a [$OS].out *.cgo[12].go *.cgo[34].c *.so _obj _test _testmain.go $CLEANFILES test: gotest nuke: clean rm -f $pkgdir/$TARG.a testpackage-clean: rm -f _test/$TARG.a _gotest_.$O install: $INSTALLFILES $pkgdir/$TARG.a: package @test -d $GOROOT/pkg && mkdir -p $pkgdir/$dir cp _obj/$TARG.a $target _go_.$O: $GOFILES $PREREQ $GC -o $target $GOFILES _gotest_.$O: $GOFILES $GOTESTFILES $PREREQ $GC -o $target $GOFILES $GOTESTFILES _obj/$TARG.a: _go_.$O $OFILES @mkdir -p _obj/$dir rm -f _obj/$TARG.a gopack grc $target _go_.$O $OFILES _test/$TARG.a: _gotest_.$O $OFILES @mkdir -p _test/$dir rm -f _test/$TARG.a gopack grc $target _gotest_.$O $OFILES importpath: @echo $TARG dir: @echo $dir &.make: (cd $stem && make) # To use cgo in a Go package, add a line # # CGOFILES=x.go # # to the main Makefile. This signals that cgo should process x.go. # There are two optional variables to set, CGO_CFLAGS and CGO_LDFLAGS, # which specify compiler and linker flags to use when compiling # (using gcc) the C support for x.go. # Cgo translates each x.go file listed in $CGOFILES into # # x.cgo1.go - basic translation of x.go # x.cgo2.go - declarations needed for x.cgo1.go; imports "unsafe" # x.cgo3.c - C trampoline code to be compiled with 6c and linked into the package # x.cgo4.c - C implementations compiled with gcc to create dynamic library # &.cgo1.go &.cgo2.go &.cgo3.c &.cgo4.c: &.go cgo $CGO_CFLAGS $stem.go # The rules above added x.cgo1.go and x.cgo2.go to $GOFILES, # added x.cgo3.$O to $OFILES, and added the installed copy of # package_x.so (built from x.cgo4.c) to $INSTALLFILES. # Compile x.cgo3.c with 6c; needs access to the runtime headers. RUNTIME_CFLAGS_amd64=-D_64BIT RUNTIME_CFLAGS=-I$GOROOT/src/pkg/runtime $RUNTIME_CFLAGS'_'$GOARCH &.cgo3.$O: &.cgo3.c $CC $CFLAGS $RUNTIME_CFLAGS $stem.cgo3.c # Have to run gcc with the right size argument on hybrid 32/64 machines. _CGO_CFLAGS_386=-m32 _CGO_CFLAGS_amd64=-m64 _CGO_LDFLAGS_linux=-shared -lpthread -lm _CGO_LDFLAGS_darwin=-dynamiclib -Wl,-undefined,dynamic_lookup # Compile x.cgo4.c with gcc to make package_x.so. &.cgo4.o: &.cgo4.c gcc $_CGO_CFLAGS'_'$GOARCH -fPIC -O2 -o $target -c $CGO_CFLAGS $stem.cgo4.c $elem_&.so: &.cgo4.o gcc $_CGO_CFLAGS'_'$GOARCH $_CGO_LDFLAGS'_'$GOOS -o $target $stem.cgo4.o $CGO_LDFLAGS $pkgdir/$dir/$elem_&.so: $elem_&.so @test -d $GOROOT/pkg && mkdir -p $pkgdir/$dir cp $elem_$stem.so $target # Generic build rules. # These come last so that the rules above can override them # for more specific file names. &.$O: &.c $CC $CFLAGS $stem.c &.$O: &.s $AS $stem.s &.$O: $HFILES