mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 10:15:57 +01:00
Only one --host exists at ./build-modules, since that can select the host kernel, which is independent from the toolchain. Document that user mode simulation stopped working.
97 lines
3.1 KiB
Python
Executable File
97 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import shlex
|
|
|
|
import common
|
|
from shell_helpers import LF
|
|
|
|
class Main(common.BuildCliFunction):
|
|
def __init__(self):
|
|
super().__init__(
|
|
description='''\
|
|
Build our compiled userland examples.
|
|
'''
|
|
)
|
|
self.add_argument(
|
|
'--has-package',
|
|
action='append',
|
|
default=[],
|
|
help='''\
|
|
Indicate that a given package is present in the root filesystem, which
|
|
allows us to build examples that rely on it.
|
|
''',
|
|
)
|
|
self.add_argument(
|
|
'--host',
|
|
default=False,
|
|
help='''\
|
|
Build the userland programs for the host instead of guest.
|
|
Use the host packaged cross toolchain.
|
|
''',
|
|
)
|
|
self.add_argument(
|
|
'--make-args',
|
|
default='',
|
|
)
|
|
self.add_argument(
|
|
'targets',
|
|
default=[],
|
|
help='''\
|
|
Build only the given userland programs.
|
|
Default: build all examples that have their package dependencies met.
|
|
For example, an OpenBLAS example can only be built if the target root filesystem
|
|
has the OpenBLAS libraries and headers installed.
|
|
''',
|
|
nargs='*',
|
|
)
|
|
|
|
def build(self):
|
|
build_dir = self.get_build_dir()
|
|
os.makedirs(build_dir, exist_ok=True)
|
|
make_args = shlex.split(self.env['make_args'])
|
|
if self.env['static']:
|
|
make_args.extend(['CCFLAGS_EXTRA=-static', LF])
|
|
self.sh.run_cmd(
|
|
(
|
|
[
|
|
'make', LF,
|
|
'-j', str(self.env['nproc']), LF,
|
|
'ARCH={}'.format(self.env['arch']), LF,
|
|
'CCFLAGS_SCRIPT={} {}'.format('-I', self.env['userland_source_dir']), LF,
|
|
'COMMON_DIR={}'.format(self.env['root_dir']), LF,
|
|
'CC={}'.format(self.get_toolchain_tool('gcc')), LF,
|
|
'CXX={}'.format(self.get_toolchain_tool('g++')), LF,
|
|
'PKG_CONFIG={}'.format(self.env['buildroot_pkg_config']), LF,
|
|
'STAGING_DIR={}'.format(self.env['buildroot_staging_dir']), LF,
|
|
'OUT_DIR={}'.format(build_dir), LF,
|
|
] +
|
|
self.sh.add_newlines([
|
|
'HAS_{}=y'.format(package.upper())
|
|
for package in
|
|
self.env['has_package']
|
|
]) +
|
|
make_args +
|
|
self.sh.add_newlines([
|
|
os.path.join(
|
|
build_dir,
|
|
os.path.splitext(os.path.split(target)[1])[0]
|
|
) + self.env['userland_build_ext']
|
|
for target in self.env['targets']
|
|
])
|
|
),
|
|
cwd=self.env['userland_source_dir'],
|
|
extra_paths=[self.env['ccache_dir']],
|
|
)
|
|
self.sh.copy_dir_if_update_non_recursive(
|
|
srcdir=build_dir,
|
|
destdir=self.env['out_rootfs_overlay_dir'],
|
|
filter_ext=self.env['userland_build_ext'],
|
|
)
|
|
|
|
def get_build_dir(self):
|
|
return self.env['userland_build_dir']
|
|
|
|
if __name__ == '__main__':
|
|
Main().cli()
|