Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs
[emacs.git] / nt / nmake.defs
blob5424b9d9125f1493f3037cdc6252b0ddd9b5ac2d
1 #  -*- Makefile -*- definition file for building GNU Emacs on Windows NT.\r
2 # Copyright (C) 2000-2015 Free Software Foundation, Inc.\r
3 \r
4 # This file is part of GNU Emacs.\r
5 \r
6 # GNU Emacs is free software: you can redistribute it and/or modify\r
7 # it under the terms of the GNU General Public License as published by\r
8 # the Free Software Foundation, either version 3 of the License, or\r
9 # (at your option) any later version.\r
11 # GNU Emacs is distributed in the hope that it will be useful,\r
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 # GNU General Public License for more details.\r
16 # You should have received a copy of the GNU General Public License\r
17 # along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.\r
20 # Ensure 'all' is the default target\r
21 all:\r
23 THE_SHELL = $(COMSPEC)\r
24 SHELLTYPE=CMD\r
25 SWITCHCHAR=/\r
27 MAKETYPE=nmake\r
29 CURDIR          = $(MAKEDIR:\=/)\r
30 THISDIR         = $(MAKEDIR)\r
31 DIRNAME         =\r
33 ALL_DEPS        = $**\r
35 SUBSYSTEM_WINDOWS=-subsystem:windows\r
36 SUBSYSTEM_CONSOLE=-subsystem:console\r
38 # INSTALL_DIR is the directory into which emacs will be installed.\r
39 #\r
40 !ifndef INSTALL_DIR\r
41 INSTALL_DIR     = $(CURDIR)/..\r
42 !endif\r
44 # Ensure EMACSLOADPATH is defined in the environment.\r
45 #\r
46 !if [set EMACSLOADPATH=foo]\r
47 !endif\r
49 # Allow detection of builds with MSVC 5 or later, so we can\r
50 # speed up compiles (see rule at end).\r
51 #\r
52 _NMAKE_VER_5=162\r
53 _NMAKE_VER_4=0\r
55 !IFNDEF _NMAKE_VER\r
56 _NMAKE_VER=$(_NMAKE_VER_4)\r
57 !ENDIF\r
59 # Check that the INCLUDE and LIB environment variables are set.\r
60 #\r
61 !ifndef INCLUDE\r
62 !error The INCLUDE environment variable needs to be set.\r
63 !endif\r
64 !ifndef LIB\r
65 !error The LIB environment variable needs to be set.\r
66 !endif\r
68 # Determine the architecture we're running on.\r
69 # Define ARCH for our purposes;\r
70 # Define CPU for use by ntwin32.mak;\r
71 # Define CONFIG_H to the appropriate config.h for the system;\r
72 #\r
73 !ifdef PROCESSOR_ARCHITECTURE\r
74 # We're on Windows NT\r
75 CPU             = $(PROCESSOR_ARCHITECTURE)\r
76 CONFIG_H        = config.nt\r
77 OS_TYPE         = windowsnt\r
78 ! if "$(PROCESSOR_ARCHITECTURE)" == "x86"\r
79 ARCH            = i386\r
80 CPU             = i386\r
81 ! else\r
82 !  if "$(PROCESSOR_ARCHITECTURE)" == "MIPS"\r
83 ARCH            = mips\r
84 !  else\r
85 !   if "$(PROCESSOR_ARCHITECTURE)" == "ALPHA"\r
86 ARCH            = alpha\r
87 !   else\r
88 !    if "$(PROCESSOR_ARCHITECTURE)" == "PPC"\r
89 ARCH            = ppc\r
90 !    else\r
91 !     if "$(PROCESSOR_ARCHITECTURE)" == "AMD64"\r
92 ARCH            = AMD64\r
93 !     else\r
94 !      error Unknown architecture type "$(PROCESSOR_ARCHITECTURE)"\r
95 !     endif\r
96 !    endif\r
97 !   endif\r
98 !  endif\r
99 ! endif\r
100 !else\r
101 # We're on Windows 95\r
102 ARCH            = i386\r
103 CPU             = i386\r
104 CONFIG_H        = config.nt\r
105 OS_TYPE         = windows95\r
106 !endif\r
108 AR              = lib\r
109 AR_OUT          = -out:\r
110 CC              = cl\r
111 CC_OUT          = -Fo\r
112 LINK            = link\r
113 LINK_OUT        = -out:\r
114 RC              = rc $(ARCH_RCFLAGS)\r
115 RC_OUT          = -Fo\r
116 RC_INCLUDE      = -i\r
118 USE_CRT_DLL     = 1\r
120 !if $(USE_CRT_DLL)\r
121 libc            = msvcrt$(D).lib\r
122 EMACS_EXTRA_C_FLAGS= -D_DLL -D_MT -DUSE_CRT_DLL=1\r
123 !else\r
124 libc            = libcmt$(D).lib\r
125 EMACS_EXTRA_C_FLAGS= -D_MT\r
126 !endif\r
127 baselibs        =\r
128 O               = obj\r
129 A               = lib\r
131 BASE_LIBS       = $(libc) $(baselibs) oldnames.lib\r
133 ADVAPI32        = advapi32.lib\r
134 COMCTL32        = comctl32.lib\r
135 COMDLG32        = comdlg32.lib\r
136 GDI32           = gdi32.lib\r
137 MPR             = mpr.lib\r
138 SHELL32         = shell32.lib\r
139 USER32          = user32.lib\r
140 WSOCK32         = wsock32.lib\r
141 WINMM           = winmm.lib\r
142 WINSPOOL        = winspool.lib\r
143 OLE32           = ole32.lib\r
144 UNISCRIBE       = usp10.lib\r
145 UUID            = uuid.lib\r
147 !ifdef NOOPT\r
148 DEBUG_CFLAGS    = -DEMACSDEBUG\r
149 !else\r
150 DEBUG_CFLAGS    =\r
151 !endif\r
153 MWINDOWS        = -subsystem:windows -entry:mainCRTStartup\r
155 CFLAGS          = -I. $(ARCH_CFLAGS) -D_CRT_SECURE_NO_WARNINGS \\r
156                   $(DEBUG_CFLAGS) $(USER_CFLAGS) $(LOCAL_FLAGS)\r
157 ESC_CFLAGS      = -I. $(ARCH_CFLAGS) -D_CRT_SECURE_NO_WARNINGS \\r
158                   $(DEBUG_CFLAGS) $(ESC_USER_CFLAGS) $(LOCAL_FLAGS)\r
160 #SYS_LDFLAGS    = -nologo -release -incremental:no -version:3.10 -swaprun:cd -swaprun:net setargv.obj\r
161 SYS_LDFLAGS     = -nologo -manifest -dynamicbase:no -incremental:no -version:3.10 -swaprun:cd -swaprun:net setargv.obj\r
163 # see comments in allocate_heap in w32heap.c before changing any of the\r
164 # -stack, -heap, or -base settings.\r
165 !if "$(ARCH)" == "i386"\r
166 TEMACS_EXTRA_LINK = -stack:0x00800000 -heap:0x00100000 -base:0x01000000 -pdb:$(BLD)\temacs.pdb -machine:x86 $(SUBSYSTEM_CONSOLE) -entry:_start -map:$(BLD)\temacs.map $(EXTRA_LINK)\r
167 !elseif "$(ARCH)" == "AMD64"\r
168 TEMACS_EXTRA_LINK = -stack:0x00800000 -heap:0x00100000 -base:0x400000000 -pdb:$(BLD)\temacs.pdb -machine:x64 $(SUBSYSTEM_CONSOLE) -entry:_start -map:$(BLD)\temacs.map $(EXTRA_LINK)\r
169 !endif\r
171 !ifdef NOOPT\r
172 OBJDIR          = obj\r
173 !else\r
174 OBJDIR          = obj-spd\r
175 !endif\r
176 $(OBJDIR):;     -mkdir $(OBJDIR)\r
177 BLD             = $(OBJDIR)/$(ARCH)\r
178 stamp_BLD:      $(OBJDIR)\r
179                 -mkdir "$(BLD)"\r
180                 echo $(BLD) > $@\r
182 COMPILER_TEMP_FILES = *.pdb\r
184 CP              = cp -f\r
185 CP_DIR          = cp -rf\r
186 IFNOTSAMEDIR    = if not exist ..\$(DIRNAME)_same-dir.tst\r
187 ENDIF           =\r
188 FOREACH         = for %%f in (\r
189 FORVAR          = %%f\r
190 FORDO           = ) do\r
191 ENDFOR          =\r
192 ARGQUOTE        = "\r
193 # "\r
194 DQUOTE          = \"\r
195 DEL             = rm\r
196 DEL_TREE        = rm -r\r
198 !ifdef NODEBUG\r
199 DEBUG_FLAG =\r
200 DEBUG_LINK =\r
201 D =\r
202 !else\r
203 DEBUG_FLAG = -Zi\r
204 DEBUG_LINK = -debug\r
205 D = d\r
206 !endif\r
208 # gcc-specific pragma (ignore for MSVC)\r
209 PRAGMA_SYSTEM_HEADER =\r
211 !if "$(ARCH)" == "i386"\r
212 !ifdef NOOPT\r
213 #ARCH_CFLAGS     = -nologo -c -Zel -W2 -H63 -Od -G3d -Zp8 $(DEBUG_FLAG)\r
214 ARCH_CFLAGS     = -nologo -D_X86_=1 -c -Zl -Zp8 -W2 -Od -Gd $(DEBUG_FLAG)\r
215 !else\r
216 #ARCH_CFLAGS     = -nologo -c -Zel -W2 -H63 -Oxsb2 -Oy- -G6dF -Zp8 $(DEBUG_FLAG)\r
217 ARCH_CFLAGS     = -nologo -D_X86_=1 -c -Zl -Zp8 -W2 -Oi -Ot -Oy- -Ob2 -GF -Gy -Gd $(DEBUG_FLAG)\r
218 !endif\r
219 ARCH_LDFLAGS    = $(SYS_LDFLAGS)\r
220 EMACS_HEAPSIZE  = 27\r
221 EMACS_PURESIZE  = 5000000\r
222 EMACS_MANIFEST  = emacs-x86.manifest\r
224 !else\r
225 !if "$(ARCH)" == "mips"\r
226 ARCH_CFLAGS     = -D_MIPS_=1 -c -W2 -Zi -Od -Gt0\r
227 ARCH_LDFLAGS    = $(SYS_LDFLAGS)\r
228 EMACS_HEAPSIZE  = 27\r
229 EMACS_PURESIZE  = 5000000\r
230 EMACS_MANIFEST  = emacs-mips.manifest\r
232 !else\r
233 !if "$(ARCH)" == "alpha"\r
234 !if "$(BUILD_TYPE)" == "spd"\r
235 ARCH_CFLAGS     = -D_ALPHA_=1 -c -Ze -Zi -W2 -Od -D__stdcall= -D__cdecl=\r
236 !else\r
237 ARCH_CFLAGS     = -D_ALPHA_=1 -c -Ze -Zi -W2 -O1 -D__stdcall= -D__cdecl=\r
238 !endif\r
239 ARCH_LDFLAGS    = $(SYS_LDFLAGS)\r
240 EMACS_HEAPSIZE  = 27\r
241 EMACS_PURESIZE  = 5000000\r
242 EMACS_MANIFEST  = emacs-alpha.manifest\r
244 !else\r
245 !if "$(ARCH)" == "ppc"\r
246 # These flags are a guess...if they don't work, please send me mail.\r
247 ARCH_LDFLAGS    = $(SYS_LDFLAGS)\r
248 EMACS_HEAPSIZE  = 27\r
249 EMACS_PURESIZE  = 5000000\r
250 EMACS_MANIFEST  = emacs-ppc.manifest\r
252 !else\r
253 !if "$(ARCH)" == "AMD64"\r
254 !ifdef NOOPT\r
255 ARCH_CFLAGS     = -nologo -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -c -Zl -Zp8 -W2 -Od -Gd -Wp64 $(DEBUG_FLAG)\r
256 !else\r
257 ARCH_CFLAGS     = -nologo -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -c -Zl -Zp8 -W2 -O2x -GF -Gy -Gd $(DEBUG_FLAG)\r
258 !endif\r
259 ARCH_LDFLAGS    = $(SYS_LDFLAGS) -machine:x64\r
260 ARCH_RCFLAGS    = -DWIN64\r
261 EMACS_HEAPSIZE  = 42\r
262 EMACS_PURESIZE  = 10000000\r
263 EMACS_MANIFEST  = emacs-x64.manifest\r
265 !else\r
266 !ERROR Unknown architecture type "$(ARCH)".\r
267 !endif\r
268 !endif\r
269 !endif\r
270 !endif\r
271 !endif\r
273 LINK_FLAGS      = $(ARCH_LDFLAGS) $(DEBUG_LINK) $(USER_LDFLAGS)\r
275 # From MSVC 5.0 onwards, it seem base relocation information is not included,\r
276 # at least in release builds.  We need to ensure the reloc info is included\r
277 # in order to use the MSVC profiler.\r
278 !IF ("$(_NMAKE_VER)" == "$(_NMAKE_VER_4)")\r
279 EXTRA_LINK      =\r
280 !ELSE\r
281 EXTRA_LINK      = -profile\r
282 !ENDIF\r
285 # If the compiler supports compiling multiple .c files to .o files at\r
286 # one time, use this feature.\r
288 !IF ("$(_NMAKE_VER)" == "$(_NMAKE_VER_4)")\r
289 .c{$(BLD)}.obj:\r
290                 $(CC) $(CFLAGS) -Fo$(BLD)\ $<\r
291 !ELSE\r
292 .c{$(BLD)}.obj::\r
293                 $(CC) $(CFLAGS) -Fo$(BLD)\ $<\r
294 !ENDIF\r