Я не могу найти способ использовать общий make-файл для работы как с GNU make, так и с MS nmake, главным образом потому, что они имеют несовместимый синтаксис для директив include и / или if. MS nmake требует использования! префикс для директив. например! if,! include и т.д ...
Однако, если разрешено иметь отдельные макросы, его можно обмануть. Здесь я представляю лучший способ сделать совместимый make-файл как для GNU make, так и для MS nmake наилучшим образом из следующих:
- MS nmake читает файл TOOLS.ini для макросов по умолчанию.
- Пакет MS использует .obj в качестве расширения файла объекта.
- GNU make читает файлы, определенные в переменной среды MAKEFILES.
- Пакет GNU использует .o как расширение файла объекта.
- GNU make не обязана давать исполняемое расширение .exe для цели.
Примечание: следующее было протестировано с использованием MS Visual Studio 2015 и MINGW32.
Шаг 1: создайте следующий пакетный файл DOS и запускайте его всякий раз, когда вызывается приглашение CMD.
set MAKEFILES=TOOLS.gcc
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
Шаг 2. Создайте файл TOOLS.ini в своем рабочем каталоге, как показано ниже: (этот файл не зависит от зависимостей вашего проекта, кроме, возможно, библиотек)
[NMAKE]
LDLIBS =
CDEBUG = /Zi
LDEBUG = /debug:full
WDFLAGS = /wd4996 /wd4774 /wd4018 /wd4710 /wd4820
CFLAGS = /nologo $(CDEBUG) /EHsc /Wall $(WDFLAGS)
LDFLAGS = /nologo $(LDEBUG)
RM = del /F /Q
LINK = "$(VCINSTALLDIR)bin\link" $(LDFLAGS)
CP = copy
CC = cl
CPP = $(CC) /P
X = .exe
O = .obj
.obj.exe:
$(LINK) $** $(LOADLIBES) $(LDLIBS) /Out:$@
Шаг 3. Создайте TOOLS.gcc в вашем рабочем каталоге, как показано ниже: (этот файл не зависит от зависимостей вашего проекта, кроме, возможно, библиотек)
LD_LIBS =
LDLIBS =
CDEBUG = -g
LDEBUG = -g
CFLAGS = $(CDEBUG)
LDFLAGS = $(LDEBUG)
RM = rm -f
LINK = gcc $(LDFLAGS)
CP = cp
CC = gcc
CPP = $(CC) -E
X =
O = .o
%: %.o
$(LINK) $^ $(LOADLIBES) $(LDLIBS) -o $@
Шаг 4: Отредактируйте ваш make-файл, как показано ниже (обратите внимание, $ (X) и $ (O)), где указаны только зависимости.
SHELL = /usr/bin/sh
app: app1$(X) app2$(X)
app1$(X): app1$(O)
app2$(X): app2$(O)
clean:
$(RM) *.exe *.o *.obj *.ilk *.pdb *.tmp *.i *~
Шаг 5. Наслаждайтесь GNU make и MS nmake с одним и тем же make-файлом
$ nmake
$ make clean
$ nmake clean
$ make