Добавлены комментарий к коду, исправлены параметры

master
Mike Khiretskiy 9 years ago
parent 0f7f0c56bf
commit e522254f00

@ -25,18 +25,24 @@ TEMPLATES_BACKUP=${LOCAL_TEMPLATES_DIR}/backup
DEBUG_LOG=/var/log/calculate/cl-kernel.log
KVER=
KERNEL_DIR=${DEFAULT_KERNEL_DIRECTORY}
# create base config
# создавать базовую конфигурацию ядра
CREATE_BASE=1
# create config by template
# создавать текущую конфигурацию ядра
CREATE_NEW=1
# собирать ядро после конфигурации
BUILD_KERNEL=1
# права на файл шаблона
CHMOD=0644
# наличие dracut в системе
DRACUT=$(which dracut 2>/dev/null)
declare -a TAILOUT=()
# прервать скрипт в случае ошибки любой из команд
set -e
: >$DEBUG_LOG
# вывод короткой справки
usage() {
echo $"Usage: $0 [OPTION]
@ -47,6 +53,7 @@ ${DESCRIPTION}
-h, --help display all options and exit"
}
# вывод полной справки
long_usage() {
echo $"Usage: $0 [OPTION]
@ -64,6 +71,7 @@ ${DESCRIPTION}
"
}
# подготовить параметры командной строки
rearrange_params() {
TEMP=$(unset POSIXLY_CORRECT; getopt \
-o "hs" \
@ -81,6 +89,7 @@ rearrange_params() {
fi
}
# выполнить параметры командной строки
do_args() {
while :; do
case $1 in
@ -114,15 +123,21 @@ do_args() {
-s|--skip-build)
BUILD_KERNEL=
;;
--) ;;
*)
usage;
eerror $"Unknown option: $1"
--) shift;break;;
*) usage;
eerror $"Unknown option: $1"
;;
esac
shift
done
if [[ -n $1 ]]
then
usage;
eerror $"Unknown option: $1"
fi
}
# использовать параметры из make.conf
source_makeconf() {
[[ -f /etc/make.conf ]] && source /etc/make.conf
if [[ -d /etc/portage/make.conf ]]
@ -134,6 +149,7 @@ source_makeconf() {
fi
}
# получить значение переменной calculate
variable_value()
{
local varname=$1
@ -220,18 +236,22 @@ diff_template_body() {
append_options $orig_file $new_file | exclude_options ${exclude_opts[*]} | discard_option_n | sort || true
}
# вывести заголов для шаблона
# Args:
# категория/название пакета
# версия пакета
diff_template_head() {
local category_pn=$1
local pv=$2
echo "# Calculate format=kernel name=.config os_install_arch_machine==${TEMPLATE_ARCH}&&merge(${category_pn})>=${pv}"
}
variable_value()
{
local varname=$1
/usr/sbin/cl-core-variables-show --only-value $varname
}
# вывести полный шаблон
# Args:
# категория/название пакета
# версия пакета
# файл базовой конфигурации
# файл новой конфигурации
create_template() {
local category_pn=$1
local pv=$2
@ -241,35 +261,49 @@ create_template() {
diff_template_body ${base_config} ${new_config}
}
# получить конфигурацию ядра
# Args:
# каталог с исходным кодом ядра
# категория/название пакета
# версия пакета
# применяемые шаблоны (локации)
create_kernel_config() {
local kernel_dir=$1
local category_pn=( ${2/\// } )
local category=${category_pn[0]}
local pn=${category_pn[1]}
local pv=$3
# создать временную директорию для выполнения шаблонов
local tempdir=$(${MKTEMP} -d)
local config=$(${MKTEMP})
[[ -n $4 ]] && local templates="-T $4"
(cd ${kernel_dir};ARCH=$MARCH KCONFIG_CONFIG=.config_clkernel make defconfig;mv .config_clkernel ${tempdir}/.config) &>>$DEBUG_LOG ||
eerror $"Failed to create default kernel config"
# получить конфигурацию ядра по умолчанию, нужной архитектуры
local temp_config=".config_clkernel_${ARCH}"
(cd ${kernel_dir};ARCH=$MARCH KCONFIG_CONFIG=${temp_config} make defconfig;mv ${temp_config} ${tempdir}/.config) &>>$DEBUG_LOG ||
eerror $"Failed to create default kernel config"
# выполнить шаблоны (патчи)
/usr/sbin/cl-core-patch --march=$TEMPLATE_ARCH --pkg-name ${pn} --pkg-category ${category} --pkg-version=${pv} --pkg-slot=${pv} --pkg-path=$tempdir $templates &>>$DEBUG_LOG || eerror $"Failed to apply kernel templates"
# вывести содержимое файла конфигурации ядра
cat $tempdir/.config || eerror $"Kernel configuration file not found"
rm -rf $tempdir &>>$DEBUG_LOG
}
# проверить содержит ли каталог полный исходный код ядра
check_kernel_sources() {
local sources_dir=$1
[[ -f ${sources_dir}/arch/x86/configs/i386_defconfig ]]
}
# версия исходного кода ядра
sources_ver() {
basename "$(readlink -f $1)" | sed 's/linux-//' || true
}
# текущее ядро
current_kernel() {
sources_ver /usr/src/linux
}
# вывести список версий ядер с полным исходным кодом
list_kernel() {
local asterisk=$(echo -e "\033[1m*\033[0m")
local curver=$1
@ -280,33 +314,40 @@ list_kernel() {
done
}
# вывести сообщение и добавить его в список выводимых после сборки ядра сообщений
einfo_tail() {
einfo $*
TAILOUT+=( "$*" )
}
#####################
# Process options
#####################
######################
# Обработать параметры
######################
rearrange_params "$@"
eval set -- "$TEMP"
do_args "$@"
######################
#
######################
########################
# Подготовить переменные
########################
# вычислить архитектуру
[[ -z $MARCH ]] && MARCH=$(/usr/bin/arch)
if [[ "$MARCH" == "x86" ]] || [[ "$MARCH" == "i686" ]]
then
# архитектура для конфигурации по умолчанию
MARCH=i386
# архитектура для шаблонов
TEMPLATE_ARCH=i686
# название архитектуры
NAME_ARCH=x86
else
TEMPLATE_ARCH=$MARCH
NAME_ARCH=$MARCH
fi
# подготовить имя для шаблона очистить старые временные данные
TMP_TEMPLATE=/tmp/cl_kernel_${MARCH}
MKTEMP="/usr/bin/mktemp ${TMP_TEMPLATE}.XXXXXX"
rm -rf ${TMP_TEMPLATE}*
@ -318,12 +359,14 @@ then
BUILD_KERNEL=
fi
# вывести список доступных ядер
if [[ $KVER == "list" ]] || [[ $KVER_OLD == "list" ]]
then
list_kernel $(current_kernel)
exit 0
fi
# получить директорию ядра по версии
if [[ -n $KVER ]]
then
KERNEL_DIR=${SRC_DIRECTORY}/linux-${KVER}
@ -332,17 +375,20 @@ if [[ -n $KVER_OLD ]]
then
KERNEL_OLD_DIR=${SRC_DIRECTORY}/linux-${KVER_OLD}
fi
# проверить правильность исходников
for check_dir in ${KERNEL_DIR} ${KERNEL_OLD_DIR}
do
[[ -d ${check_dir} ]] || eerror $"Kernel directory ${check_dir} not found"
check_kernel_sources ${check_dir} || eerror $"Kernel directory ${check_dir} has not full sources"
done
# получить версию из директории ядра
if [[ -z $KVER ]]
then
KVER=$(sources_ver $KERNEL_DIR)
fi
# проверка доступности safemode
if [[ -n $SAFEMODE ]] && ! [[ $KVER =~ -calculate ]]
then
eerror $"--safemode available for calculate-sources only"
@ -353,6 +399,7 @@ then
eerror $"--safemode unavailable without dracut"
fi
# создать каталог в локальных шаблонах для шаблонов ядра
if ! [[ -d $LOCAL_TEMPLATES_DIR ]]
then
(mkdir -p $LOCAL_TEMPLATES_DIR ;
@ -360,6 +407,7 @@ then
eerror $"Failed to create kernel template directory"
fi
# если другая архитектура
if [[ -n $OTHER_ARCH ]]
then
NEW_CONFIG=${KERNEL_DIR}/.config_${TEMPLATE_ARCH}
@ -367,6 +415,7 @@ else
NEW_CONFIG=${KERNEL_DIR}/.config
fi
# получение параметров пакета, которому принадлежат исходники
CATEGORY_PN=$( qfile -C ${KERNEL_DIR}/Makefile | awk '{print $1}' )
PV=$( qfile -Cv ${KERNEL_DIR}/Makefile | awk '{print $1}' )
PV=${PV/$CATEGORY_PN-/}
@ -378,8 +427,10 @@ then
PV_OLD=${PV_OLD/${CATEGORY_PN_OLD}-/}
fi
# получить версия MAJOR.MINOR для условий в шаблонах
[[ $KVER =~ ^([[:digit:]]+\.[[:digit:]]+) ]] && PV2=${BASH_REMATCH[0]} || PV2=$PV
# определение имени шаблонов для пакета
if [[ $CATEGORY_PN =~ ^.*/(.*)-sources ]]
then
TEMPLATE_NAME_PREFIX=10-${BASH_REMATCH[1]}-
@ -389,9 +440,9 @@ fi
TEMPLATE_NAME_ARCH_PREFIX=${TEMPLATE_NAME_PREFIX}${NAME_ARCH}-
TEMPLATE_NAME="${LOCAL_TEMPLATES_DIR}/${TEMPLATE_NAME_ARCH_PREFIX}${PV2}"
##########################
# Preparing kernel configs
##########################
####################################
# Подготовка новой конфигурации ядра
####################################
if [[ -n $CREATE_NEW ]]
then
@ -405,11 +456,15 @@ else
eend
fi
######################################
# Подготовка базовой конфигурации ядра
######################################
BASE_CONFIG=$( ${MKTEMP} )
ebegin $"Preparing base kernel config"
if [[ -n $CREATE_BASE ]]
then
# будут использоваться только шаблоны оверлеев
TEMPLATES=$(variable_value main.cl_template_location)
create_kernel_config ${KERNEL_DIR} ${CATEGORY_PN} ${PV} ${TEMPLATES/,local,remote/} >$BASE_CONFIG
else
@ -417,20 +472,20 @@ else
fi
eend
###########################
# Execute nconfig
###########################
###########################################
# Изменение конфигурации ядра пользователем
###########################################
(cd $KERNEL_DIR; [[ -n ${KERNEL_OLD_DIR} ]] && KCONFIG_CONFIG=$(basename $NEW_CONFIG) make oldconfig;KCONFIG_CONFIG=$(basename $NEW_CONFIG) make -s nconfig) || true
###########################
# Creating template
# Создание шаблона
###########################
NEW_TEMPLATE=$( ${MKTEMP} )
create_template $CATEGORY_PN $PV2 $BASE_CONFIG $NEW_CONFIG >${NEW_TEMPLATE}
###########################
# Create backup
###########################
##################################
# Создание резервной копии шаблона
##################################
if ls ${LOCAL_TEMPLATES_DIR}/${TEMPLATE_NAME_ARCH_PREFIX}* &>/dev/null
then
for i in ${LOCAL_TEMPLATES_DIR}/${TEMPLATE_NAME_ARCH_PREFIX}*
@ -453,6 +508,7 @@ then
done
fi
# пропуск создания пустого шаблона
if [[ $(sed 1d $NEW_TEMPLATE | wc -l) -gt 0 ]]
then
mv $NEW_TEMPLATE $TEMPLATE_NAME
@ -465,15 +521,18 @@ else
einfo_tail $"Skipping empty template"
fi
rm -f $BASE_CONFIG
STARTTIME=$(date +%s)
#############
# Сборка ядра
#############
if [[ -n ${BUILD_KERNEL} ]]
then
cd $KERNEL_DIR
(source_makeconf && make clean && make $MAKEOPTS && make $MAKEOPTS modules_install && make $MAKEOPTS install)
# сборка initramfs
if [[ -n $DRACUT ]]
then
grep -q "CONFIG_BLK_DEV_INITRD=y" ${NEW_CONFIG} && ${DRACUT} -fH --kver $KVER /boot/initramfs-${KVER}.img
@ -483,8 +542,10 @@ then
grep -q "CONFIG_BLK_DEV_INITRD=y" ${NEW_CONFIG} && ${DRACUT} -f --kver $KVER /boot/initramfs-${KVER/-calculate/-SafeMode-calculate}.img
fi
fi
# выполнение шаблонов для настройки загрзуки системы
cl-setup-boot
# вывод времени компиляции ядра
DELTATIME=$(( $(date +%s) - $STARTTIME ))
HOUR=$(( $DELTATIME / 3600 ))
DELTATIME=$(( $DELTATIME % 3600 ))
@ -500,11 +561,11 @@ then
printf "%02d:%02d\n" ${MIN} ${SEC}
fi
# вывод информационных сообщений, отображённых до сборки ядра
for line in "${TAILOUT[@]}"
do
einfo $line
done
fi
einfo $"All done!"

Loading…
Cancel
Save