1 /* Additional functions for the GCC driver on Darwin native.
2 Copyright (C) 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
3 Contributed by Apple Computer Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #ifndef CROSS_DIRECTORY_STRUCTURE
24 #include "coretypes.h"
28 #include <sys/sysctl.h>
31 /* When running on a Darwin system and using that system's headers and
32 libraries, default the -mmacosx-version-min flag to be the version
33 of the system on which the compiler is running. */
36 darwin_default_min_version (unsigned int *decoded_options_count,
37 struct cl_decoded_option **decoded_options)
39 const unsigned int argc = *decoded_options_count;
40 struct cl_decoded_option *const argv = *decoded_options;
43 size_t osversion_len = sizeof (osversion) - 1;
44 static int osversion_name[2] = { CTL_KERN, KERN_OSRELEASE };
49 static char new_flag[sizeof ("10.0.0") + 6];
51 /* If the command-line is empty, just return. */
55 /* Don't do this if the user specified -mmacosx-version-min= or
56 -mno-macosx-version-min. */
57 for (i = 1; i < argc; i++)
58 if (argv[i].opt_index == OPT_mmacosx_version_min_)
61 /* Retrieve the deployment target from the environment and insert
64 const char * macosx_deployment_target;
65 macosx_deployment_target = getenv ("MACOSX_DEPLOYMENT_TARGET");
66 if (macosx_deployment_target
67 /* Apparently, an empty string for MACOSX_DEPLOYMENT_TARGET means
68 "use the default". Or, possibly "use 10.1". We choose
69 to ignore the environment variable, as if it was never set. */
70 && macosx_deployment_target[0])
72 ++*decoded_options_count;
73 *decoded_options = XNEWVEC (struct cl_decoded_option,
74 *decoded_options_count);
75 (*decoded_options)[0] = argv[0];
76 generate_option (OPT_mmacosx_version_min_, macosx_deployment_target,
77 1, CL_DRIVER, &(*decoded_options)[1]);
78 memcpy (*decoded_options + 2, argv + 1,
79 (argc - 1) * sizeof (struct cl_decoded_option));
84 /* Determine the version of the running OS. If we can't, warn user,
86 if (sysctl (osversion_name, ARRAY_SIZE (osversion_name), osversion,
87 &osversion_len, NULL, 0) == -1)
89 warning (0, "sysctl for kern.osversion failed: %m");
93 /* Try to parse the first two parts of the OS version number. Warn
94 user and return if it doesn't make sense. */
95 if (! ISDIGIT (osversion[0]))
97 major_vers = osversion[0] - '0';
98 version_p = osversion + 1;
99 if (ISDIGIT (*version_p))
100 major_vers = major_vers * 10 + (*version_p++ - '0');
101 if (major_vers > 4 + 9)
103 if (*version_p++ != '.')
105 version_pend = strchr(version_p, '.');
108 if (! ISDIGIT (*version_p))
110 strncpy(minor_vers, version_p, version_pend - version_p);
111 minor_vers[version_pend - version_p] = '\0';
113 /* The major kernel version number is 4 plus the second OS version
115 if (major_vers - 4 <= 4)
116 /* On 10.4 and earlier, the old linker is used which does not
117 support three-component system versions. */
118 sprintf (new_flag, "10.%d", major_vers - 4);
120 sprintf (new_flag, "10.%d.%s", major_vers - 4,
123 /* Add the new flag. */
124 ++*decoded_options_count;
125 *decoded_options = XNEWVEC (struct cl_decoded_option,
126 *decoded_options_count);
127 (*decoded_options)[0] = argv[0];
128 generate_option (OPT_mmacosx_version_min_, new_flag,
129 1, CL_DRIVER, &(*decoded_options)[1]);
130 memcpy (*decoded_options + 2, argv + 1,
131 (argc - 1) * sizeof (struct cl_decoded_option));
135 warning (0, "couldn't understand kern.osversion %q.*s",
136 (int) osversion_len, osversion);
140 #endif /* CROSS_DIRECTORY_STRUCTURE */