mingw32-make + mklink... просто не ладит?

Не уверен, что кто-то еще заставил это работать, но у меня нет никаких проблем, даже с следующей простой строкой в ​​моем запуске Makefile mingw32-make:

mklink Mk Makefile

Следующие создали ссылку, но mingw32-make вырвал и выкинул ошибку 255 после этого:

$(shell cmd /c 'mklink Mk Makefile')

Ничто другое не является проблематичным, и у меня есть относительно сложный make-файл. Только mklink делает это. (Видимо у msys есть свои проблемы с ln поэтому идти по этому пути кажется бессмысленным.)

2 ответа

Решение

Следующее работает для меня (на Win7 Home Premium, в VirtualBox),при условии, что я вызываю его в оболочке, работающей с правами администратора:

$ cat makefile.tst
all:
        cmd /c "mklink mk makefile.tst"
        @echo "Success!"

$ make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!

$ rm mk

$ mingw32-make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!

Моя оболочка, в данном случае MSYS sh.exeвызывается через msys.bat от cmd.exe с повышением UAC до привилегий администратора. Это так, чтобы я мог показать, что mklink Команда работает как в собственном MSYS make.exe, И в mingw32-make.exe; (конечно, mingw32-make.exe Пример также работает прямо с повышенных cmd.exe сама оболочка).

Я подозреваю, что пытаясь использовать mklink непосредственно в make-файле, без cmd /c преамбула, может не работать, потому что mklink это cmd.exe встроенный, который GNU make может не знать, чтобы работать таким образом... он сообщает CreateProcess сбой, потому что указанный файл не может быть найден, когда я пытаюсь это сделать.

Ваше использование make's $(shell ...) Конструкция не будет работать, потому что это заставляет make вызывать команду в неправильной фазе операции... при синтаксическом анализе самого make-файла и построении его графа зависимостей, а не в качестве команды для запуска, когда вызывается содержащее правило, где оно теперь будет пытаться выполнить вывод из $(shell ...) команда как команда сама по себе; это явно не то что ты хочешь!

Просто чтобы прояснить позицию относительно собственного MSYS ln Команда: она работает так, как и можно ожидать, в пределах ограничений версий Windows, в которых она была изначально реализована. Особенно:

$ ln fileA fileB

создает жесткую ссылку "файл-файл" в файловых системах, таких как NTFS, которые поддерживают такие ссылки, и возвращается к созданию копии в файловых системах, таких как FAT, которые этого не делают. Также:

$ ln dirA dirB

терпит неудачу, как и должно быть; жестко связанные каталоги - это путь к катастрофе, и они недопустимы (так же, как они запрещены на платформах Unix). Тем не мение:

$ ln -s fileA refB

не будет создавать символическую ссылку (потому что ни одна версия Windows не поддерживала их в то время, когда разрабатывался MSYS, и никто не сделал шаг вперед для реализации этой возможности, поскольку они стали доступны... хотя их реализация по-прежнему кажется нестабильной, на Vista и Win7 в любом случае); скорее эта команда отступает от создания жесткой ссылки, если это возможно, или копирования файла в противном случае. Так же:

$ ln -s dirA refB

не будет создавать символическую ссылку на каталог, и в этом случае отступления не будет; это просто и безусловно проваливается! (Можно утверждать, что глубокая копия каталога может быть подходящим резервным действием, но это не реализовано; вместо этого lndir Команда предоставляется, чтобы облегчить это).

Другие вопросы по тегам