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
Другие вопросы по тегам