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
Команда предоставляется, чтобы облегчить это).