Возможна ли корректная работа команды make в Windows при наличии ./ в Makefile?
Работаю на Windows, терминал - PowerShell. Столкнулся, думаю, с понятной проблемой наличия разных слешей в путях Windows и Linux. Содержимое Makefile:
install:
./gradlew clean install
Команда ./gradlew clean install в терминале срабатывает, но make install - нет и терминал выдаёт понятную ошибку:
"." не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Если в Makefile поменять слеш на обратный, то команда make install начнёт срабатывать. Содержимое Makefile будет следующим:
install:
.\gradlew clean install
Основной вопрос: есть ли какой-то способ заставить команду make работать с первоначальным содержимым? Так как иначе Makefile выходит бесполезным для пользователя Windows. Его нужно будет переделывать под себя. Хочется найти способ сокращения временных затрат, чтобы файл подходил для работы и на UNIX-системах, и на Windows. Многочасовое гугление и использование git bash вместо PowerShell эффекта не дало.
Ответы (3 шт):
вместо того, что бы каждый раз писать
./gradlew
надо сделать так
GRADLEW=./gradlew
и теперь команды будут такие
install:
$(GRADLEW) clean install
теперь у Вас будет только одно место, где находится полное имя команды.
Теперь вторая половина квеста. Смотрите в этот ответ и пишите где то такое
ifeq ($(OS),Windows_NT)
GRADLEW=.\gradlew
else
GRADLEW=./gradlew
endif
если что, дописываете правильные условия под Ваши потребности. И готово.
Это известная проблема cmd, связанная с обратной совместимостью с MS-DOS, в которой пользователям разрешалось пропускать пробел между исполнимым файлом и первым аргументом если тот начинается со знака /.
И обход этой проблемы также известен, попробуйте вот так:
install:
"./gradlew" clean install
Такие проблемы возникают, если Make использует cmd в качестве шелла, вместо sh, который используется на линуксе. Видимо разные версии Make по-разному выбирают себе шелл.
Если поставить make или mingw32-make из MSYS2, то в их версии всегда используется sh, и линуксовые мейкфайлы должны работать из коробки.
Их make - точная имитация того, что на линуксе. В их mingw32-make функции работы с путями оперируют виндовыми путями, а не линуксовыми, поэтому какие-то сложные мейкфайлы могут не работать. Зато он тормозит меньше.