; Processor-independent options for Darwin.

; Copyright (C) 2005, 2007 Free Software Foundation, Inc.
;
; This file is part of GCC.
;
; GCC 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.
;
; GCC 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 GCC; see the file COPYING3.  If not see
; <http://www.gnu.org/licenses/>.

mfix-and-continue
Target Report Var(darwin_fix_and_continue)
Generate code suitable for fast turn around debugging

; The Init here is for the convenience of GCC developers, so that
; cc1 and cc1plus don't crash if no -mmacosx-version-min is passed.  The
; driver will always pass a -mmacosx-version-min, so in normal use
; the Init is never used.
mmacosx-version-min=
Target Joined Report Var(darwin_macosx_version_min) Init("10.1")
The earliest MacOS X version on which this program will run

mone-byte-bool
Target RejectNegative Report Var(darwin_one_byte_bool)
Set sizeof(bool) to 1

fapple-kext
Target Report C++ Var(flag_apple_kext)
Generate code for darwin loadable kernel extensions

mkernel
Target Report Var(flag_mkernel)
Generate code for the kernel or loadable kernel extensions

iframework
Target RejectNegative C ObjC C++ ObjC++ Joined Separate 
-iframework <dir>	Add <dir> to the end of the system framework include path
