mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-09 21:14:15 +02:00
[feature][aur] enabled ccache during installation if available
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
from multiprocessing import Process
|
||||
from pathlib import Path
|
||||
from threading import Thread
|
||||
@@ -8,6 +9,7 @@ from threading import Thread
|
||||
import requests
|
||||
|
||||
from bauh.api.abstract.context import ApplicationContext
|
||||
from bauh.commons.system import run_cmd
|
||||
from bauh.gems.arch import pacman, disk, CUSTOM_MAKEPKG_FILE, CONFIG_DIR, BUILD_DIR, \
|
||||
AUR_INDEX_FILE, config
|
||||
|
||||
@@ -17,7 +19,6 @@ URL_INFO = 'https://aur.archlinux.org/rpc/?v=5&type=info&arg={}'
|
||||
GLOBAL_MAKEPKG = '/etc/makepkg.conf'
|
||||
|
||||
RE_MAKE_FLAGS = re.compile(r'#?\s*MAKEFLAGS\s*=\s*.+\s*')
|
||||
RE_COMPRESS_XZ = re.compile(r'#?\s*COMPRESSXZ\s*=\s*.+')
|
||||
RE_CLEAR_REPLACE = re.compile(r'[\-_.]')
|
||||
|
||||
|
||||
@@ -74,8 +75,15 @@ class ArchCompilationOptimizer(Thread):
|
||||
def __init__(self, logger: logging.Logger):
|
||||
super(ArchCompilationOptimizer, self).__init__(daemon=True)
|
||||
self.logger = logger
|
||||
self.re_compress_xz = re.compile(r'#?\s*COMPRESSXZ\s*=\s*.+')
|
||||
self.re_build_env = re.compile(r'\s+BUILDENV\s*=.+')
|
||||
self.re_ccache = re.compile(r'!?ccache')
|
||||
|
||||
def _is_ccache_installed(self) -> bool:
|
||||
return bool(run_cmd('which ccache', print_error=False))
|
||||
|
||||
def optimize(self):
|
||||
ti = time.time()
|
||||
try:
|
||||
ncpus = os.cpu_count()
|
||||
except:
|
||||
@@ -106,22 +114,50 @@ class ArchCompilationOptimizer(Thread):
|
||||
else:
|
||||
optimizations.append('MAKEFLAGS="-j$(nproc)"')
|
||||
|
||||
compress_xz = RE_COMPRESS_XZ.findall(custom_makepkg if custom_makepkg else global_makepkg)
|
||||
compress_xz = self.re_compress_xz.findall(custom_makepkg or global_makepkg)
|
||||
|
||||
if compress_xz:
|
||||
not_eligible = [f for f in compress_xz if not f.startswith('#') and '--threads' in f]
|
||||
|
||||
if not not_eligible:
|
||||
custom_makepkg = RE_COMPRESS_XZ.sub('', global_makepkg)
|
||||
custom_makepkg = self.re_compress_xz.sub('', custom_makepkg or global_makepkg)
|
||||
optimizations.append('COMPRESSXZ=(xz -c -z - --threads=0)')
|
||||
else:
|
||||
self.logger.warning("It seems '{}' COMPRESSXZ is already customized".format(GLOBAL_MAKEPKG))
|
||||
else:
|
||||
optimizations.append('COMPRESSXZ=(xz -c -z - --threads=0)')
|
||||
|
||||
build_envs = self.re_build_env.findall(custom_makepkg or global_makepkg)
|
||||
|
||||
if build_envs:
|
||||
build_def = None
|
||||
for e in build_envs:
|
||||
env_line = e.strip()
|
||||
|
||||
ccache_defs = self.re_ccache.findall(env_line)
|
||||
ccache_installed = self._is_ccache_installed()
|
||||
|
||||
if ccache_defs:
|
||||
if ccache_installed:
|
||||
custom_makepkg = (custom_makepkg or global_makepkg).replace(e, '')
|
||||
|
||||
if not build_def:
|
||||
build_def = self.re_ccache.sub('', env_line).replace('(', '(ccache ')
|
||||
elif not build_def:
|
||||
build_def = self.re_ccache.sub('', env_line)
|
||||
|
||||
if build_def:
|
||||
optimizations.append(build_def)
|
||||
else:
|
||||
self.logger.warning("No BUILDENV declaration found")
|
||||
|
||||
if self._is_ccache_installed():
|
||||
self.logger.info('Adding a BUILDENV declaration')
|
||||
optimizations.append('BUILDENV=(ccache)')
|
||||
|
||||
if optimizations:
|
||||
generated_by = '# <generated by bauh>\n'
|
||||
custom_makepkg = generated_by + custom_makepkg + '\n' + generated_by + '\n'.join(optimizations) + '\n'
|
||||
custom_makepkg = custom_makepkg + '\n' + generated_by + '\n'.join(optimizations) + '\n'
|
||||
|
||||
with open(CUSTOM_MAKEPKG_FILE, 'w+') as f:
|
||||
f.write(custom_makepkg)
|
||||
@@ -134,6 +170,8 @@ class ArchCompilationOptimizer(Thread):
|
||||
self.logger.info("Removing old optimized 'makepkg.conf' at '{}'".format(CUSTOM_MAKEPKG_FILE))
|
||||
os.remove(CUSTOM_MAKEPKG_FILE)
|
||||
|
||||
tf = time.time()
|
||||
self.logger.info("Optimizations took {0:.2f} seconds".format(tf - ti))
|
||||
self.logger.info('Finished')
|
||||
|
||||
def run(self):
|
||||
|
||||
Reference in New Issue
Block a user