Update copyright year to 2014 by running admin/update-copyright.
[bpt/emacs.git] / nt / gmake.defs
... / ...
CommitLineData
1# -*- Makefile -*- definition file for building GNU Emacs on Windows NT.
2# Copyright (C) 2000-2014 Free Software Foundation, Inc.
3
4# This file is part of GNU Emacs.
5
6# GNU Emacs is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10
11# GNU Emacs is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15
16# You should have received a copy of the GNU General Public License
17# along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
18
19# Ensure 'all' is the default target
20all:
21
22# NOTES
23#
24# I tried to force gmake to use the native shell for simplicity, by
25# setting SHELL as below, but this didn't work reliably because of
26# various case sensitivity niggles. Specifically, COMSPEC (which is in
27# fact usually spelled ComSpec on NT, to make life difficult) typically
28# references "cmd.exe" (on NT) when the file is actually called
29# "CMD.EXE" on disk for hysterical raisons. As a result, GNU make
30# thinks it doesn't exist (unless compiled with a switch to ignore
31# case), and so doesn't change which shell it will invoke to execute
32# commands.
33#
34# It would be possible, though very tedious using just gmake facilities,
35# to convert the COMSPEC value to uppercase to solve this problem, but
36# it isn't worth it. That is partly because, even when using the native
37# shell, gmake tends to not be happy with backslashes in command
38# strings. The obvious solution is to use forward slashes as much as
39# possible, which can be made to work most of the time (putting
40# filenames in quotes often helps), but there are still some internal
41# cmd.exe commands like `del' and `copy' that won't work with them.
42# Although it is possible to convert slashes to backslashes when
43# necessary, gmake requires explicitly calling its subst function, which
44# nmake does not understand). For this reason, it is simplest to
45# mandate that rm and cp be available, so we can use Unix-format file
46# names everywhere. (Fortunately both MS and GNU make, and the
47# respective compilers, are happy with Unix-format names.)
48#
49# Since we cannot easily force the choice of a particular shell, we must
50# make the effort to cope with whichever shell is being used.
51# Fortunately, the only command we need to use that is shell specific is
52# the testing of a file's existence for the purpose of working out when
53# we are copying files to their original location. That particular
54# requirement is abstracted easily enough.
55#
56# The only other problem area was the change of directory when running
57# temacs to dump emacs.exe (where gmake doesn't support cd foo in any
58# useful way), but that has been resolved by modifying the Windows
59# unexec function slightly to not require the directory change while
60# still allowing objects and binaries to be in subdirectories.
61
62# This doesn't work.
63#SHELL:=$(COMSPEC)
64
65# Determine whether make is using sh or cmd/command as shell; cmd.exe
66# will output "ECHO is on" when echo is given by itself, while sh will
67# not produce any output.
68sh_output := $(shell echo)
69ifeq "$(findstring ECHO, $(sh_output))" "ECHO"
70THE_SHELL = $(COMSPEC)$(ComSpec)
71SHELLTYPE=CMD
72SWITCHCHAR=/
73else
74USING_SH = 1
75THE_SHELL = $(SHELL)
76SHELLTYPE=SH
77# MSYS needs to double the slash in cmd-style switches to avoid
78# interpreting /x as a Posix style file name reference
79ifneq ($(MSYSTEM),)
80SWITCHCHAR=//
81else
82SWITCHCHAR=/
83endif
84endif
85
86MAKETYPE=gmake
87
88# The following "ifeq" does not appear to DTRT, and therefore breaks
89# the build on mingw32. Also the -m option does not exist in many
90# (reasonably recent even) versions of Cygwin. These issues need to be
91# remedied before putting this cygpath kludge back in.
92
93# Convert CURDIR to native file name, if in Cygwin format
94#ifeq "$(shell cygpath $(CURDIR))" "$(CURDIR)"
95#CURDIR := $(shell cygpath -m $(CURDIR))
96#endif
97
98THISDIR = .
99
100# Cygwin has changed quoting rules somewhat since b20, in a way that
101# affects makefiles using sh as the command processor, so we need to
102# detect which rules to use.
103ifdef USING_SH
104sh_output := $(shell echo [Please ignore a syntax error on the next line - it is intentional] 1>&2)
105sh_output := $(shell echo foo")
106# This single quote " is to fix fontification due to previous line
107ifeq "$(sh_output)" ""
108NEW_CYGWIN = 1
109endif
110
111# By default, newer versions of Cygwin mess with NTFS ACLs in an
112# attempt to emulate traditional posix file permissions. This can
113# cause bad effects, such as .exe files that are missing the
114# FILE_EXECUTE/FILE_GENERIC_EXECUTE permissions when they are created
115# with Cygwin commands that don't expect to be creating executable
116# files. Then when we later use a non-Cygwin program to create the
117# real .exe, the previous Cygwin defined ACL sticks.
118CYGWIN=nontsec
119export CYGWIN
120endif
121
122ALL_DEPS = $^
123EMPTY =
124SPACE = $(EMPTY) $(EMPTY)
125
126SUBSYSTEM_WINDOWS=-Wl,-subsystem,windows
127SUBSYSTEM_CONSOLE=-Wl,-subsystem,console
128
129# INSTALL_DIR is the directory into which emacs will be installed.
130#
131ifndef INSTALL_DIR
132INSTALL_DIR = $(CURDIR)/..
133endif
134
135export EMACSLOADPATH
136
137# Determine the architecture we're running on.
138# Define ARCH for our purposes;
139# Define CPU for use by ntwin32.mak;
140# Define CONFIG_H to the appropriate config.h for the system;
141#
142ifdef PROCESSOR_ARCHITECTURE
143# We're on Windows NT
144CPU = $(PROCESSOR_ARCHITECTURE)
145CONFIG_H = config.nt
146OS_TYPE = windowsnt
147 ifeq "$(PROCESSOR_ARCHITECTURE)" "x86"
148ARCH = i386
149CPU = i386
150EMACS_HEAPSIZE = 27
151EMACS_PURESIZE = 5000000
152EMACS_MANIFEST = emacs-x86.manifest
153 else
154 ifeq "$(PROCESSOR_ARCHITECTURE)" "MIPS"
155ARCH = mips
156EMACS_HEAPSIZE = 27
157EMACS_PURESIZE = 5000000
158EMACS_MANIFEST = emacs-mips.manifest
159 else
160 ifeq "$(PROCESSOR_ARCHITECTURE)" "ALPHA"
161ARCH = alpha
162EMACS_HEAPSIZE = 27
163EMACS_PURESIZE = 5000000
164EMACS_MANIFEST = emacs-alpha.manifest
165 else
166 ifeq "$(PROCESSOR_ARCHITECTURE)" "PPC"
167ARCH = ppc
168EMACS_HEAPSIZE = 27
169EMACS_PURESIZE = 5000000
170EMACS_MANIFEST = emacs-ppc.manifest
171 else
172 $(error Unknown architecture type "$(PROCESSOR_ARCHITECTURE)")
173 endif
174 endif
175 endif
176 endif
177else
178# We're on Windows 95
179ARCH = i386
180CPU = i386
181CONFIG_H = config.nt
182OS_TYPE = windows95
183endif
184
185AR = ar -rsc
186AR_OUT =
187CC = gcc
188CC_OUT = -o$(SPACE)
189LINK = gcc
190LINK_OUT = -o$(SPACE)
191RC = windres -O coff
192RC_OUT = -o$(SPACE)
193RC_INCLUDE = --include-dir$(SPACE)
194
195libc =
196baselibs =
197O = o
198A = a
199
200BASE_LIBS = $(libc) $(baselibs)
201
202ADVAPI32 = -ladvapi32
203COMCTL32 = -lcomctl32
204COMDLG32 = -lcomdlg32
205GDI32 = -lgdi32
206MPR = -lmpr
207SHELL32 = -lshell32
208USER32 = -luser32
209WSOCK32 = -lwsock32
210WINMM = -lwinmm
211WINSPOOL = -lwinspool
212OLE32 = -lole32
213UNISCRIBE = -lusp10
214UUID = -luuid
215
216# Used by src/makefile.w32-in, since Nmake barfs on $(func SOMETHING)
217OBJ0_c = $(patsubst $(BLD)%.$(O),$(CURDIR)%.c,$(OBJ0))
218OBJ1_c = $(patsubst $(BLD)%.$(O),$(CURDIR)%.c,$(OBJ1))
219OBJ2_c = $(patsubst $(BLD)%.$(O),$(CURDIR)%.c,$(OBJ2))
220
221ifdef NOOPT
222DEBUG_CFLAGS = -DEMACSDEBUG -fno-crossjumping -std=gnu99
223else
224DEBUG_CFLAGS =
225endif
226
227MWINDOWS = -mwindows
228
229CFLAGS = -I. $(ARCH_CFLAGS) $(DEBUG_CFLAGS) $(PROFILE_CFLAGS) $(USER_CFLAGS) $(LOCAL_FLAGS)
230ESC_CFLAGS = -I. $(ARCH_CFLAGS) $(DEBUG_CFLAGS) $(PROFILE_CFLAGS) $(ESC_USER_CFLAGS) $(LOCAL_FLAGS)
231EMACS_EXTRA_C_FLAGS = -DUSE_CRT_DLL=1
232
233ifdef PROFILE
234PROFILE_CFLAGS = -pg
235PROFILE_LDFLAGS = -pg
236else
237PROFILE_CFLAGS =
238PROFILE_LDFLAGS =
239endif
240
241
242# see comments in allocate_heap in w32heap.c before changing any of the
243# -stack, -heap, or -image-base settings.
244TEMACS_EXTRA_LINK = -Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x01000000 $(SUBSYSTEM_CONSOLE) -Wl,-entry,__start -Wl,-Map,$(BLD)/temacs.map
245
246ifdef NOOPT
247OBJDIR = oo
248else
249OBJDIR = oo-spd
250endif
251$(OBJDIR):; -mkdir "$(OBJDIR)"
252BLD = $(OBJDIR)/$(ARCH)
253stamp_BLD: $(OBJDIR)
254 -mkdir "$(BLD)"
255 echo $(BLD) > $@
256
257COMPILER_TEMP_FILES =
258
259CP = cp -f
260CP_DIR = cp -rf
261DEL = rm
262DEL_TREE = rm -r
263
264DIRNAME = $(notdir $(CURDIR))
265
266ifdef USING_SH
267
268IFNOTSAMEDIR = if [ ! -s ../$(DIRNAME)_same-dir.tst ] ; then
269FOREACH = for f in
270FORVAR = $${f}
271FORDO = ; do
272ENDFOR = ; done
273ENDIF = ; fi
274ARGQUOTE = '
275ifdef NEW_CYGWIN
276DQUOTE = "
277else
278DQUOTE = ""
279endif
280
281else
282
283IFNOTSAMEDIR = if not exist ../$(DIRNAME)_same-dir.tst
284FOREACH = for %%f in (
285FORVAR = %%f
286FORDO = ) do
287ENDFOR =
288ENDIF =
289ARGQUOTE = "
290DQUOTE = \"
291
292endif
293
294ifdef NODEBUG
295DEBUG_FLAG =
296DEBUG_LINK =
297else
298DEBUG_FLAG = $(DEBUG_INFO)
299DEBUG_LINK = $(DEBUG_INFO)
300endif
301
302ifdef NOCYGWIN
303NOCYGWIN = -mno-cygwin
304endif
305
306ifdef USER_LIBS
307USER_LIBS := $(patsubst %,-l%,$(USER_LIBS))
308endif
309
310PRAGMA_SYSTEM_HEADER = \#pragma GCC system_header
311
312ifeq "$(ARCH)" "i386"
313ifdef NOOPT
314ARCH_CFLAGS = -c $(DEBUG_FLAG) $(NOCYGWIN)
315else
316ARCH_CFLAGS = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \
317 # -fbuiltin \
318 # -finline-functions \
319 # -fomit-frame-pointer
320endif
321ARCH_LDFLAGS = $(SYS_LDFLAGS)
322else
323ERROR Unknown architecture type "$(ARCH)".
324endif
325
326LINK_FLAGS = $(ARCH_LDFLAGS) $(DEBUG_LINK) $(PROFILE_LDFLAGS) $(NOCYGWIN) $(USER_LDFLAGS)
327
328export XMFLAGS
329
330.DEFAULT:
331
332$(BLD)/%.o: %.c
333 $(CC) $(CFLAGS) $(CC_OUT)$@ $<