Makefile, который различает Windows и Unix-подобные системы - PullRequest
42 голосов
/ 30 октября 2010

Я хотел бы иметь один и тот же 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 и т. Д.)

Похожий вопрос: OS обнаруживает make-файл ,но я не нашел ответа здесь.

Ответы [ 5 ]

43 голосов
/ 22 декабря 2010

Я решил это, ища переменную env, которая будет установлена ​​только в windows.

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$(/)*

если вам больше нравится этот формат.

38 голосов
/ 16 июня 2011

Уловка SystemRoot у меня не работала в Windows XP, но она работала:

ifeq ($(OS),Windows_NT)
    #Windows stuff
    ...
else
    #Linux stuff
    ....
endif
8 голосов
/ 30 октября 2010

Возможно, вам следует использовать переменную $ (RM) для удаления некоторых файлов.

3 голосов
/ 30 октября 2010

Я хотел бы иметь один и тот же Makefile для сборки на Linux и Windows.

Может быть, вам понравится CMake

1 голос
/ 25 августа 2018

Проверка 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...