Argument list too long

Как собирать monodevelop
План
Описание рецепта distdir
На что заменять

замена uniq -c на if != prev_line, deduplication in guile
как устроен make dist в mono (не в monodevelop)
Если выполнить make dist, то может быть выдана ошибка:
make[5]: Entering directory '/var/tmp/tarballs/dotnet/dev-util/monodevelop/main/src/core/MonoDevelop.Ide'
make[5]: execvp: /bin/sh: Argument list too long
Makefile:312: recipe for target 'distdir' failed
make[5]: *** [distdir] Error 127

Немного быстрее можно воспроизвести собирая только часть исходного кода
cd /var/tmp/tarballs/dotnet/dev-util/monodevelop/main/src/core/MonoDevelop.Ide
make distdir

Куда зарепорчена

В багтрекере дистрибутива: пока нет
в багтрекере monodevelop: https://bugzilla.xamarin.com/show_bug.cgi?id=39191
в багтрекере automake: искал, не нашел

причина ошибки

http://stackoverflow.com/questions/11475221/why-do-i-get-bin-sh-argument-list-too-long-when-passing-quoted-arguments

$ find /usr -iname "binfmts.h" | xargs grep MAX_ARG_STRLEN
/usr/src/linux-4.3.0-sabayon/include/uapi/linux/binfmts.h:#define MAX_ARG_STRLEN (PAGE_SIZE * 32)
#define PAGE_SIZE 4096
4096 * 32 = 131072

В фрагменте
distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$^'; \
          dist_files=`for file in $$list; do echo $$file; done | \
        ...

длина DISTFILES = 1363753, превышает лимит даже после дедупликации

variable DISTFILES actually contain dupicated icon names.
it is possible to use $^ for deduplication of icon names as in
http://stackoverflow.com/a/33312941/6017919

Где исходники?

distdir: в файле Makefile.in
http://stackoverflow.com/questions/37973186/how-autotools-generate-distdir-rule
во время запуска automake копируется из файла
http://git.savannah.gnu.org/cgit/automake.git/tree/lib/am/distdir.am#n73
Строчки с 73 по 290

Как генерировать файлы

внести изменения в Makefile.am
зайти в поддиректорию main, потому что именно там лежит configure.in для Monodevelop
выполнить automake, чтобы сгенерировать Makefile.in-ы
выполнить configure, чтобы сгенерировать Makefile-ы
проверить сборку make dist

Как обойти ограничение ядра на длину команды?

why is this parsed via a 'for file in $list ; do echo $file ; done' to pipe the results to sed? is it just because xargs isn't posix?
hm, xargs is in posix as of 2004 ..

Как заменить неработающий код

Можно сделать патч только для dev-lang/monodevelop
можно (я проверял) локально в файле
https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Ide/Makefile.am
скопировать код из шаблона, затем поменять на foreach-и

Ещё можно сделать ebuild для automake с патчем для сборки любых пакетов использующих automake
это позволит протестировать патч локально при сборке многих пакетов (потому что autotools используются много где)

можно кстати поискать готовые примеры на github, вдруг кто-нибудь такое уже делал?
во всех файлах makefile.am найти строку distdir и вывести URL где смотреть

На что заменять

$(sort list of words) - сортировка в gmake:
https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#Text-Functions

Что писать внутрь новой версии правила?

Патч накатить можно, и это было проверено:
патч для Makefile.am

А вот что писать внутрь - это до сих пор не продумано...

Как проверять

Допустим, что был получен некий комплект архивов. Чтобы проверить, можно составить список файлов в архиве
и сравнить со списокм файлов в оригинальном архиве, предварительно отсортировав списки (аналогично тому, как я это провёл такое сравнение для smuxi)

Как отправить патч

Нуу, тщательно всё проверив, надо отправить патч на специальный email

upstream guide for reporting bugs
https://www.gnu.org/software/automake/manual/html_node/Reporting-Bugs.html
bugtracker
http://debbugs.gnu.org/automake ( redirects to http://debbugs.gnu.org/cgi/pkgreport.cgi?pkg=automake )

Сколько времени займёт фикс?

Для того, чтобы это определить, нужно составить список возможных активностей (PERT), найти критический путь (чтобы отбросить второстепенные задачи)
оценить время необходимое для выполнения задач
выписать необходимые для фикса скиллы

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

План работ по фиксу баги в automake