LINUX.ORG.RU
ФорумTalks

Про конфиги

 ,


0

1

Делаю сейчас на баше небольшие утилиты для облегчения работы с portage и неожиданно понял, что мне не нравится концепция конфигурационного файла «всё-в-одном». В самом деле, открываем тот же /etc/make.conf и видим:

ACCEPT_KEYWORDS="~amd64"
CFLAGS="-march=corei7-avx -O2 -pipe -mfpmath=sse -msse4 -Wno-all"
CXXFLAGS="${CFLAGS}"
#CFLAGS="-march=core2 -mtune=generic -O2 -pipe -Wno-all"
#CXXFLAGS="-march=core2 -mtune=generic -O2 -pipe -Wno-all"
MAKEOPTS="-j8"
VIDEO_CARDS="nvidia"
INPUT_DEVICES="evdev"
CAMERAS="*"
LINGUAS="en ru"
ACCEPT_LICENSE="*"
DISTDIR=/sources
PORTDIR=/portage
#PORTAGE_TMPDIR=/media/home/tmp
PKGDIR=/packages
#PORTDIR_OVERLAY="/portage/local"
SYNC="rsync://mirror-kt.neolabs.kz/gentoo-portage"
GENTOO_MIRRORS="http://mirror-kt.neolabs.kz/gentoo/pub"
#SYNC="rsync://mirror.yandex.ru/gentoo-portage"
#GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles"
GRUB_PLATFORMS="multiboot pc"

#PORTAGE_NICENESS="19"
EMERGE_DEFAULT_OPTS="--quiet-build=n"
PORTAGE_BUNZIP2_COMMAND="lbunzip2 -n4"
FEATURES="parallel-fetch metadata-transfer"
#EXTRA_ECONF="-C --cache-file=/var/tmp/configure.cache"
source /var/lib/layman/make.conf


CHOST="x86_64-pc-linux-gnu"


USE="avx mmx mmxext sse sse2 sse3 ssse3 sse4 -3dnow -3dnowext X
-akonadi ass 
-cleartype clucene cuda -debug dirac directfb djvu
-egl -examples extras faac faad fbcon ffmpeg fluidsynth
-gallium -gcrypt -gles -gnome gphoto2 -gpm -gstreamer -gtk -gtk+ -gtk3 -handbook 
id3tag ieee1394 imagemagick -introspection jpeg2k
kvm lame lcdfilter -ldap -libnotify libv4l libv4l2 -llvm -lvm -lvm2 lzma lzo matroska midi
networkmanager
-perl plugins policykit -ppp private-headers quicktime raw
samba schroedinger semantic-desktop smp spice sqlite -static-libs symlink -systemd
-tcpd theora threads thumbnail
utils v4l vdpau vlc
webdav xattr -xinerama -zeroconf"


QEMU_USER_TARGETS="x86_64 i386"
QEMU_SOFTMMU_TARGETS="x86_64 i386"
CALLIGRA_FEATURES="krita sheets words"

видим мы энное количество строк с параметрами и значениями, а порой значения одного параметра не вмещается в одну строку (USE, например). На первый взгляд, это удобно - можно открыть один файл и посмотреть всё, что относится к сборке пакетов. Но, с другой стороны, если вам понадобится изменять какие-то параметры из скрипта, а уж тем более - из консоли, то вам придётся вертеть код для работы со строками. В моём случае мне придётся морочиться sed'ом, awk'ом, grep'ом и чёрт знает чем ещё.

А вот если бы каждый параметр лежал в отдельном файле, было бы всё намного проще. Например, нужно мне добавить флаг глобально из консоли - я делаю echo «$FLAG» >> /etc/make.conf/USE и дело в шляпе. То же самое и в скрипте - проще вписать вышеупомянутую команду, чем посредством грепов и седов вычленять из файла нужный параметр.

Наглядный пример - база установленных пакетов portage:

avalon test # ls -1 /var/db/pkg/kde-base/dolphin-4.9.1/
BUILD_TIME
CATEGORY
CBUILD
CFLAGS
CHOST
CONTENTS
COUNTER
CXXFLAGS
DEFINED_PHASES
DEPEND
DESCRIPTION
dolphin-4.9.1.ebuild
EAPI
environment.bz2
FEATURES
HOMEPAGE
INHERITED
IUSE
KEYWORDS
LDFLAGS
LICENSE
NEEDED
NEEDED.ELF.2
PDEPEND
PF
RDEPEND
repository
RESTRICT
SIZE
SLOT
USE
avalon test # cat /var/db/pkg/kde-base/dolphin-4.9.1/SIZE 
2839379
avalon test # cat /var/db/pkg/kde-base/dolphin-4.9.1/IUSE 
debug semantic-desktop thumbnail +handbook aqua

Каждый параметр - отдельный файл, в котором хранится значение только этого параметра. Это удобно не только для дилетантов, пишущих скрипты для своего удобства, но и просто для просмотра этих параметров. Например, можно открыть в файловом менеджере каталог с файлами-параметрами, включить предпросмотр и все параметры со значениями у вас перед глазами. Также намного проще отфильтровать файлы по нужному ключу, чем открывать конфиг в текстовом редакторе и искать там похожие ключи через поиск.

Всё вышеизложенное, конечно, не относится к профессиональным программистам, для которых создание/использование функций для работы с текстовыми файлами не представляет труда. Это так, взгляд со стороны обычного пользователя.



Последнее исправление: CYB3R (всего исправлений: 2)

Например, нужно мне добавить флаг глобально из консоли - я делаю echo «$FLAG» >> /etc/make.conf/USE и дело в шляпе.

facepalm.jpg

Освойте vim. Правда. Только сохранение, редактирование, выход из редактора и три зло-кнопки / # *, всё Это не больно, гарантирую.

yu-boot ★★★★
()

Вписываешь в make.conf строку source /etc/USE В файл /etc/USE пишешь USE=«$USE newuse». Эту конструкцию можно писать в несколько строк, тогда юзфлаги будут дополняться. С другими параметрами аналогично. Можно хоть построчно расчленить make.conf

MahMahoritos ★★★
()

что-то ты делаешь неправильно. Глобальных use флагов не должно быть столько, надо индивидуально к каждому пакету нужные добавлять в /etc/portage/package.use

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

Глобальных use флагов не должно быть столько

Кому не должно?

надо индивидуально к каждому пакету нужные добавлять в /etc/portage/package.use

Если флаг есть более чем у двух пакетов, я прописываю его глобально.

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

Я не понимаю, о чём ты.

help source

Это точно имеет отношение к теме?

Имеет отношение к этому:

А вот если бы каждый параметр лежал в отдельном файле

Но я не знаю, как и чем обрабатывается make.conf в gentoo.

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

Да, я уже понял, спасибо за подсказку.

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

Гентушные конфиги вроде все так работают. Но большая часть конфигов в /etc - куски установленного софта. Тут уж не гента виновата, а каждый отдельный разработчик.

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

Если флаг есть более чем у двух пакетов, я прописываю его глобально.

ну тогда ССЗБ, грызи кактус и нефиг создавать подобные жалобные темы :)

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

Тут уж не гента виновата, а каждый отдельный разработчик.

Вот и я о том же.

Kindly_Cat
() автор топика

Однажды я довёл эту идею до логического маразма:

$ ls -1
control.watchdog.editor
control.watchdog.template
control.watchdog.timeout
control.wdlogstat.lines
object.global.encoding
object.lor-logger.bell.enabled
object.lor-logger.bell.error
object.lor-logger.bell.online
object.lor-logger.encoding
object.lor-logger.logging.enabled
object.lor-logger.notify.enabled
object.lor-logger.notify.error
object.lor-logger.notify.online
object.lor-logger.pattern.lastlogin
object.lor-logger.pattern.lastoffset
object.lor-logger.timeslice
object.lor-logger.url.profile
object.lor-logger.useragent
object.vk-mailer.bell.enabled
object.vk-mailer.bell.error
object.vk-mailer.bell.mail
object.vk-mailer.cooker.active.database
object.vk-mailer.cooker.active.query
object.vk-mailer.cooker.chrome.database
object.vk-mailer.cooker.chrome.query
object.vk-mailer.cooker.firefox.database
object.vk-mailer.cooker.firefox.query
object.vk-mailer.encoding
object.vk-mailer.notify.enabled
object.vk-mailer.notify.error
object.vk-mailer.notify.mail
object.vk-mailer.pattern.offset
object.vk-mailer.pattern.string
object.vk-mailer.timeslice
object.vk-mailer.trigger.nomail
object.vk-mailer.url.mail
object.vk-mailer.useragent
object.vk-notifier.bell.enabled
object.vk-notifier.bell.error
object.vk-notifier.bell.offline
object.vk-notifier.bell.online
object.vk-notifier.cooker.active.database
object.vk-notifier.cooker.active.query
object.vk-notifier.cooker.chrome.database
object.vk-notifier.cooker.chrome.query
object.vk-notifier.cooker.firefox.database
object.vk-notifier.cooker.firefox.query
object.vk-notifier.encoding
object.vk-notifier.logging.enabled
object.vk-notifier.notify.enabled
object.vk-notifier.notify.error
object.vk-notifier.notify.offline
object.vk-notifier.notify.online
object.vk-notifier.stealth.pattern.offset
object.vk-notifier.stealth.trigger.offline
object.vk-notifier.stealth.trigger.online
object.vk-notifier.stealth.url
object.vk-notifier.timeslice
object.vk-notifier.trigger.offline
object.vk-notifier.trigger.online
object.vk-notifier.url.fave
object.vk-notifier.useragent

$ cat object.vk-notifier.useragent
Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6

$ cat object.global.encoding
UTF-8

Получился эдакий реестр.

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

Тут уж не гента виновата, а каждый отдельный разработчик.

Много где предусморена возможность включения файлов, особенно когда конфиг не может быть маленьким.

Homura_Akemi
()
Ответ на: комментарий от MahMahoritos

Нет, всё равно не то. В отдельный файл придётся прописывать ту же строку, что и в оригинальном файле. Например, если я хочу вынести параметр ACCEPT_KEYWORDS, мне в отдельном файле нужно прописать

ACCEPT_KEYWORDS="~amd64"

а было бы намного лучше, если бы в файле было просто

~amd64
Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

Это придётся как-то переписывать source чтобы он на место параметра подставлял имя файла, потом прицеплял знак = и кавычки. А в других конфигах формат другой. Мрак, короче.

Kindly_Cat
() автор топика

Тоска по реестру.

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

А кавычки таки придётся тащить в файл.

Kindly_Cat
() автор топика

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

fixed: Это удобно не только для дилетантов, пишущих скрипты для своего удобства, но и для дилетантов, просматривающих эти параметры.

Для Вас придумали XML

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

fixed: Это удобно не только для дилетантов, пишущих скрипты для своего удобства, но и для дилетантов, просматривающих эти параметры.

Враньё.

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

Как делал?

Примитивно - echoм, catом и т.д. внутри обёртки:

$ wdcontrol --def lol.ololo.kokoko           # touch
$ wdcontrol --set lol.ololo.kokoko BLABLABLA # echo "..." > ...
$ wdcontrol --get lol.ololo.kokoko           # cat ...
lol.ololo.kokoko: BLABLABLA
$ wdcontrol --undef lol.ololo.kokoko         # rm ...
Cancellor ★★★★☆
()
Ответ на: комментарий от MahMahoritos

Зря.

Нет.

Лучше в/etc/portage/package.keywords/ отдельно пакеты расписывать

Т.е. ты предлагаешь использовать стабильную ветку? Нафиг не надо.

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

У меня просто плохой опыт с ~arch (лет пять назад это было). После прописывания его в make.conf мне пришлось долго трахаться с разруливанием блокировок, так и не разобрался до конца. Теперь предпочитаю базовую систему иметь стабильную, кроме ядра и избранных утилит, а также всего пользовательского софта - кеды, огнелис, буревестник и т.д.

Может сейчас дерево и стабильно, но я некрофобией не страдаю, могу и подождать, пока ментейнеры не включат новые версии в стабильную ветку

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

У меня просто плохой опыт с ~arch (лет пять назад это было). После прописывания его в make.conf мне пришлось долго трахаться с разруливанием блокировок, так и не разобрался до конца

А, ну так ты мигрировал со стабильной на тестовую, а у меня тестовая с самого начала.

Kindly_Cat
() автор топика
Ответ на: комментарий от yu-boot

ТС про скрипты, парсящие конфиги, а не юзера

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

Некоторые велосипедные парсеры не умеют include же :)

А он и не обязателен, нужен язык запросов и преобразования xml, причём с настраиваемой программой он может быть никак не связан.

Begemoth ★★★★★
()

Ты только что доступно описал причину, из-за которой Arch ушёл от единого rc.conf. :)

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

Но я вообще про все конфиги говорил.

Сейчас поддержку инклудов делают во многих конфигах, т.к. это действительно удобно. :)

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