Makefile, который отличается от Windows и Unix-подобных систем
Я хотел бы иметь тот же Makefile для создания на Linux и Windows. Я использую GNU make по умолчанию для Linux и mingw32-make (также GNU make) в Windows.
Я хочу, чтобы Makefile обнаружил, работает ли он в Windows или Linux.
Например, команда make clean
в Windows выглядит так:
clean:
del $(DESTDIR_TARGET)
Но в Linux:
clean:
rm $(DESTDIR_TARGET)
Также я хотел бы использовать другой разделитель каталогов в Windows (\
) и Linux (/
).
Можно определить операционную систему Windows в Makefile?
PS: Я не хочу подражать Linux в Windows (cygwin и т.д.)
Есть аналогичный вопрос: ОС, определяющий makefile, но я не нашел здесь ответа.
Ответы
Ответ 1
Я решил это, ища переменную env, которая будет установлена только в окнах.
ifdef SYSTEMROOT
RM = del /Q
FixPath = $(subst /,\,$1)
else
ifeq ($(shell uname), Linux)
RM = rm -f
FixPath = $1
endif
endif
clean:
$(RM) $(call FixPath,objs/*)
Поскольку% SystemRoot% - это путь к каталогу Windows, должен быть установлен на всех компьютерах Windows, но не в Linux.
Затем блоки устанавливают переменные для разных программ, а также функцию для преобразования косой черты в обратную косую черту.
Вам нужно использовать $(вызов FixPath, path) при вызове внешней команды (внутренние команды работают нормально). Вы также можете использовать что-то вроде:
/ := /
а затем
objs$(/)*
если вам нравится этот формат лучше.
Ответ 2
Тренер SystemRoot не работал у меня в Windows XP, но это произошло:
ifeq ($(OS),Windows_NT)
#Windows stuff
...
else
#Linux stuff
....
endif
Ответ 3
Вероятно, вы должны использовать переменную $(RM) для удаления некоторых файлов.
Ответ 4
Я хотел бы иметь тот же Makefile для создания на Linux и Windows.
Возможно, вам понравится CMake