summaryrefslogtreecommitdiff
path: root/third_party/waf/wafadmin/3rdparty/go.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/waf/wafadmin/3rdparty/go.py')
-rw-r--r--third_party/waf/wafadmin/3rdparty/go.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/third_party/waf/wafadmin/3rdparty/go.py b/third_party/waf/wafadmin/3rdparty/go.py
new file mode 100644
index 00000000000..f8397c7e1c7
--- /dev/null
+++ b/third_party/waf/wafadmin/3rdparty/go.py
@@ -0,0 +1,110 @@
+#!/usr/bin/env python
+# encoding: utf-8
+# go.py - Waf tool for the Go programming language
+# By: Tom Wambold <tom5760@gmail.com>
+
+import platform, os
+
+import Task
+import Utils
+from TaskGen import feature, extension, after
+
+Task.simple_task_type('gocompile', '${GOC} ${GOCFLAGS} -o ${TGT} ${SRC}', shell=False)
+Task.simple_task_type('gopack', '${GOP} grc ${TGT} ${SRC}', shell=False)
+Task.simple_task_type('golink', '${GOL} ${GOLFLAGS} -o ${TGT} ${SRC}', shell=False)
+
+def detect(conf):
+
+ def set_def(var, val):
+ if not conf.env[var]:
+ conf.env[var] = val
+
+ goarch = os.getenv("GOARCH")
+
+ if goarch == '386':
+ set_def('GO_PLATFORM', 'i386')
+ elif goarch == 'amd64':
+ set_def('GO_PLATFORM', 'x86_64')
+ elif goarch == 'arm':
+ set_def('GO_PLATFORM', 'arm')
+ else:
+ set_def('GO_PLATFORM', platform.machine())
+
+ if conf.env.GO_PLATFORM == 'x86_64':
+ set_def('GO_COMPILER', '6g')
+ set_def('GO_LINKER', '6l')
+ set_def('GO_EXTENSION', '.6')
+ elif conf.env.GO_PLATFORM in ['i386', 'i486', 'i586', 'i686']:
+ set_def('GO_COMPILER', '8g')
+ set_def('GO_LINKER', '8l')
+ set_def('GO_EXTENSION', '.8')
+ elif conf.env.GO_PLATFORM == 'arm':
+ set_def('GO_COMPILER', '5g')
+ set_def('GO_LINKER', '5l')
+ set_def('GO_EXTENSION', '.5')
+
+ if not (conf.env.GO_COMPILER or conf.env.GO_LINKER or conf.env.GO_EXTENSION):
+ raise conf.fatal('Unsupported platform ' + platform.machine())
+
+ set_def('GO_PACK', 'gopack')
+ set_def('GO_PACK_EXTENSION', '.a')
+
+ conf.find_program(conf.env.GO_COMPILER, var='GOC', mandatory=True)
+ conf.find_program(conf.env.GO_LINKER, var='GOL', mandatory=True)
+ conf.find_program(conf.env.GO_PACK, var='GOP', mandatory=True)
+ conf.find_program('cgo', var='CGO', mandatory=True)
+
+@extension('.go')
+def compile_go(self, node):
+ try:
+ self.go_nodes.append(node)
+ except AttributeError:
+ self.go_nodes = [node]
+
+@feature('go')
+@after('apply_core')
+def apply_compile_go(self):
+ try:
+ nodes = self.go_nodes
+ except AttributeError:
+ self.go_compile_task = None
+ else:
+ self.go_compile_task = self.create_task('gocompile',
+ nodes,
+ [self.path.find_or_declare(self.target + self.env.GO_EXTENSION)])
+
+@feature('gopackage', 'goprogram')
+@after('apply_compile_go')
+def apply_goinc(self):
+ if not getattr(self, 'go_compile_task', None):
+ return
+
+ names = self.to_list(getattr(self, 'uselib_local', []))
+ for name in names:
+ obj = self.name_to_obj(name)
+ if not obj:
+ raise Utils.WafError('object %r was not found in uselib_local '
+ '(required by %r)' % (lib_name, self.name))
+ obj.post()
+ self.go_compile_task.set_run_after(obj.go_package_task)
+ self.go_compile_task.dep_nodes.extend(obj.go_package_task.outputs)
+ self.env.append_unique('GOCFLAGS', '-I' + obj.path.abspath(obj.env))
+ self.env.append_unique('GOLFLAGS', '-L' + obj.path.abspath(obj.env))
+
+@feature('gopackage')
+@after('apply_goinc')
+def apply_gopackage(self):
+ self.go_package_task = self.create_task('gopack',
+ self.go_compile_task.outputs[0],
+ self.path.find_or_declare(self.target + self.env.GO_PACK_EXTENSION))
+ self.go_package_task.set_run_after(self.go_compile_task)
+ self.go_package_task.dep_nodes.extend(self.go_compile_task.outputs)
+
+@feature('goprogram')
+@after('apply_goinc')
+def apply_golink(self):
+ self.go_link_task = self.create_task('golink',
+ self.go_compile_task.outputs[0],
+ self.path.find_or_declare(self.target))
+ self.go_link_task.set_run_after(self.go_compile_task)
+ self.go_link_task.dep_nodes.extend(self.go_compile_task.outputs)