Skip to content

Instantly share code, notes, and snippets.

@jayconrod
Last active March 8, 2018 16:31
Show Gist options
  • Save jayconrod/462442345eb70c0f806e8dde11086dcc to your computer and use it in GitHub Desktop.
Save jayconrod/462442345eb70c0f806e8dde11086dcc to your computer and use it in GitHub Desktop.
package main
import "C"
//export GoAdd
func GoAdd(a, b int) int {
return a + b
}
func main() {}
// +build ignore
#include <stdio.h>
#include "add.h"
int main() {
int x = GoAdd(12, 34);
printf("%d\n", x);
return 0;
}
#!/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