ar в оболочке MSYS2 получает усеченные пути при вызове из Makefile?

Я использую git-bash.exe из установки PortableGit с переменными среды из другого MinGW. Так что я:

WORKGROUP+user@AD-X MINGW32 /z/user/Downloads
$ which ar
//WORKGROUP.EX.COM/Users/user/Downloads/mingw-w64/i686-4.9.3-posix-dwarf-rt_v4-rev1/mingw32/bin/ar

WORKGROUP+user@AD-X MINGW32 /z/user/Downloads
$ gcc --version | head -1
GNU ar (GNU Binutils) 2.25

Теперь есть библиотека, которую я создаю, и в конце шаг ссылки завершается ошибкой при вызове команды ar, которая выглядит примерно так:

ar -cr "Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/libsomeLibraryABCDebug.a" \
Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/obj/Debug/libs/someLibraryDEFGHI/test/someObject.o \
[...]

... и в нем перечислено множество объектов - длина командной строки составляет 10000 символов, что все еще меньше getconf ARG_MAX из 32000 в оболочке MSYS2 PortableGit (git-bash.exe). Однако ошибка, которую я получаю, это No such file or directory:

\\WORKGROUP.EX.COM\Users\user\Downloads\mingw-w64\i686-4.9.3-posix-dwarf-rt_v4-rev1\mingw32\bin\ar.exe: Z:/user/Downloads/MyProjectNameABCDE/someLibraryABC/libs/someLibraryDEFGHI/lib/mingw/obj/Debug/libs/some: No such file or directory

... и указанный путь явно является усеченной версией пути, по которому находятся объектные файлы. Что еще более странно, когда я копирую полную командную строку ar, напечатанную процессом make, и вставляю ее обратно в тот же терминал, она завершается без ошибок?

Кто-нибудь знает, почему это происходит, и что я могу сделать, чтобы убедиться, что ar завершается при вызове из Makefile?


person sdaau    schedule 28.05.2016    source источник


Ответы (1)


Итак, сначала я нашел в Makefile, где запускается команда ar, и добавил к ней переключатель -v (то есть -crv) для подробностей.

Я мог обнаружить, что большая часть командной строки читается и добавляются объекты, пока не дойдет примерно до 8192 байт командной строки, после чего она усекается и происходит сбой. Это, видимо, известная проблема:

... хотя мне не совсем понятно, почему он должен появляться в процессе make, который уже запущен в git-bash.exe, то есть в оболочке MSYS2?!

В любом случае, обходной путь/исправление, которое я использовал, заключается в использовании параметра файла make, так как простое выполнение "@echo $CMD > arscript.sh" из Makefile снова сохранит в файл только усеченную командную строку размером 8 КБ; поэтому вместо исходного вызова:

    @$(AR) ${FLAGS_FOR_AR} "$@" $(FILES_FOR_AR)

... мы сохраняем эту строку в файл, а затем вызываем bash, чтобы интерпретировать ее как скрипт; то есть:

    $(file >arscript.sh,@$(AR) ${FLAGS_FOR_AR} "$@" $(FILES_FOR_AR))
    bash -x arscript.sh

... и это, наконец, сработало для меня.

person sdaau    schedule 29.05.2016