3cc770a00b
Boost makes building a piece of software much more difficult than necessary. It's a huge library, and just uncompressing it takes a considerable amount of time. MPD only used a tiny fraction of it, yet its header bloat made the MPD build very slow. Locating Boost was difficult due to its arcane build system and its resistance to use pkg-config; it's always a special case. MPD could never use features of newer Boost versions because Linux distributions always shipped old Boost versions. Boost made everything complicated and slow. So, finally, after getting rid of GLib (commitccdb94b06c
), switching to C++ and using Boost (commit0801b3f495
), we've finally get rid of it 8 years later. Unfortunately, I had to reimplement parts of it along the way (e.g. IntrusiveList). Kind of NIH, but on the other hand, compiling MPD has become much easier for users.
117 lines
3.0 KiB
Python
117 lines
3.0 KiB
Python
import os.path, subprocess, sys
|
|
import platform
|
|
|
|
from build.project import Project
|
|
|
|
def make_cross_file(toolchain):
|
|
if toolchain.is_windows:
|
|
system = 'windows'
|
|
windres = "windres = '%s'" % toolchain.windres
|
|
else:
|
|
system = 'linux'
|
|
windres = ''
|
|
|
|
if toolchain.is_arm:
|
|
cpu_family = 'arm'
|
|
if toolchain.is_armv7:
|
|
cpu = 'armv7'
|
|
else:
|
|
cpu = 'armv6'
|
|
elif toolchain.is_aarch64:
|
|
cpu_family = 'aarch64'
|
|
cpu = 'arm64-v8a'
|
|
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')
|
|
os.makedirs(toolchain.build_path, exist_ok=True)
|
|
with open(path, 'w') as f:
|
|
f.write(f"""
|
|
[binaries]
|
|
c = '{toolchain.cc}'
|
|
cpp = '{toolchain.cxx}'
|
|
ar = '{toolchain.ar}'
|
|
strip = '{toolchain.strip}'
|
|
pkgconfig = '{toolchain.pkg_config}'
|
|
""")
|
|
|
|
if toolchain.is_windows and platform.system() != 'Windows':
|
|
f.write(f"windres = '{toolchain.windres}'\n")
|
|
|
|
# Run unit tests with WINE when cross-building for Windows
|
|
print("exe_wrapper = 'wine'", file=f)
|
|
|
|
f.write(f"""
|
|
[properties]
|
|
root = '{toolchain.install_prefix}'
|
|
""")
|
|
|
|
if 'android' in toolchain.arch:
|
|
f.write("""
|
|
# Keep Meson from executing Android-x86 test binariees
|
|
needs_exe_wrapper = true
|
|
""")
|
|
|
|
f.write(f"""
|
|
[built-in options]
|
|
c_args = {repr((toolchain.cppflags + ' ' + toolchain.cflags).split())}
|
|
c_link_args = {repr(toolchain.ldflags.split() + toolchain.libs.split())}
|
|
|
|
cpp_args = {repr((toolchain.cppflags + ' ' + toolchain.cxxflags).split())}
|
|
cpp_link_args = {repr(toolchain.ldflags.split() + toolchain.libs.split())}
|
|
""")
|
|
|
|
f.write(f"""
|
|
[host_machine]
|
|
system = '{system}'
|
|
cpu_family = '{cpu_family}'
|
|
cpu = '{cpu}'
|
|
endian = '{endian}'
|
|
""")
|
|
return path
|
|
|
|
def configure(toolchain, src, build, args=()):
|
|
cross_file = make_cross_file(toolchain)
|
|
configure = [
|
|
'meson', 'setup',
|
|
build, src,
|
|
|
|
'--prefix', toolchain.install_prefix,
|
|
|
|
'--buildtype', 'plain',
|
|
|
|
'--default-library=static',
|
|
|
|
'--cross-file', cross_file,
|
|
] + args
|
|
|
|
env = toolchain.env.copy()
|
|
|
|
subprocess.check_call(configure, env=env)
|
|
|
|
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 configure(self, toolchain):
|
|
src = self.unpack(toolchain)
|
|
build = self.make_build_path(toolchain)
|
|
configure(toolchain, src, build, self.configure_args)
|
|
return build
|
|
|
|
def _build(self, toolchain):
|
|
build = self.configure(toolchain)
|
|
subprocess.check_call(['ninja', 'install'],
|
|
cwd=build, env=toolchain.env)
|