2021-09-20 22:54:54 +02:00
|
|
|
import os
|
2020-05-26 21:08:29 +02:00
|
|
|
import subprocess
|
|
|
|
|
|
|
|
from build.project import Project
|
|
|
|
|
2021-09-20 22:54:54 +02:00
|
|
|
def __write_cmake_compiler(f, language, compiler):
|
2021-07-29 09:32:21 +02:00
|
|
|
s = compiler.split(' ', 1)
|
|
|
|
if len(s) == 2:
|
2021-09-20 22:54:54 +02:00
|
|
|
print(f'set(CMAKE_{language}_COMPILER_LAUNCHER {s[0]})', file=f)
|
2021-07-29 09:32:21 +02:00
|
|
|
compiler = s[1]
|
2021-09-20 22:54:54 +02:00
|
|
|
print(f'set(CMAKE_{language}_COMPILER {compiler})', file=f)
|
|
|
|
|
|
|
|
def __write_cmake_toolchain_file(f, toolchain):
|
|
|
|
if '-darwin' in toolchain.actual_arch:
|
|
|
|
cmake_system_name = 'Darwin'
|
|
|
|
elif toolchain.is_windows:
|
|
|
|
cmake_system_name = 'Windows'
|
|
|
|
else:
|
|
|
|
cmake_system_name = 'Linux'
|
|
|
|
|
|
|
|
f.write(f"""
|
|
|
|
set(CMAKE_SYSTEM_NAME {cmake_system_name})
|
|
|
|
set(CMAKE_SYSTEM_PROCESSOR {toolchain.actual_arch.split('-', 1)[0]})
|
|
|
|
|
|
|
|
set(CMAKE_C_COMPILER_TARGET {toolchain.actual_arch})
|
|
|
|
set(CMAKE_CXX_COMPILER_TARGET {toolchain.actual_arch})
|
|
|
|
|
|
|
|
set(CMAKE_C_FLAGS "{toolchain.cflags} {toolchain.cppflags}")
|
|
|
|
set(CMAKE_CXX_FLAGS "{toolchain.cxxflags} {toolchain.cppflags}")
|
|
|
|
""")
|
|
|
|
__write_cmake_compiler(f, 'C', toolchain.cc)
|
|
|
|
__write_cmake_compiler(f, 'CXX', toolchain.cxx)
|
2021-07-29 09:32:21 +02:00
|
|
|
|
2020-05-26 21:08:29 +02:00
|
|
|
def configure(toolchain, src, build, args=()):
|
|
|
|
cross_args = []
|
|
|
|
|
|
|
|
if toolchain.is_windows:
|
|
|
|
cross_args.append('-DCMAKE_RC_COMPILER=' + toolchain.windres)
|
|
|
|
|
2021-09-20 22:54:54 +02:00
|
|
|
# Several targets need a sysroot to prevent pkg-config from
|
|
|
|
# looking for libraries on the build host (TODO: fix this
|
|
|
|
# properly); but we must not do that on Android because the NDK
|
|
|
|
# has a sysroot already
|
|
|
|
if '-android' not in toolchain.actual_arch and '-darwin' not in toolchain.actual_arch:
|
|
|
|
cross_args.append('-DCMAKE_SYSROOT=' + toolchain.install_prefix)
|
|
|
|
|
|
|
|
os.makedirs(build, exist_ok=True)
|
|
|
|
cmake_toolchain_file = os.path.join(build, 'cmake_toolchain_file')
|
|
|
|
with open(cmake_toolchain_file, 'w') as f:
|
|
|
|
__write_cmake_toolchain_file(f, toolchain)
|
|
|
|
|
2020-05-26 21:08:29 +02:00
|
|
|
configure = [
|
|
|
|
'cmake',
|
|
|
|
src,
|
|
|
|
|
2021-09-20 22:54:54 +02:00
|
|
|
'-DCMAKE_TOOLCHAIN_FILE=' + cmake_toolchain_file,
|
|
|
|
|
2020-05-26 21:08:29 +02:00
|
|
|
'-DCMAKE_INSTALL_PREFIX=' + toolchain.install_prefix,
|
|
|
|
'-DCMAKE_BUILD_TYPE=release',
|
|
|
|
|
|
|
|
'-GNinja',
|
|
|
|
] + cross_args + args
|
|
|
|
|
|
|
|
subprocess.check_call(configure, env=toolchain.env, cwd=build)
|
|
|
|
|
|
|
|
class CmakeProject(Project):
|
|
|
|
def __init__(self, url, md5, installed, configure_args=[],
|
2021-03-12 21:56:32 +01:00
|
|
|
windows_configure_args=[],
|
2020-05-26 21:08:29 +02:00
|
|
|
**kwargs):
|
|
|
|
Project.__init__(self, url, md5, installed, **kwargs)
|
|
|
|
self.configure_args = configure_args
|
2021-03-12 21:56:32 +01:00
|
|
|
self.windows_configure_args = windows_configure_args
|
2020-05-26 21:08:29 +02:00
|
|
|
|
|
|
|
def configure(self, toolchain):
|
|
|
|
src = self.unpack(toolchain)
|
|
|
|
build = self.make_build_path(toolchain)
|
2021-03-12 21:56:32 +01:00
|
|
|
configure_args = self.configure_args
|
|
|
|
if toolchain.is_windows:
|
|
|
|
configure_args = configure_args + self.windows_configure_args
|
|
|
|
configure(toolchain, src, build, configure_args)
|
2020-05-26 21:08:29 +02:00
|
|
|
return build
|
|
|
|
|
2021-08-28 22:41:31 +02:00
|
|
|
def _build(self, toolchain):
|
2020-05-26 21:08:29 +02:00
|
|
|
build = self.configure(toolchain)
|
|
|
|
subprocess.check_call(['ninja', 'install'],
|
|
|
|
cwd=build, env=toolchain.env)
|