123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- # -*- Makefile -*- definition file for building GNU Emacs on Windows NT.
- # Copyright (C) 2000-2012 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/>.
- # Ensure 'all' is the default target
- all:
- # 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=CMD
- else
- USING_SH = 1
- THE_SHELL = $(SHELL)
- SHELLTYPE=SH
- endif
- MAKETYPE=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))
- #endif
- THISDIR = .
- # 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
- sh_output := $(shell echo [Please ignore a syntax error on the next line - it is intentional] 1>&2)
- sh_output := $(shell echo foo")
- # This single quote " is to fix fontification due to previous line
- ifeq "$(sh_output)" ""
- NEW_CYGWIN = 1
- endif
- # 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
- endif
- 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
- INSTALL_DIR = $(CURDIR)/..
- endif
- export 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 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)
- libc =
- baselibs =
- O = o
- A = a
- BASE_LIBS = $(libc) $(baselibs)
- ADVAPI32 = -ladvapi32
- COMCTL32 = -lcomctl32
- COMDLG32 = -lcomdlg32
- GDI32 = -lgdi32
- MPR = -lmpr
- SHELL32 = -lshell32
- USER32 = -luser32
- WSOCK32 = -lwsock32
- WINMM = -lwinmm
- WINSPOOL = -lwinspool
- OLE32 = -lole32
- UNISCRIBE = -lusp10
- UUID = -luuid
- # Used by src/makefile.w32-in, since Nmake barfs on $(func SOMETHING)
- OBJ0_c = $(patsubst $(BLD)%.$(O),$(CURDIR)%.c,$(OBJ0))
- OBJ1_c = $(patsubst $(BLD)%.$(O),$(CURDIR)%.c,$(OBJ1))
- OBJ2_c = $(patsubst $(BLD)%.$(O),$(CURDIR)%.c,$(OBJ2))
- ifdef NOOPT
- DEBUG_CFLAGS = -DEMACSDEBUG
- else
- DEBUG_CFLAGS =
- endif
- ifdef ENABLECHECKS
- CHECKING_CFLAGS = -DENABLE_CHECKING -DXASSERTS -fno-crossjumping
- else
- CHECKING_CFLAGS =
- endif
- MWINDOWS = -mwindows
- CFLAGS = -I. $(ARCH_CFLAGS) $(DEBUG_CFLAGS) $(CHECKING_CFLAGS) $(PROFILE_CFLAGS) $(USER_CFLAGS) $(LOCAL_FLAGS)
- ESC_CFLAGS = -I. $(ARCH_CFLAGS) $(DEBUG_CFLAGS) $(CHECKING_CFLAGS) $(PROFILE_CFLAGS) $(ESC_USER_CFLAGS) $(LOCAL_FLAGS)
- EMACS_EXTRA_C_FLAGS = -DUSE_CRT_DLL=1
- ifdef PROFILE
- PROFILE_CFLAGS = -pg
- PROFILE_LDFLAGS = -pg
- else
- PROFILE_CFLAGS =
- PROFILE_LDFLAGS =
- endif
- # 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.map
- ifdef NOOPT
- OBJDIR = oo
- else
- OBJDIR = oo-spd
- endif
- $(OBJDIR):; -mkdir "$(OBJDIR)"
- BLD = $(OBJDIR)/$(ARCH)
- stamp_BLD: $(OBJDIR)
- -mkdir "$(BLD)"
- echo $(BLD) > $@
- COMPILER_TEMP_FILES =
- CP = cp -f
- CP_DIR = cp -rf
- DEL = rm
- DEL_TREE = rm -r
- DIRNAME = $(notdir $(CURDIR))
- ifdef USING_SH
- IFNOTSAMEDIR = if [ ! -s ../$(DIRNAME)_same-dir.tst ] ; then
- FOREACH = for f in
- FORVAR = $${f}
- FORDO = ; do
- ENDFOR = ; done
- ENDIF = ; fi
- ARGQUOTE = '
- ifdef NEW_CYGWIN
- DQUOTE = "
- else
- DQUOTE = ""
- endif
- else
- IFNOTSAMEDIR = if not exist ../$(DIRNAME)_same-dir.tst
- FOREACH = for %%f in (
- FORVAR = %%f
- FORDO = ) do
- ENDFOR =
- ENDIF =
- ARGQUOTE = "
- DQUOTE = \"
- endif
- ifdef NODEBUG
- DEBUG_FLAG =
- DEBUG_LINK =
- else
- DEBUG_FLAG = $(DEBUG_INFO)
- DEBUG_LINK = $(DEBUG_INFO)
- endif
- ifdef NOCYGWIN
- NOCYGWIN = -mno-cygwin
- endif
- ifdef USER_LIBS
- USER_LIBS := $(patsubst %,-l%,$(USER_LIBS))
- endif
- PRAGMA_SYSTEM_HEADER = \#pragma GCC system_header
- ifeq "$(ARCH)" "i386"
- ifdef NOOPT
- ARCH_CFLAGS = -c $(DEBUG_FLAG) $(NOCYGWIN)
- else
- ARCH_CFLAGS = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \
- # -fbuiltin \
- # -finline-functions \
- # -fomit-frame-pointer
- endif
- ARCH_LDFLAGS = $(SYS_LDFLAGS)
- else
- ERROR Unknown architecture type "$(ARCH)".
- endif
- LINK_FLAGS = $(ARCH_LDFLAGS) $(DEBUG_LINK) $(PROFILE_LDFLAGS) $(NOCYGWIN) $(USER_LDFLAGS)
- export XMFLAGS
- .DEFAULT:
- $(BLD)/%.o: %.c
- $(CC) $(CFLAGS) $(CC_OUT)$@ $<
|