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)
Ответ на: комментарий от genesis_error
[ root@desktop ] megabaks # echo 'PORTDIR_OVERLAY="${PORTDIR}"' >> /etc/portage/env/x11-drivers/nvidia-drivers
[ root@desktop ] megabaks # cat /etc/portage/env/x11-drivers/nvidia-drivers
PORTDIR_OVERLAY="${PORTDIR}"
[ 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 #
megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

Я думаю написать вело-скрипт, который автоматически маскирует пакеты по оверлеям проще, чем обертку над emerge которую ты предложил. Тем более что замаскировать можно тупо по всем, без относительно того ести ли там этот пакет или нет.

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

так, а теперь расскажи что именно ты там хочешь нарисовать и где
если ты про /path/to/repo/profile/package.mask, то это фэйл
ибо синк

megabaks ★★★★
() автор топика

В package.keywords добавить:

app-category/app-name -*
app-category/app-name::my-mega-overlay x86 amd64 whateveryouneed
Проверил у себя, вроде работает.

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

не работает

[ root@desktop ] megabaks # echo "x11-drivers/nvidia-drivers::gentoo **" >> /etc/portage/package.keywords 
[ 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 #

megabaks ★★★★
() автор топика

Насколько я помню, когда я интересовался наличием(точнее, отсутствием) этой функции в Portage, мне указали на Paludis.

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

Lighting

мне указали на Paludis.

это как при выборе инструмента для гвоздя посоветовать отвёртку

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

Я ничего не понимаю. Работает, но как-то выборочно.

19:07:05 tia-laptop /etc/portage
[ root ] # tail -n 2 /etc/portage/package.keywords 
media-sound/ncmpcpp -*
media-sound/ncmpcpp::gentoo amd64
19:07:06 tia-laptop /etc/portage
[ root ] # emerge ncmpcpp
<пошло компилиться>
Для оверлеев, отличных от gentoo, не работает. И с nvidia-drivers почему-то не работает. А для ncmpcpp работает.

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

В этом вся суть любого линукс-коммьюнити. Ну, всё равно в Portage подобного нет.

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

Это развитие предыдущей мысли. Объясни-ка, почему это костыль, ведь я явно настроил portage так, как ты и хотел - запретить всё, кроме конкретного оверлея. No bicycles.

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

1. нужно править 2 файла
2. не очевидно
3. надо камменты запиливать, дабы не забыть что и где
крайне не удобно

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

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

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

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

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

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

tiandrey

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

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

megabaks ★★★★
() автор топика

Будь мужиком, сделай вдоль сам запили фичреквест.

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

Да он странное спрашивает, было бы что-нибудь обыденное, тогда бы я отформатировал /

aptyp ★★★★
()
Ответ на: комментарий от 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 ★★★★
() автор топика

хм...если в package.{un}mask только одно вхождение пакета, то работает и тупое

echo "${CATEGORY}/${PN}::${REPO}" >> /etc/portage/package.mask
дальше думаю о красивом решении...

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

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

vendor501
()

есть забавное решение немного другой проблемы, но и для этой подойдёт:

берутся репозитории и отдельно синхронизируются, но в список оперлеев добавлен только свой, в свой же оверлей добавляются только линки на нужные пакеты из нужного оверлея итого: поиск у emerge идёт только по добавленым явно пакетам, так же как и обновления индекса у eix, твоя проблема тоже решается.

за подробностями можешь крига с gentoo@c.g.r спросить.

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

ну это сильно криво
в оверлеях часто обновки раньше появляются, чем в дереве
даже если не ради этого пакета подключал, при предложенном подходе, печенюшек не покушать
да ещё и гордить велик надо бы - дабы не руками пакеты дёргать
короче не годится

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

не, ты не совсем понял /var/lib/layman/<overlay>/<category>/<package> -> your/overlay/<category>/<package> итого, при обновлении layman обновляются все репозитории и те пакеты, которые ты себе добавил, плюс если появляются новые пакеты, то у тебя они тоже появляются автоматом.

Хотя на silverbullet такое решение не претендует.

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