gmake.defs 7.92 KB
Newer Older
1
#  -*- Makefile -*- definition file for building GNU Emacs on Windows NT.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
#    2008 Free Software Foundation, Inc.

# 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
19 20 21 22 23

# Ensure 'all' is the default target
all:

# NOTES
24
#
Andrew Innes's avatar
Andrew Innes committed
25 26 27 28 29 30 31 32 33
# 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.
34
#
Andrew Innes's avatar
Andrew Innes committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48
# 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.)
49
#
Andrew Innes's avatar
Andrew Innes committed
50 51 52 53 54 55
# 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.
56
#
Andrew Innes's avatar
Andrew Innes committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
# 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

79 80
MAKETYPE=gmake

Jason Rumney's avatar
Jason Rumney committed
81 82 83 84 85
# 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.

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

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

Andrew Innes's avatar
Andrew Innes committed
93 94 95 96
# 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
97
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
98 99 100 101
sh_output := $(shell echo foo")
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
Andrew Innes's avatar
Andrew Innes committed
194 195 196 197

ifdef NOOPT
DEBUG_CFLAGS	= -DEMACSDEBUG
else
198
DEBUG_CFLAGS	=
Andrew Innes's avatar
Andrew Innes committed
199
endif
200 201
CFLAGS          = -I. $(ARCH_CFLAGS) $(DEBUG_CFLAGS) $(USER_CFLAGS) $(LOCAL_FLAGS)
EMACS_EXTRA_C_FLAGS = -DUSE_CRT_DLL=1
Andrew Innes's avatar
Andrew Innes committed
202 203 204

# see comments in allocate_heap in w32heap.c before changing any of the
# -stack, -heap, or -image-base settings.
205
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
206 207 208 209 210 211 212 213

ifdef NOOPT
OBJDIR          = oo
else
OBJDIR          = oo-spd
endif
$(OBJDIR):;	-mkdir "$(OBJDIR)"
BLD             = $(OBJDIR)/$(ARCH)
214
stamp_BLD:      $(OBJDIR)
Andrew Innes's avatar
Andrew Innes committed
215
		-mkdir "$(BLD)"
216
		echo $(BLD) > $@
Andrew Innes's avatar
Andrew Innes committed
217

218 219
COMPILER_TEMP_FILES =

Andrew Innes's avatar
Andrew Innes committed
220 221 222 223
CP		= cp -f
CP_DIR		= cp -rf
DEL		= rm
DEL_TREE	= rm -r
Andrew Innes's avatar
Andrew Innes committed
224

Andrew Innes's avatar
Andrew Innes committed
225
ifdef USING_SH
Andrew Innes's avatar
Andrew Innes committed
226

Andrew Innes's avatar
Andrew Innes committed
227 228 229 230 231 232 233
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
234 235 236
ifdef NEW_CYGWIN
DQUOTE		= "
else
Andrew Innes's avatar
Andrew Innes committed
237
DQUOTE		= ""
Andrew Innes's avatar
Andrew Innes committed
238 239
endif

Andrew Innes's avatar
Andrew Innes committed
240
else
Andrew Innes's avatar
Andrew Innes committed
241

Andrew Innes's avatar
Andrew Innes committed
242 243 244 245 246 247 248 249
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
250

Andrew Innes's avatar
Andrew Innes committed
251 252 253
endif

ifdef NODEBUG
254
DEBUG_FLAG =
Andrew Innes's avatar
Andrew Innes committed
255
DEBUG_LINK =
Andrew Innes's avatar
Andrew Innes committed
256
else
257 258
DEBUG_FLAG = $(DEBUG_INFO)
DEBUG_LINK = $(DEBUG_INFO)
Andrew Innes's avatar
Andrew Innes committed
259 260 261 262 263 264 265 266
endif

ifdef NOCYGWIN
NOCYGWIN = -mno-cygwin
endif

ifeq "$(ARCH)" "i386"
ifdef NOOPT
267
ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN)
Andrew Innes's avatar
Andrew Innes committed
268
else
269
ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \
Andrew Innes's avatar
Andrew Innes committed
270 271 272 273 274 275 276 277 278
		  # -fbuiltin \
		  # -finline-functions \
		  # -fomit-frame-pointer
endif
ARCH_LDFLAGS	= $(SYS_LDFLAGS)
else
ERROR Unknown architecture type "$(ARCH)".
endif

Andrew Innes's avatar
Andrew Innes committed
279
LINK_FLAGS	= $(ARCH_LDFLAGS) $(DEBUG_LINK) $(NOCYGWIN) $(USER_LDFLAGS)
Andrew Innes's avatar
Andrew Innes committed
280

Eli Zaretskii's avatar
Eli Zaretskii committed
281 282
export XMFLAGS

Andrew Innes's avatar
Andrew Innes committed
283 284 285 286
.DEFAULT:

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

# arch-tag: 35eb9662-8534-4bcf-b891-0730a09d657f