1 /* system description file for cygwin32.
2 Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
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 2, or (at your option)
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.
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Building under cygwin
23 * The approach I have taken with this port is to use primarily the UNIX
24 * code base adding stuff that is MS-Windows specific. This works quite
25 * well, and is in keeping with my perception of the cygwin philosophy.
26 * Note that if you make changes to this file you do NOT want to define
27 * WINDOWSNT, I repeat - do not define this, it will break everything
28 * horribly. What does get defined is HAVE_MS_WINDOWS, but this is
29 * done by configure and only applies to the window system.
31 * When building make sure your HOME path is unix style - i.e. without
34 * once you have done this, configure and make.
36 * windows '95 - I haven't tested this under '95, it will probably
37 * build but I konw there are some limitations with cygwin under 95 so
38 * YMMV. I build with NT4 SP3.
40 * Andy Piper <andy@xemacs.org> 8/1/98
41 * http://www.xemacs.freeserve.co.uk/ */
43 /* cheesy way to determine cygwin version */
46 #ifdef HAVE_CYGWIN_VERSION_H
47 #include <cygwin/version.h>
50 #define CYGWIN_VERSION_DLL_MAJOR 19
51 #define CYGWIN_VERSION_DLL_MINOR 0
54 #define CYGWIN_VERSION_DLL_MAJOR 18
55 #define CYGWIN_VERSION_DLL_MINOR 0
60 extern void cygwin32_win32_to_posix_path_list(const char*, char*);
61 extern int cygwin32_win32_to_posix_path_list_buf_size(const char*);
62 extern void cygwin32_posix_to_win32_path_list(const char*, char*);
63 extern int cygwin32_posix_to_win32_path_list_buf_size(const char*);
64 #if CYGWIN_VERSION_DLL_MAJOR < 20
69 extern int gettimeofday(struct timeval *tp, struct timezone *tzp);
70 extern int gethostname (char* name, int namelen);
71 extern char* mktemp(char *);
72 extern double logb(double);
74 extern int ioctl(int, int, ...);
76 extern int lstat(const char *path, struct stat *buf);
78 extern int readlink(const char *path, void *buf, unsigned int bufsiz);
79 extern int symlink(const char *name1, const char *name2);
81 extern int setitimer(int which, const struct itimerval *value,
82 struct itimerval *ovalue);
83 extern int utimes(char *file, struct timeval *tvp);
85 extern int srandom( unsigned seed);
89 #define SND_NODEFAULT 2
91 #define SND_FILENAME 0x2000L
93 #define SIF_TRACKPOS 0x0010
94 #define ICC_BAR_CLASSES 4
95 #define FW_BLACK FW_HEAVY
96 #define FW_ULTRABOLD FW_EXTRABOLD
97 #define FW_DEMIBOLD FW_SEMIBOLD
98 #define FW_ULTRALIGHT FW_EXTRALIGHT
99 #define APPCMD_FILTERINITS 0x20L
100 #define CBF_FAIL_SELFCONNECTIONS 0x1000
101 #define CBF_SKIP_ALLNOTIFICATIONS 0x3C0000
102 #define CBF_FAIL_ADVISES 0x4000
103 #define CBF_FAIL_POKES 0x10000
104 #define CBF_FAIL_REQUESTS 0x20000
105 #define SZDDESYS_TOPIC "System"
106 #define JOHAB_CHARSET 130
107 #define MAC_CHARSET 77
112 #ifndef SPI_GETWHEELSCROLLLINES
113 #define SPI_GETWHEELSCROLLLINES 104
115 #ifndef WHEEL_PAGESCROLL
116 #define WHEEL_PAGESCROLL (UINT_MAX)
119 #define WHEEL_DELTA 120
121 #ifndef WM_MOUSEWHEEL
122 #define WM_MOUSEWHEEL 0x20A
125 #define TCS_BOTTOM 0x0002
128 #define TCS_VERTICAL 0x0080
131 #define PBS_SMOOTH 0x01
133 #ifdef HAVE_MS_WINDOWS
138 #ifndef ORDINARY_LINK
139 #define ORDINARY_LINK
142 #define C_SWITCH_SYSTEM -Wno-sign-compare -fno-caller-saves
143 #define LIBS_SYSTEM -lwinmm
146 #define TEXT_START -1
150 #define UNEXEC "unexcw.o"
152 #ifdef CYGWIN_VERSION_DLL_MAJOR
154 /* ### FIXME: although defining BROKEN_SIGIO is correct for proper ^G
155 behavior, bugs in cygwin mean that xemacs locks up frequently if
160 #define PROCESS_IO_BLOCKING
162 #define strnicmp strncasecmp
166 #define OBJECTS_SYSTEM ntplay.o
167 #define HAVE_NATIVE_SOUND
169 #undef MAIL_USE_SYSTEM_LOCK
172 /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
173 * group of arguments and treat it as an array of the arguments. */
177 /* Define WORD_MACHINE if addresses and such have
178 * to be corrected before they can be used as byte counts. */
182 /* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend
183 the 24-bit bit field into an int. In other words, if bit fields
186 If you use NO_UNION_TYPE, this flag does not matter. */
188 #define EXPLICIT_SIGN_EXTEND
190 /* Data type of load average, as read out of kmem. */
192 #define LOAD_AVE_TYPE long
194 /* Convert that into an integer that is 100 for a load average of 1.0 */
196 #define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100.0 / FSCALE)
198 /* Define VIRT_ADDR_VARIES if the virtual addresses of
199 pure and impure space as loaded can vary, and even their
200 relative order cannot be relied on.
202 Otherwise Emacs assumes that text space precedes data space,
205 /* Text does precede data space, but this is never a safe assumption. */
206 #define VIRT_ADDR_VARIES
208 /* set this if you have a new version of cygwin
209 #define DATA_SEG_BITS 0x10000000
212 /* If you are compiling with a non-C calling convention but need to
213 declare vararg routines differently, put it here */
214 #define _VARARGS_ __cdecl
216 /* If you are providing a function to something that will call the
217 function back (like a signal handler and signal, or main) its calling
218 convention must be whatever standard the libraries expect */
219 #define _CALLBACK_ __cdecl
221 /* SYSTEM_TYPE should indicate the kind of system you are using.
222 It sets the Lisp variable system-type. */
224 #define SYSTEM_TYPE "cygwin32"
228 /* define MAIL_USE_FLOCK if the mailer uses flock
229 to interlock access to /usr/spool/mail/$USER.
230 The alternative is that a lock file named
231 /usr/spool/mail/$USER.lock. */
233 /* If the character used to separate elements of the executable path
234 is not ':', #define this to be the appropriate character constant. */
237 /* ============================================================ */
239 /* Here, add any special hacks needed
240 to make Emacs work on this system. For example,
241 you might define certain system call names that don't
242 exist on your system, or that do different things on
243 your system and must be used only through an encapsulation
244 (Which you should place, by convention, in sysdep.c). */
246 /* Define this to be the separator between path elements */
247 /* #define DIRECTORY_SEP XINT (Vdirectory_sep_char) */
249 /* Define this to be the separator between devices and paths */
250 #define DEVICE_SEP ':'
252 /* We'll support either convention on NT. */
253 #define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\')
254 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_))
255 #define EXEC_SUFFIXES ".exe:.com:.bat:.cmd:"
257 /* We need a little extra space, see ../../lisp/loadup.el */
258 #define SYSTEM_PURESIZE_EXTRA 15000
260 #define CYGWIN_CONV_PATH(src, dst) \
261 dst = alloca (cygwin32_win32_to_posix_path_list_buf_size(src)); \
262 cygwin32_win32_to_posix_path_list(src, dst)
263 #define CYGWIN_WIN32_PATH(src, dst) \
264 dst = alloca (cygwin32_posix_to_win32_path_list_buf_size(src)); \
265 cygwin32_posix_to_win32_path_list(src, dst)
271 #define FIRST_PTY_LETTER 'z'
273 /* Pseudo-terminal support under SVR4 only loops to deal with errors. */
275 #define PTY_ITERATION for (i = 0, c = 0; i < 1; i++)
277 /* This sets the name of the master side of the PTY. */
279 #define PTY_NAME_SPRINTF strcpy (pty_name, "/dev/ptmx");
281 /* This sets the name of the slave side of the PTY. On SysVr4,
282 grantpt(3) forks a subprocess, so keep sigchld_handler() from
283 intercepting that death. If any child but grantpt's should die
284 within, it should be caught after EMACS_UNBLOCK_SIGNAL. */
287 fd = open (pty_name, O_RDWR | O_NONBLOCK | OPEN_BINARY, 0)
289 #define PTY_TTY_NAME_SPRINTF \
291 extern char* ptsname(int); \
294 if (!(ptyname = ptsname (fd))) \
295 { close (fd); return -1; } \
296 strncpy (pty_name, ptyname, sizeof (pty_name)); \
297 pty_name[sizeof (pty_name) - 1] = 0; \
300 /* ============================================================ */