152284Sobrien/* Operating system specific defines to be used when targeting GCC for
290075Sobrien   hosting on Windows32, using a Unix style C library and tools.
3117395Skan   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
490075Sobrien   Free Software Foundation, Inc.
552284Sobrien
6132718SkanThis file is part of GCC.
752284Sobrien
8132718SkanGCC is free software; you can redistribute it and/or modify
952284Sobrienit under the terms of the GNU General Public License as published by
1052284Sobrienthe Free Software Foundation; either version 2, or (at your option)
1152284Sobrienany later version.
1252284Sobrien
13132718SkanGCC is distributed in the hope that it will be useful,
1452284Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1552284SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1652284SobrienGNU General Public License for more details.
1752284Sobrien
1852284SobrienYou should have received a copy of the GNU General Public License
19132718Skanalong with GCC; see the file COPYING.  If not, write to
20169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
21169689SkanBoston, MA 02110-1301, USA.  */
2252284Sobrien
23132718Skan#define TARGET_VERSION fprintf (stderr, " (x86 Cygwin)");
2452284Sobrien
25132718Skan#define EXTRA_OS_CPP_BUILTINS()  /* Nothing.  */
2690075Sobrien
2790075Sobrien#undef CPP_SPEC
28132718Skan#define CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \
2990075Sobrien  %{mno-win32:%{mno-cygwin: %emno-cygwin and mno-win32 are not compatible}} \
30132718Skan  %{mno-cygwin:-D__MSVCRT__ -D__MINGW32__ %{!ansi:%{mthreads:-D_MT}}}\
31132718Skan  %{!mno-cygwin:-D__CYGWIN32__ -D__CYGWIN__ %{!ansi:-Dunix} -D__unix__ -D__unix }\
3290075Sobrien  %{mwin32|mno-cygwin:-DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ %{!ansi:-DWINNT}}\
33132718Skan  %{!nostdinc:%{!mno-win32|mno-cygwin:-idirafter ../include/w32api%s -idirafter ../../include/w32api%s}}\
3490075Sobrien"
3552284Sobrien
3690075Sobrien#undef STARTFILE_SPEC
3790075Sobrien#define STARTFILE_SPEC "\
38132718Skan  %{shared|mdll: %{mno-cygwin:dllcrt2%O%s}}\
39132718Skan  %{!shared: %{!mdll: %{!mno-cygwin:crt0%O%s} %{mno-cygwin:crt2%O%s}\
4090075Sobrien  %{pg:gcrt0%O%s}}}\
4190075Sobrien"
4290075Sobrien
4352284Sobrien/* Normally, -lgcc is not needed since everything in it is in the DLL, but we
4452284Sobrien   want to allow things to be added to it when installing new versions of
4552284Sobrien   GCC without making a new CYGWIN.DLL, so we leave it.  Profiling is handled
46132718Skan   by calling the init function from main.  */
4752284Sobrien
4890075Sobrien#undef LIBGCC_SPEC
49132718Skan#define LIBGCC_SPEC \
50132718Skan  "%{mno-cygwin: %{mthreads:-lmingwthrd} -lmingw32} -lgcc	\
51132718Skan   %{mno-cygwin:-lmoldname -lmingwex -lmsvcrt}"
5252284Sobrien
5352284Sobrien/* We have to dynamic link to get to the system DLLs.  All of libc, libm and
5452284Sobrien   the Unix stuff is in cygwin.dll.  The import library is called
5552284Sobrien   'libcygwin.a'.  For Windows applications, include more libraries, but
5652284Sobrien   always include kernel32.  We'd like to specific subsystem windows to
5752284Sobrien   ld, but that doesn't work just yet.  */
5852284Sobrien
5952284Sobrien#undef LIB_SPEC
6090075Sobrien#define LIB_SPEC "\
6190075Sobrien  %{pg:-lgmon} \
6290075Sobrien  %{!mno-cygwin:-lcygwin} \
6390075Sobrien  %{mno-cygwin:%{mthreads:-lmingwthrd} -lmingw32} \
6490075Sobrien  %{mwindows:-lgdi32 -lcomdlg32} \
6590075Sobrien  -luser32 -lkernel32 -ladvapi32 -lshell32"
6652284Sobrien
67132718Skan#define LINK_SPEC "\
6890075Sobrien  %{mwindows:--subsystem windows} \
6990075Sobrien  %{mconsole:--subsystem console} \
7090075Sobrien  %{shared: %{mdll: %eshared and mdll are not compatible}} \
7190075Sobrien  %{shared: --shared} %{mdll:--dll} \
7290075Sobrien  %{static:-Bstatic} %{!static:-Bdynamic} \
7390075Sobrien  %{shared|mdll: -e \
7490075Sobrien    %{mno-cygwin:_DllMainCRTStartup@12} \
7590075Sobrien    %{!mno-cygwin:__cygwin_dll_entry@12}}\
76132718Skan  %{!mno-cygwin:--dll-search-prefix=cyg}"
7752284Sobrien
78132718Skan/* Allocate space for all of the machine-spec-specific stuff.
79132718Skan   Allocate enough space for cygwin -> mingw32  munging plus
80132718Skan   possible addition of "/mingw".  */
8152284Sobrien
82132718Skan#ifndef CYGWIN_MINGW_SUBDIR
83132718Skan#define CYGWIN_MINGW_SUBDIR "/mingw"
84132718Skan#endif
85132718Skan#define CYGWIN_MINGW_SUBDIR_LEN (sizeof (CYGWIN_MINGW_SUBDIR) - 1)
8652284Sobrien
87132718Skan#ifdef GPLUSPLUS_INCLUDE_DIR
88132718Skanchar cygwin_gplusplus_include_dir[sizeof (GPLUSPLUS_INCLUDE_DIR) + 1
89132718Skan				  + (CYGWIN_MINGW_SUBDIR_LEN)]
90132718Skan  = GPLUSPLUS_INCLUDE_DIR;
91132718Skan#undef GPLUSPLUS_INCLUDE_DIR
92132718Skan#define GPLUSPLUS_INCLUDE_DIR ((const char *) cygwin_gplusplus_include_dir)
93132718Skan#ifndef GEN_CVT_ARRAY
94132718Skan#define GEN_CVT_ARRAY
95132718Skan#endif
96132718Skan#endif
9752284Sobrien
98132718Skan#ifdef GPLUSPLUS_TOOL_INCLUDE_DIR
99132718Skanchar cygwin_gplusplus_tool_include_dir[sizeof (GPLUSPLUS_TOOL_INCLUDE_DIR) + 1
100132718Skan				       + CYGWIN_MINGW_SUBDIR_LEN]
101132718Skan  = GPLUSPLUS_TOOL_INCLUDE_DIR;
102132718Skan#undef GPLUSPLUS_TOOL_INCLUDE_DIR
103132718Skan#define GPLUSPLUS_TOOL_INCLUDE_DIR ((const char *) cygwin_gplusplus_tool_include_dir)
104132718Skan#ifndef GEN_CVT_ARRAY
105132718Skan#define GEN_CVT_ARRAY
106132718Skan#endif
107132718Skan#endif
10852284Sobrien
109132718Skan#ifdef GPLUSPLUS_BACKWARD_INCLUDE_DIR
110132718Skanchar cygwin_gplusplus_backward_include_dir[sizeof (GPLUSPLUS_BACKWARD_INCLUDE_DIR)  + 1
111132718Skan					   + CYGWIN_MINGW_SUBDIR_LEN]
112132718Skan  = GPLUSPLUS_BACKWARD_INCLUDE_DIR;
113132718Skan#undef GPLUSPLUS_BACKWARD_INCLUDE_DIR
114132718Skan#define GPLUSPLUS_BACKWARD_INCLUDE_DIR ((const char *) cygwin_gplusplus_backward_include_dir)
115132718Skan#ifndef GEN_CVT_ARRAY
116132718Skan#define GEN_CVT_ARRAY
117132718Skan#endif
118132718Skan#endif
11952284Sobrien
120132718Skan#ifdef LOCAL_INCLUDE_DIR
121132718Skanchar cygwin_local_include_dir[sizeof (LOCAL_INCLUDE_DIR)  + 1
122132718Skan			      + CYGWIN_MINGW_SUBDIR_LEN]
123132718Skan  = LOCAL_INCLUDE_DIR;
124132718Skan#undef LOCAL_INCLUDE_DIR
125132718Skan#define LOCAL_INCLUDE_DIR ((const char *) cygwin_local_include_dir)
126132718Skan#ifndef GEN_CVT_ARRAY
127132718Skan#define GEN_CVT_ARRAY
128132718Skan#endif
129132718Skan#endif
13052284Sobrien
131132718Skan#ifdef CROSS_INCLUDE_DIR
132132718Skanchar cygwin_cross_include_dir[sizeof (CROSS_INCLUDE_DIR) + 1
133132718Skan			      + CYGWIN_MINGW_SUBDIR_LEN]
134132718Skan  = CROSS_INCLUDE_DIR;
135132718Skan#undef CROSS_INCLUDE_DIR
136132718Skan#define CROSS_INCLUDE_DIR ((const char *) cygwin_cross_include_dir)
137132718Skan#ifndef GEN_CVT_ARRAY
138132718Skan#define GEN_CVT_ARRAY
139132718Skan#endif
140132718Skan#endif
14152284Sobrien
142132718Skan#ifdef TOOL_INCLUDE_DIR
143132718Skanchar cygwin_tool_include_dir[sizeof (TOOL_INCLUDE_DIR) + 1
144132718Skan			     + CYGWIN_MINGW_SUBDIR_LEN]
145132718Skan  = TOOL_INCLUDE_DIR;
146132718Skan#undef TOOL_INCLUDE_DIR
147132718Skan#define TOOL_INCLUDE_DIR ((const char *) cygwin_tool_include_dir)
14852284Sobrien
149258428Spfg#ifndef CROSS_DIRECTORY_STRUCTURE
150132718Skan#undef STANDARD_INCLUDE_DIR
151132718Skan#define STANDARD_INCLUDE_DIR "/usr/include"
152132718Skanchar cygwin_standard_include_dir[sizeof (STANDARD_INCLUDE_DIR) + 1
153132718Skan				 + CYGWIN_MINGW_SUBDIR_LEN]
154132718Skan  = STANDARD_INCLUDE_DIR;
155132718Skan#undef STANDARD_INCLUDE_DIR
156132718Skan#define STANDARD_INCLUDE_DIR ((const char *) cygwin_standard_include_dir)
157132718Skan#endif
15852284Sobrien
159132718Skan#ifndef GEN_CVT_ARRAY
160132718Skan#define GEN_CVT_ARRAY
161132718Skan#endif
162132718Skan#endif
16352284Sobrien
164132718Skan#ifndef GEN_CVT_ARRAY
165132718Skanextern char *cvt_to_mingw[];
166132718Skan#else
167132718Skanchar *cvt_to_mingw[] =
168132718Skan  {
169132718Skan#ifdef GPLUSPLUS_INCLUDE_DIR
170132718Skan    cygwin_gplusplus_include_dir,
171132718Skan#endif
17252284Sobrien
173132718Skan#ifdef GPLUSPLUS_TOOL_INCLUDE_DIR
174132718Skan    cygwin_gplusplus_tool_include_dir,
175132718Skan#endif
17652284Sobrien
177132718Skan#ifdef GPLUSPLUS_BACKWARD_INCLUDE_DIR
178132718Skan    cygwin_gplusplus_backward_include_dir,
179132718Skan#endif
18052284Sobrien
181132718Skan#ifdef LOCAL_INCLUDE_DIR
182132718Skan    cygwin_local_include_dir,
183132718Skan#endif
18452284Sobrien
185132718Skan#ifdef CROSS_INCLUDE_DIR
186132718Skan    cygwin_cross_include_dir,
187132718Skan#endif
18852284Sobrien
189132718Skan#ifdef TOOL_INCLUDE_DIR
190132718Skan    cygwin_tool_include_dir,
191132718Skan#endif
19252284Sobrien
193132718Skan#ifdef STANDARD_INCLUDE_DIR
194132718Skan    cygwin_standard_include_dir,
19552284Sobrien#endif
19652284Sobrien
197132718Skan    NULL
198132718Skan  };
199132718Skan#undef GEN_CVT_ARRAY
200132718Skan#endif /*GEN_CVT_ARRAY*/
20190075Sobrien
202132718Skanvoid mingw_scan (int, const char * const *, char **);
203132718Skan#if 1
204132718Skan#define GCC_DRIVER_HOST_INITIALIZATION \
205132718Skando \
206132718Skan{ \
207169689Skan  mingw_scan(argc, (const char * const *) argv, (char **) &spec_machine); \
208132718Skan  } \
209132718Skanwhile (0)
210132718Skan#else
211132718Skan#define GCC_DRIVER_HOST_INITIALIZATION \
212132718Skando \
213132718Skan{ \
214132718Skan  char *cprefix = concat (tooldir_base_prefix, spec_machine, \
215132718Skan			  dir_separator_str, NULL); \
216132718Skan  if (!IS_ABSOLUTE_PATH (cprefix)) \
217132718Skan    cprefix = concat (standard_exec_prefix, spec_machine, dir_separator_str, \
218132718Skan		      spec_version, dir_separator_str, tooldir_prefix, NULL); \
219132718Skan  add_prefix (&exec_prefixes,\
220132718Skan	      concat (cprefix, "../../../../", spec_machine, "/bin/", NULL), \
221132718Skan	      "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL); \
222132718Skan  add_prefix (&exec_prefixes, cprefix, \
223132718Skan	      "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL); \
224132718Skan  add_prefix (&startfile_prefixes,\
225132718Skan	      concat (standard_startfile_prefix, "w32api", NULL),\
226132718Skan	      "GCC", PREFIX_PRIORITY_LAST, 0, NULL);\
227169689Skan  mingw_scan(argc, (const char * const *) argv, &spec_machine); \
228132718Skan  } \
229132718Skanwhile (0)
23090075Sobrien#endif
231169689Skan
232169689Skan/* Binutils does not handle weak symbols from dlls correctly.  For now,
233169689Skan   do not use them unnecessarily in gthr-posix.h.  */
234169689Skan#define GTHREAD_USE_WEAK 0
235169689Skan
236169689Skan/* Every program on cygwin links against cygwin1.dll which contains
237169689Skan   the pthread routines.  There is no need to explicitly link them
238169689Skan   and the -pthread flag is not recognized.  */
239169689Skan#undef GOMP_SELF_SPECS
240169689Skan#define GOMP_SELF_SPECS ""
241