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 и т. Д.)
Есть похожий вопрос: ОС обнаруживает make-файл, но я не нашел здесь ответа.
5 ответов
Я решил это, ища переменную env, которая будет установлена только на окнах.
ifdef OS
RM = del /Q
FixPath = $(subst /,\,$1)
else
ifeq ($(shell uname), Linux)
RM = rm -f
FixPath = $1
endif
endif
clean:
$(RM) $(call FixPath,objs/*)
Поскольку%OS% - это тип окон, он должен быть установлен на всех компьютерах с Windows, но не в Linux.
Затем блоки устанавливают переменные для различных программ, а также функцию для преобразования прямой косой черты в обратную косую черту.
Вам нужно использовать $(вызывать FixPath, путь) при вызове внешней команды (внутренние команды работают нормально). Вы также можете использовать что-то вроде:
/ := /
а потом
objs$(/)*
если вам нравится этот формат лучше.
Уловка SystemRoot не работала для меня в Windows XP, но это сработало:
ifeq ($(OS),Windows_NT)
#Windows stuff
...
else
#Linux stuff
....
endif
Вам, вероятно, следует использовать переменную $(RM) для удаления некоторых файлов.
Я хотел бы иметь один и тот же Makefile для сборки на Linux и Windows.
Может быть, вам понравится CMake
Проверка WINDIR или COMSPEC чувствительна к регистру. Вместо этого я придумал следующее решение, надеюсь, что когда-нибудь оно кому-нибудь поможет:
# detect if running under unix by finding 'rm' in $PATH :
ifeq ($(wildcard $(addsuffix /rm,$(subst :, ,$(PATH)))),)
WINMODE=1
else
WINMODE=0
endif
ifeq ($(WINMODE),1)
# native windows setup :
UNLINK = del $(subst /,\,$(1))
CAT = type $(subst /,\,$(1))
else
# cross-compile setup :
UNLINK = $(RM) $(1)
CAT = cat $(1)
endif