build: added cross-compilation configure options
authorAndrew Tridgell <tridge@samba.org>
Mon, 12 Apr 2010 12:06:51 +0000 (22:06 +1000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 12 Apr 2010 13:13:30 +0000 (23:13 +1000)
this enables use of a cross-compilation emulator, so configure tests
run on an emulator of the target platform

buildtools/wafsamba/samba_autoconf.py
buildtools/wafsamba/samba_cross.py [new file with mode: 0644]
buildtools/wafsamba/wscript

index d12fb9d9cd14b82f686457d9d8ce622a8c9453f9..cbb10a27caf49b0da61ff5ec1e4a81b90bbc0478 100644 (file)
@@ -4,6 +4,7 @@ import Build, os, Options, preproc, Logs
 import string
 from Configure import conf
 from samba_utils import *
+import samba_cross
 
 missing_headers = set()
 
@@ -367,6 +368,8 @@ def CHECK_CODE(conf, code, define,
     cflags = TO_LIST(cflags)
     cflags.extend(ccflags)
 
+    exec_args = conf.SAMBA_CROSS_ARGS()
+
     ret = conf.check(fragment=fragment,
                      execute=execute,
                      define_name = define,
@@ -378,6 +381,7 @@ def CHECK_CODE(conf, code, define,
                      type=type,
                      msg=msg,
                      quote=quote,
+                     exec_args=exec_args,
                      define_ret=define_ret)
     if not ret and CONFIG_SET(conf, define):
         # sometimes conf.check() returns false, but it
diff --git a/buildtools/wafsamba/samba_cross.py b/buildtools/wafsamba/samba_cross.py
new file mode 100644 (file)
index 0000000..70d74e0
--- /dev/null
@@ -0,0 +1,34 @@
+# functions for handling cross-compilation
+
+import pproc, Utils
+from Configure import conf
+from pproc import Popen
+
+real_Popen = None
+
+class cross_Popen(Popen):
+    '''cross-compilation wrapper for Popen'''
+    def __init__(*k, **kw):
+        (obj, args) = k
+        if '--cross-execute' in args:
+            # when --cross-execute is set, then change the arguments
+            # to use the cross emulator
+            i = args.index('--cross-execute')
+            newargs = args[i+1].split()
+            newargs.extend(args[0:i])
+            args = newargs
+        Popen.__init__(*(obj, args), **kw)
+
+
+@conf
+def SAMBA_CROSS_ARGS(conf):
+    '''get exec_args to pass when running cross compiled binaries'''
+    if not conf.env.CROSS_COMPILE or not conf.env.CROSS_EXECUTE:
+        return []
+
+    global real_Popen
+    if real_Popen is None:
+        real_Popen  = Utils.pproc.Popen
+        Utils.pproc.Popen = cross_Popen
+
+    return ['--cross-execute', conf.env.CROSS_EXECUTE]
index 2e42139bb9dc884eeac0f81b56405761b33679ef..87e70702dcdc2341a3d6086d97f35d7751db9d2b 100644 (file)
@@ -68,6 +68,17 @@ def set_options(opt):
                   help=("Enable even more compiler warnings"),
                   action='store_true', dest='pedantic', default=False)
 
+    opt.add_option('--cross-compile',
+                  help=("configure for cross-compilation"),
+                  action='store_true', dest='CROSS_COMPILE', default=False)
+    opt.add_option('--cross-execute',
+                  help=("command prefix to use for cross-execution in configure"),
+                  action='store', dest='CROSS_EXECUTE', default='')
+    opt.add_option('--hostcc',
+                  help=("set host compiler when cross compiling"),
+                  action='store', dest='HOSTCC', default=False)
+
+
 @wafsamba.runonce
 def configure(conf):
     conf.env.hlist = []
@@ -105,6 +116,10 @@ def configure(conf):
     conf.env.BUNDLED_EXTENSION = Options.options.BUNDLED_EXTENSION
     conf.env.BUNDLED_EXTENSION_EXCEPTION = Options.options.BUNDLED_EXTENSION_EXCEPTION.split(',')
 
+    conf.env.CROSS_COMPILE = Options.options.CROSS_COMPILE
+    conf.env.CROSS_EXECUTE = Options.options.CROSS_EXECUTE
+    conf.env.HOSTCC        = Options.options.HOSTCC
+
     # see if we can compile and run a simple C program
     conf.CHECK_CODE('printf("hello world\\n")',
                     define='HAVE_SIMPLE_C_PROG',