2010-10-30 3 views
38

Я хотел бы иметь тот же Makefile для создания на Linux и Windows. Я использую по умолчанию GNU make на Linux и mingw32-make (также GNU make) на Windows.Makefile, который отличается от Windows и Unix-подобных систем.

Я хочу, чтобы Makefile обнаружил, работает ли он в Windows или Linux.


Например make clean команда на Windows, выглядит следующим образом:

clean: 
    del $(DESTDIR_TARGET) 

Но на Linux:

clean: 
    rm $(DESTDIR_TARGET) 

Кроме того, я хотел бы использовать другой разделитель каталогов на Windows (\) и Linux (/).


можно обнаружить операционную систему Windows, в Makefile?

PS: Я не хочу, чтобы эмулировать Linux на Windows (в Cygwin и т.д.)

Существует похож вопрос: OS detecting makefile, но я не нашел ответ здесь.

+4

Windows, может работать как с косой черты «/» и «\» эквивалентны. – Ency

+0

Если это для существенного проекта, мне интересно, стоит ли автоудару обрабатывать некоторые вещи переносимости? – Cascabel

+0

@Jefromi: autotools принимает базовый набор инструментов UNIX (sh, m4, sed, rm, ...). @tomp: Могу также установить их на окна (от MSYS или GnuWin) и потратить свои усилия на более сложные проблемы с переносимостью. – ephemient

ответ

38

Я решил эту проблему путем поиска переменной окр, который будет установлен только на окнах.

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, но не на Linux.

Блоки затем настраивают переменные для разных программ, а также функцию преобразования косых черт в обратную косую черту.

Вам нужно использовать $ (вызов FixPath, path) при вызове внешней команды (внутренние команды работают нормально). Кроме того, можно использовать что-то вроде:

/ :=/

, а затем

objs$(/)* 

, если Вам нравится этот формат лучше.

+2

Спасибо. Я переключаюсь между MinGW на Windows и GCC на Linux, это отлично работает. – Imbue

+1

В mingw это должно быть 'SYSTEMROOT' в верхнем регистре – SystemParadox

+1

Вы также можете проверить ComSpec, который определен только на Windows – kebs

7

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

3

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

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

36

системный_корневой_каталог трюк не работает для меня на Windows XP, но это сделал:

ifeq ($(OS),Windows_NT) 
    #Windows stuff 
    ... 
else 
    #Linux stuff 
    .... 
endif 
Смежные вопросы