我找不到一种使用通用的makefile在GNU Make和Microsoft NMAKE中同时工作的方法,主要是因为它们对于"include"和/或"if"指令的语法不兼容。Microsoft NMAKE需要使用!前缀来表示指令。例如:!if、!include等……
然而,如果允许使用单独的宏,则可以绕过此问题。以下是我目前找到的使makefile兼容GNU Make和Microsoft NMAKE的最佳方法:
- Microsoft NMAKE读取TOOLS.ini文件以获取默认的宏。
- Microsoft套件将.obj用作目标文件扩展名。
- GNU Make读取在MAKEFILES环境变量中定义的文件。
- GNU套件使用.o作为目标文件扩展名。
- GNU make不需要为目标指定可执行文件扩展名.exe。
注意:以下内容已在Microsoft 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:$@
第三步:在您的工作目录下创建一个TOOLS.gcc文件,如下所示:(该文件与您的项目依赖项无关,除了可能的库)
(Note: 请注意,这里的“可能的库”指需要在此文件中指定的库,以保证代码能够正确编译运行。)
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:按照下面的方式编辑您的makefile(注意$(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 *~
步骤五:使用相同的 makefile,同时享受 GNU Make 和 Microsoft NMAKE 的便利。
$ nmake
$ make clean
$ nmake clean
$ make