Another merge from trunk.
[bpt/emacs.git] / nt / gmake.defs
CommitLineData
bd6766d3 1# -*- Makefile -*- definition file for building GNU Emacs on Windows NT.
ab422c4d 2# Copyright (C) 2000-2013 Free Software Foundation, Inc.
eef0be9e
GM
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/>.
9e6fd35d
AI
18
19# Ensure 'all' is the default target
20all:
21
22# NOTES
177c0ea7 23#
9e6fd35d
AI
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.
177c0ea7 33#
9e6fd35d
AI
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.)
177c0ea7 48#
9e6fd35d
AI
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.
177c0ea7 55#
9e6fd35d
AI
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
a879f0ea 72SWITCHCHAR=/
9e6fd35d
AI
73else
74USING_SH = 1
75THE_SHELL = $(SHELL)
76SHELLTYPE=SH
a879f0ea
EZ
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
9e6fd35d
AI
84endif
85
6da21b33
AI
86MAKETYPE=gmake
87
7b6f060c
JR
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
e2f4caea 93# Convert CURDIR to native file name, if in Cygwin format
7b6f060c
JR
94#ifeq "$(shell cygpath $(CURDIR))" "$(CURDIR)"
95#CURDIR := $(shell cygpath -m $(CURDIR))
96#endif
97
277277b7
AI
98THISDIR = .
99
8cba0ed7
AI
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
6dcb51cc 104sh_output := $(shell echo [Please ignore a syntax error on the next line - it is intentional] 1>&2)
8cba0ed7 105sh_output := $(shell echo foo")
c5e87d10 106# This single quote " is to fix fontification due to previous line
8cba0ed7
AI
107ifeq "$(sh_output)" ""
108NEW_CYGWIN = 1
109endif
cf32108e
JR
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
8cba0ed7
AI
120endif
121
9e6fd35d
AI
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
46f0206a 132INSTALL_DIR = $(CURDIR)/..
9e6fd35d
AI
133endif
134
37ec3479
AI
135export EMACSLOADPATH
136
9e6fd35d 137# Determine the architecture we're running on.
177c0ea7 138# Define ARCH for our purposes;
9e6fd35d
AI
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
62aba0d4
FP
150EMACS_HEAPSIZE = 27
151EMACS_PURESIZE = 5000000
152EMACS_MANIFEST = emacs-x86.manifest
9e6fd35d
AI
153 else
154 ifeq "$(PROCESSOR_ARCHITECTURE)" "MIPS"
155ARCH = mips
62aba0d4
FP
156EMACS_HEAPSIZE = 27
157EMACS_PURESIZE = 5000000
158EMACS_MANIFEST = emacs-mips.manifest
9e6fd35d
AI
159 else
160 ifeq "$(PROCESSOR_ARCHITECTURE)" "ALPHA"
161ARCH = alpha
62aba0d4
FP
162EMACS_HEAPSIZE = 27
163EMACS_PURESIZE = 5000000
164EMACS_MANIFEST = emacs-alpha.manifest
9e6fd35d
AI
165 else
166 ifeq "$(PROCESSOR_ARCHITECTURE)" "PPC"
167ARCH = ppc
62aba0d4
FP
168EMACS_HEAPSIZE = 27
169EMACS_PURESIZE = 5000000
170EMACS_MANIFEST = emacs-ppc.manifest
9e6fd35d 171 else
aff458c3 172 $(error Unknown architecture type "$(PROCESSOR_ARCHITECTURE)")
9e6fd35d
AI
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
177c0ea7
JB
195libc =
196baselibs =
9e6fd35d
AI
197O = o
198A = a
199
200BASE_LIBS = $(libc) $(baselibs)
201
202ADVAPI32 = -ladvapi32
fc2554aa 203COMCTL32 = -lcomctl32
9e6fd35d
AI
204COMDLG32 = -lcomdlg32
205GDI32 = -lgdi32
206MPR = -lmpr
207SHELL32 = -lshell32
208USER32 = -luser32
209WSOCK32 = -lwsock32
a71f59c1 210WINMM = -lwinmm
0e664bca 211WINSPOOL = -lwinspool
a71f59c1 212OLE32 = -lole32
b7612703 213UNISCRIBE = -lusp10
f4c45b4f 214UUID = -luuid
9e6fd35d 215
a6fc3b5c
EZ
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
9e6fd35d 221ifdef NOOPT
a68089e4 222DEBUG_CFLAGS = -DEMACSDEBUG -fno-crossjumping -std=gnu99
9e6fd35d 223else
177c0ea7 224DEBUG_CFLAGS =
9e6fd35d 225endif
7d0170c8 226
06523364
EZ
227MWINDOWS = -mwindows
228
0566bc95
JB
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)
43db14bb 231EMACS_EXTRA_C_FLAGS = -DUSE_CRT_DLL=1
9e6fd35d 232
75663c75
JR
233ifdef PROFILE
234PROFILE_CFLAGS = -pg
235PROFILE_LDFLAGS = -pg
236else
237PROFILE_CFLAGS =
238PROFILE_LDFLAGS =
239endif
240
241
9e6fd35d
AI
242# see comments in allocate_heap in w32heap.c before changing any of the
243# -stack, -heap, or -image-base settings.
94e7daf7 244TEMACS_EXTRA_LINK = -Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x01000000 $(SUBSYSTEM_CONSOLE) -Wl,-entry,__start -Wl,-Map,$(BLD)/temacs.map
9e6fd35d
AI
245
246ifdef NOOPT
247OBJDIR = oo
248else
249OBJDIR = oo-spd
250endif
251$(OBJDIR):; -mkdir "$(OBJDIR)"
252BLD = $(OBJDIR)/$(ARCH)
92ac68e0 253stamp_BLD: $(OBJDIR)
9e6fd35d 254 -mkdir "$(BLD)"
92ac68e0 255 echo $(BLD) > $@
9e6fd35d 256
6da21b33
AI
257COMPILER_TEMP_FILES =
258
9e6fd35d
AI
259CP = cp -f
260CP_DIR = cp -rf
261DEL = rm
262DEL_TREE = rm -r
8cba0ed7 263
e5a69fd0
EZ
264DIRNAME = $(notdir $(CURDIR))
265
9e6fd35d 266ifdef USING_SH
8cba0ed7 267
e5a69fd0 268IFNOTSAMEDIR = if [ ! -s ../$(DIRNAME)_same-dir.tst ] ; then
9e6fd35d
AI
269FOREACH = for f in
270FORVAR = $${f}
271FORDO = ; do
272ENDFOR = ; done
273ENDIF = ; fi
274ARGQUOTE = '
8cba0ed7
AI
275ifdef NEW_CYGWIN
276DQUOTE = "
277else
9e6fd35d 278DQUOTE = ""
8cba0ed7
AI
279endif
280
9e6fd35d 281else
8cba0ed7 282
e5a69fd0 283IFNOTSAMEDIR = if not exist ../$(DIRNAME)_same-dir.tst
9e6fd35d
AI
284FOREACH = for %%f in (
285FORVAR = %%f
286FORDO = ) do
287ENDFOR =
288ENDIF =
289ARGQUOTE = "
290DQUOTE = \"
8cba0ed7 291
9e6fd35d
AI
292endif
293
9e6fd35d 294ifdef NODEBUG
177c0ea7 295DEBUG_FLAG =
0f6465a6 296DEBUG_LINK =
9e6fd35d 297else
540c2a33
JB
298DEBUG_FLAG = $(DEBUG_INFO)
299DEBUG_LINK = $(DEBUG_INFO)
9e6fd35d
AI
300endif
301
302ifdef NOCYGWIN
303NOCYGWIN = -mno-cygwin
304endif
305
fd4af8d9
TZ
306ifdef USER_LIBS
307USER_LIBS := $(patsubst %,-l%,$(USER_LIBS))
308endif
309
75197633
CS
310PRAGMA_SYSTEM_HEADER = \#pragma GCC system_header
311
9e6fd35d
AI
312ifeq "$(ARCH)" "i386"
313ifdef NOOPT
43db14bb 314ARCH_CFLAGS = -c $(DEBUG_FLAG) $(NOCYGWIN)
9e6fd35d 315else
43db14bb 316ARCH_CFLAGS = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \
9e6fd35d
AI
317 # -fbuiltin \
318 # -finline-functions \
319 # -fomit-frame-pointer
320endif
321ARCH_LDFLAGS = $(SYS_LDFLAGS)
322else
323ERROR Unknown architecture type "$(ARCH)".
324endif
325
75663c75 326LINK_FLAGS = $(ARCH_LDFLAGS) $(DEBUG_LINK) $(PROFILE_LDFLAGS) $(NOCYGWIN) $(USER_LDFLAGS)
9e6fd35d 327
23825e3b
EZ
328export XMFLAGS
329
9e6fd35d
AI
330.DEFAULT:
331
332$(BLD)/%.o: %.c
333 $(CC) $(CFLAGS) $(CC_OUT)$@ $<