# -*- Makefile -*- definition file for building GNU Emacs on Windows NT.# Copyright (C) 2000, 2001, 2002, 2003, 2004,# 2005, 2006, 2007 Free Software Foundation, Inc.## 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, 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; see the file COPYING. If not, write to# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,# Boston, MA 02110-1301, USA.# Ensure 'all' is the default targetall:# NOTES## 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.## 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.)## 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.## 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=CMDelseUSING_SH = 1THE_SHELL = $(SHELL)SHELLTYPE=SHendifMAKETYPE=gmake# 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.# Convert CURDIR to native file name, if in Cygwin format#ifeq "$(shell cygpath $(CURDIR))" "$(CURDIR)"#CURDIR := $(shell cygpath -m $(CURDIR))#endifTHISDIR = .# 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_SHsh_output := $(shell echo [Please ignore a syntax error on the next line - it is intentional] 1>&2)sh_output := $(shell echo foo")ifeq "$(sh_output)" ""NEW_CYGWIN = 1endifendifALL_DEPS = $^EMPTY =SPACE = $(EMPTY) $(EMPTY)SUBSYSTEM_WINDOWS=-Wl,-subsystem,windowsSUBSYSTEM_CONSOLE=-Wl,-subsystem,console# INSTALL_DIR is the directory into which emacs will be installed.#ifndef INSTALL_DIRINSTALL_DIR = $(CURDIR)/..endifexport EMACSLOADPATH# Determine the architecture we're running on.# Define ARCH for our purposes;# 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 NTCPU = $(PROCESSOR_ARCHITECTURE)CONFIG_H = config.ntOS_TYPE = windowsnt ifeq "$(PROCESSOR_ARCHITECTURE)" "x86"ARCH = i386CPU = i386 else ifeq "$(PROCESSOR_ARCHITECTURE)" "MIPS"ARCH = mips else ifeq "$(PROCESSOR_ARCHITECTURE)" "ALPHA"ARCH = alpha else ifeq "$(PROCESSOR_ARCHITECTURE)" "PPC"ARCH = ppc elseerror Unknown architecture type "$(PROCESSOR_ARCHITECTURE)" endif endif endif endifelse# We're on Windows 95ARCH = i386CPU = i386CONFIG_H = config.ntOS_TYPE = windows95endifAR = ar -rscAR_OUT =CC = gccCC_OUT = -o$(SPACE)LINK = gccLINK_OUT = -o$(SPACE)RC = windres -O coffRC_OUT = -o$(SPACE)RC_INCLUDE = --include-dir$(SPACE)libc =baselibs =O = oA = aBASE_LIBS = $(libc) $(baselibs)ADVAPI32 = -ladvapi32COMCTL32 = -lcomctl32COMDLG32 = -lcomdlg32GDI32 = -lgdi32MPR = -lmprSHELL32 = -lshell32USER32 = -luser32WSOCK32 = -lwsock32WINMM = -lwinmmWINSPOOL = -lwinspoolOLE32 = -lole32ifdef NOOPTDEBUG_CFLAGS = -DEMACSDEBUGelseDEBUG_CFLAGS =endifCFLAGS = -I. -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0400 $(ARCH_CFLAGS) -D$(ARCH) \ -D_CRTAPI1=_cdecl \ $(DEBUG_CFLAGS) $(USER_CFLAGS) $(LOCAL_FLAGS)EMACS_EXTRA_C_FLAGS = -DUSE_CRT_DLL=1# see comments in allocate_heap in w32heap.c before changing any of the# -stack, -heap, or -image-base settings.TEMACS_EXTRA_LINK = -Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x01000000 $(SUBSYSTEM_CONSOLE) -Wl,-entry,__start -Wl,-Map,$(BLD)/temacs.mapifdef NOOPTOBJDIR = ooelseOBJDIR = oo-spdendif$(OBJDIR):; -mkdir "$(OBJDIR)"BLD = $(OBJDIR)/$(ARCH)stamp_BLD: $(OBJDIR) -mkdir "$(BLD)" echo $(BLD) > $@COMPILER_TEMP_FILES =CP = cp -fCP_DIR = cp -rfDEL = rmDEL_TREE = rm -rifdef USING_SHIFNOTSAMEDIR = if [ ! -s ../same-dir.tst ] ; thenFOREACH = for f inFORVAR = $${f}FORDO = ; doENDFOR = ; doneENDIF = ; fiARGQUOTE = 'ifdef NEW_CYGWINDQUOTE = "elseDQUOTE = ""endifelseIFNOTSAMEDIR = if not exist ../same-dir.tstFOREACH = for %%f in (FORVAR = %%fFORDO = ) doENDFOR =ENDIF =ARGQUOTE = "DQUOTE = \"endififdef NODEBUGDEBUG_FLAG =DEBUG_LINK =elseDEBUG_FLAG = -gstabs+ -g3DEBUG_LINK = -gstabs+ -g3endififdef NOCYGWINNOCYGWIN = -mno-cygwinendififeq "$(ARCH)" "i386"ifdef NOOPTARCH_CFLAGS = -D_X86_=1 -c $(DEBUG_FLAG) $(NOCYGWIN)elseARCH_CFLAGS = -D_X86_=1 -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \ # -fbuiltin \ # -finline-functions \ # -fomit-frame-pointerendifARCH_LDFLAGS = $(SYS_LDFLAGS)elseERROR Unknown architecture type "$(ARCH)".endifLINK_FLAGS = $(ARCH_LDFLAGS) $(DEBUG_LINK) $(NOCYGWIN) $(USER_LDFLAGS)export XMFLAGS.DEFAULT:$(BLD)/%.o: %.c $(CC) $(CFLAGS) $(CC_OUT)$@ $<# arch-tag: 35eb9662-8534-4bcf-b891-0730a09d657f