[feature][aur] enabled ccache during installation if available

This commit is contained in:
Vinícius Moreira
2020-01-29 17:00:46 -03:00
parent 1b92cce8f5
commit c6a00ec2dd
4 changed files with 59 additions and 81 deletions

View File

@@ -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):