LINUX.ORG.RU

[gentoo-ONLY][repos] хочу странного


0

2

допустим, подключено несколько оверлеев
во всех есть некий пакет
как задать железно раз и навсегда «ставить пакет только из Х оверлея»?
т.е. даже на версии должно быть плевать
судя по докам портажа и ко, такого пока нет - он сам решает откуда и не даёт на это повлиять юзверю
да, есть

emerge -options пакет::реп
но это только при явной установке пакета, а при обновлениях, например, мира это всё перестанет иметь значение
запиливать в мир запись вида «пакет::реп» тоже бесполезно
[ root@desktop ] megabaks # grep nvidia-drivers /var/lib/portage/world
x11-drivers/nvidia-drivers::gentoo
[ root@desktop ] megabaks # emerge -pv nvidia-drivers

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   #] x11-drivers/nvidia-drivers-290.10  USE="acpi gtk -custom-cflags (-multilib) -rt" 0 kB [1]

Total: 1 package (1 reinstall), Size of downloads: 0 kB
Portage tree and overlays:
 [0] /usr/portage
 [1] /usr/local/portage/layman/stuff
[ root@desktop ] megabaks #
едем дальше:
переменные типа PORTDIR, PORTDIR_OVERLAY и что-то там про REPO доступны только для чтения - т.е. их поменять не вариант через bashrc&co
думаем дальше:
можно придумать обёртку, которая выдернет претендентов на установку из выхлопа «emerge -pv $*»
потом заменит некоторые пакеты на «пакет::реп», в соответствии с вело-конфигом
и только потом запустит emerge с уже «правильными» претендентами
но это вообще феерия какая-то!
как быть?
писать гневное письмо гентардам?

★★★★

Последнее исправление: megabaks (всего исправлений: 2)
Ответ на: комментарий от tiandrey

ты хоть понимаешь, что предложенное - грязный хак?
это как вместо пара строк в make.conf использовать PORTDIR_OVERLAY=«bla-bla-bla» emerge

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

Не вижу тут никакого хака. Конфигурационные файлы portage использованы по своему прямому назначению.

tiandrey ★★★★★
()
Ответ на: комментарий от megabaks

Нет, ну тебе шашечки, или ехать? Если не получается по-прямому, нужно делать хоть как то. Всяко лучше две строчки в конфигах поправить, чем свой велосипед городить.

А вообще реквестую возможность отрицания в package atoms и нормальную работу с ::оверлеями, можешь гентардам передать привет.

tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

tiandrey

нормальную работу с ::оверлеями

вот-вот
сначала замаскировать, потом размаскировать - это реально хак
в традициях портажа прямо было бы, допустим, package.repo с содержимым типа «категория/пакет реп»
твой вариант рабочий, да
но это таки хак
это как использовать /etc/portage/env/category/package со своими USE=«foo bar», вместо package.use, чтобы собрать пакет с желаемыми юзами

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

ты хоть понимаешь, что предложенное - грязный хак?

Ну нет желаемой фичи в портеже. Либо делать патч на портеж и долго и мучительно пропихивать его в апстрим, либо пользовать какой-то хак. Предложенный вариант не такой уж жуткий. Можно автоматизировать: сделать обёртку над emerge (bashrc?), которая будет читать package.repo и писать package.(un)mask/repo.

const86 ★★★★★
()
Ответ на: комментарий от const86

const86

которая будет читать package.repo и писать package.(un)mask/repo.

тоже думал над этим
но тут много нюансов - особенно если начинаются игры с маскировкой/размаскировкой версий пакета...
хотя можно, конечно
но я и так уже боюсь свой bashrc :3

#!/bin/bash

#COMPILERS
if [ -f ${ROOT}/etc/portage/package.compilers ]; then
  while read target ver; do
   if [ "${target}" = "${CATEGORY}/${PN}" ]; then
    MY_GCC="$(find /usr/$MACHTYPE/gcc-bin/ -name "$ver*")"
    export ROOTPATH="${MY_GCC}:${ROOTPATH}"
    export PATH="${MY_GCC}:${PATH}"
    export LIBRARY_PATH="$(gcc-config -L):${LIBRARY_PATH}"
   fi
  done < ${ROOT}/etc/portage/package.compilers
fi

#CFLAGS
if [ "$counttt" != "1" ]; then
  if [ -f /etc/portage/env.d/${CATEGORY}/${PN} ]; then
    for MY_ENV in ${PN} ${P} ${PF}; do
      if [ -f /etc/portage/env.d/${CATEGORY}/${MY_ENV} ]; then
      . /etc/portage/env.d/${CATEGORY}/${MY_ENV}
      export CXXFLAGS="${CFLAGS}"
      fi
    done
  fi
  export counttt="1"
fi

#PGO
PGO_DIR="/var/tmp/PGO"

PROFILE_GEN="${CFLAGS} -fprofile-generate -fvpt -fprofile-arcs -fprofile-dir=${PGO_DIR}/${CATEGORY}/${PF}"
PROFILE_USE="${CFLAGS} -fprofile-use -fprofile-correction -Wno-coverage-mismatch -Wno-error -fprofile-dir=${PGO_DIR}/${CATEGORY}/${PF}"

if [ -f /etc/portage/package.pgo ]; then
while read -a target; do
    if [ "${target}" = "${CATEGORY}/${PN}" ]; then
	  if [ -d "${PGO_DIR}/${CATEGORY}/${PF}" ]; then	  
		if [ "$count" != "1" ]; then 
		      if [ "$countt" != "1" ]; then export CFLAGS="${PROFILE_USE}" && export CXXFLAGS="${PROFILE_USE}" && export MAKEOPTS="-j1" && export countt="1"
		      rm_pgodir()
		      { 
		      rm -rf "${PGO_DIR}/${CATEGORY}/${PF}" 
		      }
		      fi
		fi
   else
      if [ "$count" != "1" ]; then 
	    if [ "$countt" != "1" ]; then export CFLAGS="${PROFILE_GEN}" && export CXXFLAGS="${PROFILE_GEN}" && export MAKEOPTS="-j1" && export count="1"
	    fi
      fi
fi
fi
done < /etc/portage/package.pgo
chmod -R ugo+rwx ${PGO_DIR}
fi


#ICC
if [ -f /etc/portage/package.icc ]; then
  [ -r ${ROOT}/etc/portage/package.icc ] || return 0
  while read -a target; do
    if [ "${target}" = "${CATEGORY}/${PN}" ]; then
    export OCC="icc"
    export OCXX="icpc"
    export CFLAGS="${ICCCFLAGS}"
    export CXXFLAGS="${ICCCXXFLAGS}"
    export MY_COMPILER="${OCC}"
    if [ -r ${ROOT}/etc/portage/package.icc-cflags ]; then
      while read target flags; do
	if [ "${target}" = "${CATEGORY}/${PN}" ]; then
	export CFLAGS="$flags"
	export CXXFLAGS="$flags"
	break
	fi
      done < ${ROOT}/etc/portage/package.icc-cflags
    fi
    export CC_FOR_BUILD="${OCC}"

    return 0
    fi
  done < ${ROOT}/etc/portage/package.icc
fi

#PATCHES
pre_src_configure() {
    src_autopatcher
}
src_autopatcher() {

PATCH_DIR="/var/portage/patches"
PATCH_OPTS="-g0 -E --no-backup-if-mismatch"
local count=0
if [ -d "${PATCH_DIR}/${CATEGORY}/${PN}" ]; then
     for PATCH in $(find "${PATCH_DIR}/${CATEGORY}/${PN}" "${PATCH_DIR}/${CATEGORY}/${PN}/${PVR}/" -maxdepth 1 -type f -name "*.patch"|sort)
     do
     einfo "Patching ${PATCH/*\//} ..."
       while [[ ${count} -lt 5 ]]; do
         if (patch -p${count} ${PATCH_OPTS} --dry-run -f < "${PATCH}") >/dev/null; then
         patch -p${count} ${PATCH_OPTS} < "${PATCH}" >/dev/null
         break
         fi
         (( count++ ))
       done
	  if [[ ${count} -ge 5 ]] ; then
	  eerror "Failed Patch: ${PATCH/*\//} !"
	  die "Failed Patch: ${PATCH/*\//} !"
	  fi
     done
fi
}

#STUFF
post_src_configure() {
echo -e "\n \n \n \n \n\033[0;0;1;33mCFLAGS=\033[0;0;1;32m\"$(echo ${CFLAGS})\"\033[0m \n"
echo -e "\n\033[0;0;1;33mCXXFLAGS=\033[0;0;1;32m\"$(echo ${CXXFLAGS})\"\033[0m \n \n \n \n \n"
}

post_pkg_postinst(){
if [ echo $OCC != "icc" ];then
gcc --version | head -n1 > /var/db/pkg/${CATEGORY}/${PN}-${PVR}/GCC_VERSION
fi
rm_pgodir &>/dev/null
}
хотя тут и хлама много :3

megabaks ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.