Возможна ли корректная работа команды 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 шт):

Автор решения: KoVadim

вместо того, что бы каждый раз писать

./gradlew

надо сделать так

GRADLEW=./gradlew

и теперь команды будут такие

install:
    $(GRADLEW) clean install

теперь у Вас будет только одно место, где находится полное имя команды.

Теперь вторая половина квеста. Смотрите в этот ответ и пишите где то такое

ifeq ($(OS),Windows_NT)
  GRADLEW=.\gradlew
else
  GRADLEW=./gradlew
endif

если что, дописываете правильные условия под Ваши потребности. И готово.

→ Ссылка
Автор решения: Pavel Mayorov

Это известная проблема cmd, связанная с обратной совместимостью с MS-DOS, в которой пользователям разрешалось пропускать пробел между исполнимым файлом и первым аргументом если тот начинается со знака /.

И обход этой проблемы также известен, попробуйте вот так:

install:
    "./gradlew" clean install
→ Ссылка
Автор решения: HolyBlackCat

Такие проблемы возникают, если Make использует cmd в качестве шелла, вместо sh, который используется на линуксе. Видимо разные версии Make по-разному выбирают себе шелл.

Если поставить make или mingw32-make из MSYS2, то в их версии всегда используется sh, и линуксовые мейкфайлы должны работать из коробки.

Их make - точная имитация того, что на линуксе. В их mingw32-make функции работы с путями оперируют виндовыми путями, а не линуксовыми, поэтому какие-то сложные мейкфайлы могут не работать. Зато он тормозит меньше.

→ Ссылка