WIP: make packages.py work moar
This commit is contained in:
parent
3a9deb2340
commit
bc8904c1f1
3 changed files with 21 additions and 17 deletions
29
chroot.py
29
chroot.py
|
@ -51,7 +51,7 @@ BASIC_MOUNTS = {
|
||||||
'options': ['bind'],
|
'options': ['bind'],
|
||||||
},
|
},
|
||||||
'/etc/resolv.conf': {
|
'/etc/resolv.conf': {
|
||||||
'src': '/etc/resolv.conf',
|
'src': os.path.realpath('/etc/resolv.conf'),
|
||||||
'type': None,
|
'type': None,
|
||||||
'options': ['bind'],
|
'options': ['bind'],
|
||||||
},
|
},
|
||||||
|
@ -106,12 +106,12 @@ def get_base_chroot(arch: Arch, **kwargs) -> Chroot:
|
||||||
def get_build_chroot(arch: Arch, extra_repos=None, **kwargs) -> Chroot:
|
def get_build_chroot(arch: Arch, extra_repos=None, **kwargs) -> Chroot:
|
||||||
name = build_chroot_name(arch)
|
name = build_chroot_name(arch)
|
||||||
extra_repos = get_kupfer_local(arch).repos if extra_repos is None else extra_repos
|
extra_repos = get_kupfer_local(arch).repos if extra_repos is None else extra_repos
|
||||||
default = Chroot(name, arch, initialize=False, extra_repos=extra_repos)
|
default = Chroot(name, arch, initialize=False, copy_base=True, extra_repos=extra_repos)
|
||||||
return get_chroot(name, **kwargs, default=default)
|
return get_chroot(name, **kwargs, default=default)
|
||||||
|
|
||||||
|
|
||||||
def get_device_chroot(name: str, arch: Arch, **kwargs) -> Chroot:
|
def get_device_chroot(name: str, arch: Arch, **kwargs) -> Chroot:
|
||||||
default = Chroot(name, arch, initialize=False)
|
default = Chroot(name, arch, initialize=False, copy_base=False)
|
||||||
return get_chroot(name, **kwargs, default=default)
|
return get_chroot(name, **kwargs, default=default)
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,12 +172,13 @@ class Chroot:
|
||||||
raise Exception(f"Chroot {self.name} is already initialized, this seems like a bug")
|
raise Exception(f"Chroot {self.name} is already initialized, this seems like a bug")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.deactivate_core()
|
self.deactivate()
|
||||||
|
|
||||||
if self.copy_base:
|
if self.copy_base:
|
||||||
base_chroot = get_base_chroot(self.arch, initialize=True)
|
base_chroot = get_base_chroot(self.arch)
|
||||||
if base_chroot == self:
|
if base_chroot == self:
|
||||||
raise Exception('base_chroot == self, bailing out. this is a bug')
|
raise Exception('base_chroot == self, bailing out. this is a bug')
|
||||||
|
base_chroot.initialize()
|
||||||
logging.info(f'Copying {base_chroot.name} chroot to {self.name}')
|
logging.info(f'Copying {base_chroot.name} chroot to {self.name}')
|
||||||
result = subprocess.run([
|
result = subprocess.run([
|
||||||
'rsync',
|
'rsync',
|
||||||
|
@ -255,6 +256,7 @@ class Chroot:
|
||||||
result = mount(absolute_source, absolute_destination, options=options, fs_type=fs_type, register_unmount=False)
|
result = mount(absolute_source, absolute_destination, options=options, fs_type=fs_type, register_unmount=False)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
raise Exception(f'{self.name}: failed to mount {absolute_source} to {relative_destination}')
|
raise Exception(f'{self.name}: failed to mount {absolute_source} to {relative_destination}')
|
||||||
|
logging.debug(f'{self.name}: {absolute_source} successfully mounted to {absolute_destination}.')
|
||||||
self.active_mounts += [relative_destination]
|
self.active_mounts += [relative_destination]
|
||||||
atexit.register(self.deactivate)
|
atexit.register(self.deactivate)
|
||||||
return absolute_destination
|
return absolute_destination
|
||||||
|
@ -270,10 +272,8 @@ class Chroot:
|
||||||
|
|
||||||
def activate(self, fail_if_active: bool = False):
|
def activate(self, fail_if_active: bool = False):
|
||||||
"""mount /dev, /sys and /proc"""
|
"""mount /dev, /sys and /proc"""
|
||||||
if self.active:
|
if self.active and fail_if_active:
|
||||||
if fail_if_active:
|
|
||||||
raise Exception(f'chroot {self.name} already active!')
|
raise Exception(f'chroot {self.name} already active!')
|
||||||
return
|
|
||||||
if not self.initialized:
|
if not self.initialized:
|
||||||
self.initialize(fail_if_initialized=False)
|
self.initialize(fail_if_initialized=False)
|
||||||
for dst, opts in BASIC_MOUNTS.items():
|
for dst, opts in BASIC_MOUNTS.items():
|
||||||
|
@ -283,6 +283,9 @@ class Chroot:
|
||||||
def deactivate_core(self):
|
def deactivate_core(self):
|
||||||
for dst in BASIC_MOUNTS.keys():
|
for dst in BASIC_MOUNTS.keys():
|
||||||
self.umount(dst)
|
self.umount(dst)
|
||||||
|
# TODO: so this is a weird one. while the basic bind-mounts get unmounted
|
||||||
|
# additional mounts like crossdirect are intentionally left intact. Is such a chroot still `active` afterwards?
|
||||||
|
self.active = False
|
||||||
|
|
||||||
def deactivate(self, fail_if_inactive: bool = False):
|
def deactivate(self, fail_if_inactive: bool = False):
|
||||||
if not self.active:
|
if not self.active:
|
||||||
|
@ -403,14 +406,14 @@ class Chroot:
|
||||||
logging.debug('ld-linux.so symlink already exists, skipping for {target_chroot.name}')
|
logging.debug('ld-linux.so symlink already exists, skipping for {target_chroot.name}')
|
||||||
|
|
||||||
# TODO: find proper fix
|
# TODO: find proper fix
|
||||||
|
rustc = os.path.join(native_chroot.path, 'usr/lib/crossdirect', target_arch, 'rustc')
|
||||||
|
if os.path.exists(rustc):
|
||||||
logging.debug('Disabling crossdirect rustc')
|
logging.debug('Disabling crossdirect rustc')
|
||||||
os.unlink(os.path.join(native_chroot.path, 'usr/lib/crossdirect', target_arch, 'rustc'))
|
os.unlink()
|
||||||
|
|
||||||
os.makedirs(native_mount, exist_ok=True)
|
os.makedirs(native_mount, exist_ok=True)
|
||||||
logging.debug(f'Mounting {native_chroot.name} to {native_mount}')
|
logging.debug(f'Mounting {native_chroot.name} to {native_mount}')
|
||||||
result = self.mount(native_chroot, native_mount)
|
self.mount(native_chroot.path, 'native')
|
||||||
if result.returncode != 0:
|
|
||||||
raise Exception(f'Failed to mount native chroot {native_chroot.name} to {native_mount}')
|
|
||||||
return native_mount
|
return native_mount
|
||||||
|
|
||||||
def mount_pkgbuilds(self, fail_if_mounted: bool = False) -> str:
|
def mount_pkgbuilds(self, fail_if_mounted: bool = False) -> str:
|
||||||
|
@ -418,7 +421,7 @@ class Chroot:
|
||||||
return self.mount(absolute_source=packages, relative_destination=packages.lstrip('/'), fail_if_mounted=fail_if_mounted)
|
return self.mount(absolute_source=packages, relative_destination=packages.lstrip('/'), fail_if_mounted=fail_if_mounted)
|
||||||
|
|
||||||
def mount_pacman_cache(self, fail_if_mounted: bool = False) -> str:
|
def mount_pacman_cache(self, fail_if_mounted: bool = False) -> str:
|
||||||
return self.mount(os.path.join(config.get_path('pacman'), self.arch), 'var/cache/pacman', fail_if_mounted=fail_if_mounted)
|
return self.mount(os.path.join(config.get_path('pacman'), self.arch), 'var/cache/pacman/pkg', fail_if_mounted=fail_if_mounted)
|
||||||
|
|
||||||
def mount_packages(self, fail_if_mounted: bool = False) -> str:
|
def mount_packages(self, fail_if_mounted: bool = False) -> str:
|
||||||
packages = config.get_path('packages')
|
packages = config.get_path('packages')
|
||||||
|
|
|
@ -172,7 +172,7 @@ SRCEXT='.src.tar.gz'
|
||||||
#PACMAN_AUTH=()
|
#PACMAN_AUTH=()
|
||||||
'''
|
'''
|
||||||
if cross:
|
if cross:
|
||||||
chroot = chroot.lstrip('/')
|
chroot = chroot.strip('/')
|
||||||
includes = f'-I/usr/{hostspec}/usr/include -I/{chroot}/usr/include'
|
includes = f'-I/usr/{hostspec}/usr/include -I/{chroot}/usr/include'
|
||||||
libs = f'-L/usr/{hostspec}/lib -L/{chroot}/usr/lib'
|
libs = f'-L/usr/{hostspec}/lib -L/{chroot}/usr/lib'
|
||||||
conf += f'''
|
conf += f'''
|
||||||
|
|
|
@ -494,9 +494,10 @@ def build_package(
|
||||||
|
|
||||||
setup_sources(package, build_root)
|
setup_sources(package, build_root)
|
||||||
for chroot in chroots:
|
for chroot in chroots:
|
||||||
|
chroot.activate()
|
||||||
|
chroot.mount_pacman_cache()
|
||||||
chroot.mount_pkgbuilds()
|
chroot.mount_pkgbuilds()
|
||||||
chroot.mount_packages()
|
chroot.mount_packages()
|
||||||
chroot.activate()
|
|
||||||
|
|
||||||
makepkg_conf_absolute = os.path.join('/', makepkg_conf_path)
|
makepkg_conf_absolute = os.path.join('/', makepkg_conf_path)
|
||||||
build_cmd = f'cd {package.path} && makepkg --config {makepkg_conf_absolute} --needed --noconfirm --ignorearch {" ".join(makepkg_compile_opts)}'
|
build_cmd = f'cd {package.path} && makepkg --config {makepkg_conf_absolute} --needed --noconfirm --ignorearch {" ".join(makepkg_compile_opts)}'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue