Skip to content

Instantly share code, notes, and snippets.

@zyxar
Last active December 9, 2020 21:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zyxar/5140913 to your computer and use it in GitHub Desktop.
Save zyxar/5140913 to your computer and use it in GitHub Desktop.
python script for go cross-compile
#!/usr/bin/env pypy
import os
import subprocess
import sys
class Env(dict):
def __init__(self):
ALL_PLATFORMS=['darwin/amd64', 'linux/amd64', 'linux/386', 'linux/arm', 'freebsd/amd64', 'freebsd/386', 'windows/amd64', 'windows/386']
envs = subprocess.check_output(['go', 'env']).strip()
for kv in envs.split('\n'):
k, v = kv.split('=')
self[k] = v.split('\"')[1]
host = '%s/%s' % (self['GOHOSTOS'], self['GOHOSTARCH'])
ALL_PLATFORMS.remove(host)
self['platforms'] = ALL_PLATFORMS
goenv = Env()
class Builder(dict):
def __init__(self):
self.update(self._env)
def make(self):
os.chdir('%s/src'%goenv['GOROOT'])
cmd = ['./make.bash', '--no-clean']
p1 = subprocess.Popen(cmd, env=self)
p1.communicate()
def build(self):
cmd = ['go', 'build']
p1 = subprocess.Popen(cmd, env=self)
p1.communicate()
class CrossType(type):
def __new__(cls, name, bases, dct):
return type.__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
super(CrossType, cls).__init__(name, bases, dct)
def _genv(platform):
_os, _arch = platform.split('/')
_env = os.environ.copy()
_env['GOOS'] = _os
_env['GOARCH'] = _arch
_env['CGO_ENABLED'] = '0'
return _env
BuilderClasses = {}
for p in goenv['platforms']:
BuilderClasses[p] = CrossType(p, (Builder,), {'_env': _genv(p)})
def main(args):
b = BuilderClasses[args[0]]()
call = getattr(b, args[1])
call()
if __name__ == '__main__':
main(sys.argv[1:])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment