gmake.defs 8.24 KB
Newer Older
1
#  -*- Makefile -*- definition file for building GNU Emacs on Windows NT.
2
# Copyright (C) 2000-2011 Free Software Foundation, Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

# This file is part of GNU Emacs.

# GNU Emacs is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# GNU Emacs is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Andrew Innes's avatar
Andrew Innes committed
18 19 20 21 22

# Ensure 'all' is the default target
all:

# NOTES
23
#
Andrew Innes's avatar
Andrew Innes committed
24 25 26 27 28 29 30 31 32
# I tried to force gmake to use the native shell for simplicity, by
# setting SHELL as below, but this didn't work reliably because of
# various case sensitivity niggles.  Specifically, COMSPEC (which is in
# fact usually spelled ComSpec on NT, to make life difficult) typically
# references "cmd.exe" (on NT) when the file is actually called
# "CMD.EXE" on disk for hysterical raisons.  As a result, GNU make
# thinks it doesn't exist (unless compiled with a switch to ignore
# case), and so doesn't change which shell it will invoke to execute
# commands.
33
#
Andrew Innes's avatar
Andrew Innes committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47
# It would be possible, though very tedious using just gmake facilities,
# to convert the COMSPEC value to uppercase to solve this problem, but
# it isn't worth it.  That is partly because, even when using the native
# shell, gmake tends to not be happy with backslashes in command
# strings.  The obvious solution is to use forward slashes as much as
# possible, which can be made to work most of the time (putting
# filenames in quotes often helps), but there are still some internal
# cmd.exe commands like `del' and `copy' that won't work with them.
# Although it is possible to convert slashes to backslashes when
# necessary, gmake requires explicitly calling its subst function, which
# nmake does not understand).  For this reason, it is simplest to
# mandate that rm and cp be available, so we can use Unix-format file
# names everywhere.  (Fortunately both MS and GNU make, and the
# respective compilers, are happy with Unix-format names.)
48
#
Andrew Innes's avatar
Andrew Innes committed
49 50 51 52 53 54
# Since we cannot easily force the choice of a particular shell, we must
# make the effort to cope with whichever shell is being used.
# Fortunately, the only command we need to use that is shell specific is
# the testing of a file's existence for the purpose of working out when
# we are copying files to their original location.  That particular
# requirement is abstracted easily enough.
55
#
Andrew Innes's avatar
Andrew Innes committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
# The only other problem area was the change of directory when running
# temacs to dump emacs.exe (where gmake doesn't support cd foo in any
# useful way), but that has been resolved by modifying the Windows
# unexec function slightly to not require the directory change while
# still allowing objects and binaries to be in subdirectories.

# This doesn't work.
#SHELL:=$(COMSPEC)

# Determine whether make is using sh or cmd/command as shell; cmd.exe
# will output "ECHO is on" when echo is given by itself, while sh will
# not produce any output.
sh_output := $(shell echo)
ifeq "$(findstring ECHO, $(sh_output))" "ECHO"
THE_SHELL = $(COMSPEC)$(ComSpec)
SHELLTYPE=CMD
else
USING_SH = 1
THE_SHELL = $(SHELL)
SHELLTYPE=SH
endif

78 79
MAKETYPE=gmake

Jason Rumney's avatar
Jason Rumney committed
80 81 82 83 84
# The following "ifeq" does not appear to DTRT, and therefore breaks
# the build on mingw32. Also the -m option does not exist in many
# (reasonably recent even) versions of Cygwin. These issues need to be
# remedied before putting this cygpath kludge back in.

85
# Convert CURDIR to native file name, if in Cygwin format
Jason Rumney's avatar
Jason Rumney committed
86 87 88 89
#ifeq "$(shell cygpath $(CURDIR))" "$(CURDIR)"
#CURDIR	        := $(shell cygpath -m $(CURDIR))
#endif

Andrew Innes's avatar
Andrew Innes committed
90 91
THISDIR		= .

Andrew Innes's avatar
Andrew Innes committed
92 93 94 95
# Cygwin has changed quoting rules somewhat since b20, in a way that
# affects makefiles using sh as the command processor, so we need to
# detect which rules to use.
ifdef USING_SH
96
sh_output := $(shell echo [Please ignore a syntax error on the next line - it is intentional] 1>&2)
Andrew Innes's avatar
Andrew Innes committed
97
sh_output := $(shell echo foo")
Eli Zaretskii's avatar
Eli Zaretskii committed
98
# This single quote " is to fix fintification due to previous line
Andrew Innes's avatar
Andrew Innes committed
99 100 101
ifeq "$(sh_output)" ""
NEW_CYGWIN = 1
endif
102 103 104 105 106 107 108 109 110 111

# By default, newer versions of Cygwin mess with NTFS ACLs in an
# attempt to emulate traditional posix file permissions. This can
# cause bad effects, such as .exe files that are missing the
# FILE_EXECUTE/FILE_GENERIC_EXECUTE permissions when they are created
# with Cygwin commands that don't expect to be creating executable
# files. Then when we later use a non-Cygwin program to create the
# real .exe, the previous Cygwin defined ACL sticks.
CYGWIN=nontsec
export CYGWIN
Andrew Innes's avatar
Andrew Innes committed
112 113
endif

Andrew Innes's avatar
Andrew Innes committed
114 115 116 117 118 119 120 121 122 123
ALL_DEPS	= $^
EMPTY =
SPACE = $(EMPTY) $(EMPTY)

SUBSYSTEM_WINDOWS=-Wl,-subsystem,windows
SUBSYSTEM_CONSOLE=-Wl,-subsystem,console

# INSTALL_DIR is the directory into which emacs will be installed.
#
ifndef INSTALL_DIR
124
INSTALL_DIR     = $(CURDIR)/..
Andrew Innes's avatar
Andrew Innes committed
125 126
endif

127 128
export EMACSLOADPATH

Andrew Innes's avatar
Andrew Innes committed
129
# Determine the architecture we're running on.
130
# Define ARCH for our purposes;
Andrew Innes's avatar
Andrew Innes committed
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
# Define CPU for use by ntwin32.mak;
# Define CONFIG_H to the appropriate config.h for the system;
#
ifdef PROCESSOR_ARCHITECTURE
# We're on Windows NT
CPU		= $(PROCESSOR_ARCHITECTURE)
CONFIG_H	= config.nt
OS_TYPE		= windowsnt
 ifeq "$(PROCESSOR_ARCHITECTURE)" "x86"
ARCH		= i386
CPU		= i386
 else
  ifeq "$(PROCESSOR_ARCHITECTURE)" "MIPS"
ARCH		= mips
  else
   ifeq "$(PROCESSOR_ARCHITECTURE)" "ALPHA"
ARCH		= alpha
   else
    ifeq "$(PROCESSOR_ARCHITECTURE)" "PPC"
ARCH		= ppc
    else
error Unknown architecture type "$(PROCESSOR_ARCHITECTURE)"
    endif
   endif
  endif
 endif
else
# We're on Windows 95
ARCH		= i386
CPU		= i386
CONFIG_H	= config.nt
OS_TYPE		= windows95
endif

AR		= ar -rsc
AR_OUT		=
CC		= gcc
CC_OUT		= -o$(SPACE)
LINK		= gcc
LINK_OUT	= -o$(SPACE)
RC		= windres -O coff
RC_OUT		= -o$(SPACE)
RC_INCLUDE	= --include-dir$(SPACE)

175 176
libc		=
baselibs	=
Andrew Innes's avatar
Andrew Innes committed
177 178 179 180 181 182
O		= o
A		= a

BASE_LIBS	= $(libc) $(baselibs)

ADVAPI32	= -ladvapi32
Jason Rumney's avatar
Jason Rumney committed
183
COMCTL32	= -lcomctl32
Andrew Innes's avatar
Andrew Innes committed
184 185 186 187 188 189
COMDLG32	= -lcomdlg32
GDI32		= -lgdi32
MPR		= -lmpr
SHELL32		= -lshell32
USER32		= -luser32
WSOCK32		= -lwsock32
Jason Rumney's avatar
Jason Rumney committed
190
WINMM		= -lwinmm
191
WINSPOOL	= -lwinspool
Jason Rumney's avatar
Jason Rumney committed
192
OLE32		= -lole32
Jason Rumney's avatar
Jason Rumney committed
193
UNISCRIBE	= -lusp10
194
UUID		= -luuid
Andrew Innes's avatar
Andrew Innes committed
195 196 197 198

ifdef NOOPT
DEBUG_CFLAGS	= -DEMACSDEBUG
else
199
DEBUG_CFLAGS	=
Andrew Innes's avatar
Andrew Innes committed
200
endif
201 202

ifdef ENABLECHECKS
203
CHECKING_CFLAGS	= -DENABLE_CHECKING -DXASSERTS -fno-crossjumping
204 205 206 207 208
else
CHECKING_CFLAGS	=
endif

CFLAGS          = -I. $(ARCH_CFLAGS) $(DEBUG_CFLAGS) $(CHECKING_CFLAGS) $(PROFILE_CFLAGS) $(USER_CFLAGS) $(LOCAL_FLAGS)
209
EMACS_EXTRA_C_FLAGS = -DUSE_CRT_DLL=1
Andrew Innes's avatar
Andrew Innes committed
210

211 212 213 214 215 216 217 218 219
ifdef PROFILE
PROFILE_CFLAGS  = -pg
PROFILE_LDFLAGS  = -pg
else
PROFILE_CFLAGS  =
PROFILE_LDFLAGS =
endif


Andrew Innes's avatar
Andrew Innes committed
220 221
# see comments in allocate_heap in w32heap.c before changing any of the
# -stack, -heap, or -image-base settings.
222
TEMACS_EXTRA_LINK = -Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x01000000 $(SUBSYSTEM_CONSOLE) -Wl,-entry,__start -Wl,-Map,$(BLD)/temacs.map
Andrew Innes's avatar
Andrew Innes committed
223 224 225 226 227 228 229 230

ifdef NOOPT
OBJDIR          = oo
else
OBJDIR          = oo-spd
endif
$(OBJDIR):;	-mkdir "$(OBJDIR)"
BLD             = $(OBJDIR)/$(ARCH)
231
stamp_BLD:      $(OBJDIR)
Andrew Innes's avatar
Andrew Innes committed
232
		-mkdir "$(BLD)"
233
		echo $(BLD) > $@
Andrew Innes's avatar
Andrew Innes committed
234

235 236
COMPILER_TEMP_FILES =

Andrew Innes's avatar
Andrew Innes committed
237 238 239 240
CP		= cp -f
CP_DIR		= cp -rf
DEL		= rm
DEL_TREE	= rm -r
Andrew Innes's avatar
Andrew Innes committed
241

Andrew Innes's avatar
Andrew Innes committed
242
ifdef USING_SH
Andrew Innes's avatar
Andrew Innes committed
243

Andrew Innes's avatar
Andrew Innes committed
244 245 246 247 248 249 250
IFNOTSAMEDIR	= if [ ! -s ../same-dir.tst ] ; then
FOREACH		= for f in
FORVAR		= $${f}
FORDO		= ; do
ENDFOR		= ; done
ENDIF		= ; fi
ARGQUOTE	= '
Andrew Innes's avatar
Andrew Innes committed
251 252 253
ifdef NEW_CYGWIN
DQUOTE		= "
else
Andrew Innes's avatar
Andrew Innes committed
254
DQUOTE		= ""
Andrew Innes's avatar
Andrew Innes committed
255 256
endif

Andrew Innes's avatar
Andrew Innes committed
257
else
Andrew Innes's avatar
Andrew Innes committed
258

Andrew Innes's avatar
Andrew Innes committed
259 260 261 262 263 264 265 266
IFNOTSAMEDIR	= if not exist ../same-dir.tst
FOREACH		= for %%f in (
FORVAR		= %%f
FORDO		= ) do
ENDFOR		=
ENDIF		=
ARGQUOTE	= "
DQUOTE		= \"
Andrew Innes's avatar
Andrew Innes committed
267

Andrew Innes's avatar
Andrew Innes committed
268 269 270
endif

ifdef NODEBUG
271
DEBUG_FLAG =
Andrew Innes's avatar
Andrew Innes committed
272
DEBUG_LINK =
Andrew Innes's avatar
Andrew Innes committed
273
else
274 275
DEBUG_FLAG = $(DEBUG_INFO)
DEBUG_LINK = $(DEBUG_INFO)
Andrew Innes's avatar
Andrew Innes committed
276 277 278 279 280 281
endif

ifdef NOCYGWIN
NOCYGWIN = -mno-cygwin
endif

Ted Zlatanov's avatar
Ted Zlatanov committed
282 283 284 285
ifdef USER_LIBS
USER_LIBS := $(patsubst %,-l%,$(USER_LIBS))
endif

Andrew Innes's avatar
Andrew Innes committed
286 287
ifeq "$(ARCH)" "i386"
ifdef NOOPT
288
ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN)
Andrew Innes's avatar
Andrew Innes committed
289
else
290
ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \
Andrew Innes's avatar
Andrew Innes committed
291 292 293 294 295 296 297 298 299
		  # -fbuiltin \
		  # -finline-functions \
		  # -fomit-frame-pointer
endif
ARCH_LDFLAGS	= $(SYS_LDFLAGS)
else
ERROR Unknown architecture type "$(ARCH)".
endif

300
LINK_FLAGS	= $(ARCH_LDFLAGS) $(DEBUG_LINK) $(PROFILE_LDFLAGS) $(NOCYGWIN) $(USER_LDFLAGS)
Andrew Innes's avatar
Andrew Innes committed
301

Eli Zaretskii's avatar
Eli Zaretskii committed
302 303
export XMFLAGS

Andrew Innes's avatar
Andrew Innes committed
304 305 306 307
.DEFAULT:

$(BLD)/%.o: %.c
		$(CC) $(CFLAGS) $(CC_OUT)$@ $<
Miles Bader's avatar
Miles Bader committed
308