On Sun, Sep 03, 2006 at 08:36:15AM +0400, Alexey Tourbin wrote: > Я вижу два подхода, которые в большей или меньшей степени способствуют, > с одной стороны, более агрессивной оптимизации, с другой -- избавлению > от нечестного паттерна. > > 1) Низкоуровневый подход (в меньшей степени). Добавить и использовать > специальную опцию в packageof. Для каждого заданного файла, помимо > того, чтобы пробивать его по rpmdb, нужно специальным образом > обрабатывать симлинки. А именно, для каждого симлинка делать realpath() > и полученный путь ещё раз пробивать по rpmdb. С другой стороны, вклиниваться в packageof некорректно в том отношении, что правила /etc/buildreqs/files/ignore.d к этому моменту уже отработали, а раскрытие симлинков может дать новый повод для применения этих правил. Таким образом, проблема декомпозиции оказывается сложнее -- вклинивать обработку симлинков нужно раньше. Вот "модельный" патч, который показывает, что, может быть, в действительности стоит сделать. --- /usr/bin/filereq- 2006-09-03 00:03:03 +0000 +++ /usr/bin/filereq 2006-09-03 05:58:00 +0000 @@ -67,3 +67,9 @@ while [ -f "$LOCKFILE" ]; do usleep 100000 done + +while read -r file; do + readlink -ms "$file" || echo "$file" + readlink -es "$file" ||: +done <"$unsorted" >"$unsorted$$" +mv "$unsorted$$" "$unsorted" Здесь решаются две разные проблемы. 1) Предварительная каноникализация путей. Это нужно для того, чтобы правила /etc/buildreqs/files/ignore.d работали всегда, а не от случая к случаю (т.е. не зависели от путей типа /usr/bin/../lib/... -- такие пути делает gcc! -- и т.п.). 2) Окончательная каноникализация путей. Это нужно для того, о чем я писал в процитированном письме: чтобы требование на симлинки дополнительно переходило в требование на файлы, на которые симлинки смотрят. Проблема с этим патчем одна -- readlink'и в цикле будут работать долго. Приходится ждать заметное время даже на мощной машине (порядка двух секунд при линковке с -lSDL). Кстати, оптимизация {esound,libSDL-devel} с этим патчем работает агрессивно. К сожалению, readlink не работает с xargs (а xargs в свою очередь всегда делает word splitting, что критически плохо для имен файлов). Также и awk не умеет делать ничего вроде readlink или realpath. Остается только перл. :)