Last active
March 8, 2018 16:31
-
-
Save jayconrod/462442345eb70c0f806e8dde11086dcc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "C" | |
//export GoAdd | |
func GoAdd(a, b int) int { | |
return a + b | |
} | |
func main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// +build ignore | |
#include <stdio.h> | |
#include "add.h" | |
int main() { | |
int x = GoAdd(12, 34); | |
printf("%d\n", x); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -euxo pipefail | |
cmddir=$(pwd) | |
rm -rf "$cmddir/_obj" | |
mkdir -p "$cmddir/_obj" | |
tmpdir="$cmddir/_obj" | |
CFLAGS="-pthread -g -O2 -fPIC" | |
export CGO_CFLAGS=$CFLAGS | |
export CGO_LDFLAGS=-fPIC | |
# build stdlib | |
objdir=$tmpdir/stdlib | |
mkdir -p $objdir/pkg | |
cp -r $GOROOT/src $objdir/src | |
cp -r $GOROOT/pkg/tool $objdir/pkg/tool | |
cp -r $GOROOT/pkg/include $objdir/pkg/include | |
export GOROOT=$objdir | |
go install -installsuffix=shared -gcflags=-shared -ldflags=-shared std | |
go install -installsuffix=shared -gcflags='-shared -+' -ldflags=-shared runtime/cgo | |
# compile example.com/repo | |
srcdir=$cmddir | |
objdir=$tmpdir/repo | |
mkdir -p $objdir | |
go tool cgo -objdir $objdir -importpath example.com/repo -exportheader $objdir/_cgo_install.h $srcdir/add.go | |
gcc -c -o $objdir/_cgo_export.o $CFLAGS $objdir/_cgo_export.c | |
gcc -c -o $objdir/add.cgo2.o $CFLAGS $objdir/add.cgo2.c | |
gcc -c -o $objdir/_cgo_main.o $CFLAGS $objdir/_cgo_main.c | |
gcc -o $objdir/_cgo_.o -pthread $objdir/{_cgo_export,add.cgo2,_cgo_main}.o | |
go tool cgo -dynpackage main -dynimport $objdir/_cgo_.o -dynout $objdir/_cgo_import.go | |
go tool compile -o $objdir/_pkg_.a -shared -p main -installsuffix shared -pack $objdir/*.go | |
go tool pack r $objdir/_pkg_.a $objdir/{_cgo_export,add.cgo2}.o | |
# link | |
mkdir $objdir/tmp | |
go tool link -o $objdir/repo.so -tmpdir=$objdir/tmp -installsuffix=shared -buildmode=c-shared -linkmode=external -linkshared -extld=gcc $objdir/_pkg_.a | |
# compile add_test | |
srcdir=$cmddir | |
objdir=$tmpdir/add_test | |
mkdir -p $objdir | |
gcc -c -o $objdir/add_test.o $CFLAGS -iquote $tmpdir/repo $srcdir/add_test.c | |
# link add_test | |
gcc -o $objdir/add_test $objdir/add_test.o $tmpdir/repo/repo.so |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment