diff --git a/python/build/meson.py b/python/build/meson.py new file mode 100644 index 000000000..05abb694c --- /dev/null +++ b/python/build/meson.py @@ -0,0 +1,95 @@ +import os.path, subprocess, sys + +from build.project import Project + +class MesonProject(Project): + def __init__(self, url, md5, installed, configure_args=[], + **kwargs): + Project.__init__(self, url, md5, installed, **kwargs) + self.configure_args = configure_args + + def _make_cross_file(self, toolchain): + if toolchain.is_windows: + system = 'windows' + else: + system = 'linux' + + if toolchain.is_arm: + cpu_family = 'arm' + if toolchain.is_armv7: + cpu = 'armv7' + else: + cpu = 'armv6' + else: + cpu_family = 'x86' + if 'x86_64' in toolchain.arch: + cpu = 'x86_64' + else: + cpu = 'i686' + + # TODO: support more CPUs + endian = 'little' + + # TODO: write pkg-config wrapper + + path = os.path.join(toolchain.build_path, 'meson.cross') + with open(path, 'w') as f: + f.write(""" +[binaries] +c = '%s' +cpp = '%s' +ar = '%s' +strip = '%s' + +[properties] +root = '%s' + +c_args = %s +c_link_args = %s + +cpp_args = %s +cpp_link_args = %s + +[host_machine] +system = '%s' +cpu_family = '%s' +cpu = '%s' +endian = '%s' + """ % (toolchain.cc, toolchain.cxx, toolchain.ar, toolchain.strip, + toolchain.install_prefix, + repr((toolchain.cppflags + ' ' + toolchain.cflags).split()), + repr(toolchain.ldflags.split()), + repr((toolchain.cppflags + ' ' + toolchain.cxxflags).split()), + repr(toolchain.ldflags.split()), + system, cpu_family, cpu, endian)) + return path + + def configure(self, toolchain): + src = self.unpack(toolchain) + cross_file = self._make_cross_file(toolchain) + build = self.make_build_path(toolchain) + configure = [ + 'meson', + src, build, + + '--prefix', toolchain.install_prefix, + + # this is necessary because Meson uses Debian's build machine + # MultiArch path (e.g. "lib/x86_64-linux-gnu") for cross + # builds, which is obviously wrong + '--libdir', 'lib', + + '--buildtype', 'plain', + + '--default-library=static', + + '--cross-file', cross_file, + ] + self.configure_args + + subprocess.check_call(configure, env=toolchain.env) + return build + + def build(self, toolchain): + build = self.configure(toolchain) + subprocess.check_call(['ninja', 'install'], + cwd=build, env=toolchain.env)