Подтвердить что ты не робот

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, но я не нашел здесь ответа.

4b9b3361

Ответ 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