Commit 558c362a by Iain Sandoe

make darwin port a little more cross & cross native build friendly.

	*config/darwin-driver.c (darwin_find_version_from_kernel): New routine 
	cut from ... (darwin_default_min_version): Amended to provide defaults
	for the cross directory case.
	(darwin_driver_init): call darwin_default_min_version unconditionally.
	* config/darwin.h (DEF_MIN_OSX_VERSION): New.
	* config/darwin9.h: Likewise.
	* config/darwin10.h: Likewise.
	* config/rs6000/darwin7.h: Likewise.

From-SVN: r178679
parent 8c6a85e3
2011-09-08 Iain Sandoe <iains@gcc.gnu.org>
*config/darwin-driver.c (darwin_find_version_from_kernel): New routine
cut from ... (darwin_default_min_version): Amended to provide defaults
for the cross directory case.
(darwin_driver_init): call darwin_default_min_version unconditionally.
* config/darwin.h (DEF_MIN_OSX_VERSION): New.
* config/darwin9.h: Likewise.
* config/darwin10.h: Likewise.
* config/rs6000/darwin7.h: Likewise.
2011-09-08 Jakub Jelinek <jakub@redhat.com> 2011-09-08 Jakub Jelinek <jakub@redhat.com>
PR target/50310 PR target/50310
...@@ -29,9 +29,74 @@ along with GCC; see the file COPYING3. If not see ...@@ -29,9 +29,74 @@ along with GCC; see the file COPYING3. If not see
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include "xregex.h" #include "xregex.h"
static bool
darwin_find_version_from_kernel (char *new_flag)
{
char osversion[32];
size_t osversion_len = sizeof (osversion) - 1;
static int osversion_name[2] = { CTL_KERN, KERN_OSRELEASE };
int major_vers;
char minor_vers[6];
char * version_p;
char * version_pend;
/* Determine the version of the running OS. If we can't, warn user,
and do nothing. */
if (sysctl (osversion_name, ARRAY_SIZE (osversion_name), osversion,
&osversion_len, NULL, 0) == -1)
{
warning (0, "sysctl for kern.osversion failed: %m");
return false;
}
/* Try to parse the first two parts of the OS version number. Warn
user and return if it doesn't make sense. */
if (! ISDIGIT (osversion[0]))
goto parse_failed;
major_vers = osversion[0] - '0';
version_p = osversion + 1;
if (ISDIGIT (*version_p))
major_vers = major_vers * 10 + (*version_p++ - '0');
if (major_vers > 4 + 9)
goto parse_failed;
if (*version_p++ != '.')
goto parse_failed;
version_pend = strchr(version_p, '.');
if (!version_pend)
goto parse_failed;
if (! ISDIGIT (*version_p))
goto parse_failed;
strncpy(minor_vers, version_p, version_pend - version_p);
minor_vers[version_pend - version_p] = '\0';
/* The major kernel version number is 4 plus the second OS version
component. */
if (major_vers - 4 <= 4)
/* On 10.4 and earlier, the old linker is used which does not
support three-component system versions. */
sprintf (new_flag, "10.%d", major_vers - 4);
else
sprintf (new_flag, "10.%d.%s", major_vers - 4,
minor_vers);
return true;
parse_failed:
warning (0, "couldn%'t understand kern.osversion %q.*s",
(int) osversion_len, osversion);
return false;
}
#endif
/* When running on a Darwin system and using that system's headers and /* When running on a Darwin system and using that system's headers and
libraries, default the -mmacosx-version-min flag to be the version libraries, default the -mmacosx-version-min flag to be the version
of the system on which the compiler is running. */ of the system on which the compiler is running.
When building cross or native cross compilers, default to the OSX
version of the target (as provided by the most specific target header
included in tm.h). This may be overidden by setting the flag explicitly
(or by the MACOSX_DEPLOYMENT_TARGET environment). */
static void static void
darwin_default_min_version (unsigned int *decoded_options_count, darwin_default_min_version (unsigned int *decoded_options_count,
...@@ -40,13 +105,6 @@ darwin_default_min_version (unsigned int *decoded_options_count, ...@@ -40,13 +105,6 @@ darwin_default_min_version (unsigned int *decoded_options_count,
const unsigned int argc = *decoded_options_count; const unsigned int argc = *decoded_options_count;
struct cl_decoded_option *const argv = *decoded_options; struct cl_decoded_option *const argv = *decoded_options;
unsigned int i; unsigned int i;
char osversion[32];
size_t osversion_len = sizeof (osversion) - 1;
static int osversion_name[2] = { CTL_KERN, KERN_OSRELEASE };
char * version_p;
char * version_pend;
int major_vers;
char minor_vers[6];
static char new_flag[sizeof ("10.0.0") + 6]; static char new_flag[sizeof ("10.0.0") + 6];
/* If the command-line is empty, just return. */ /* If the command-line is empty, just return. */
...@@ -82,44 +140,20 @@ darwin_default_min_version (unsigned int *decoded_options_count, ...@@ -82,44 +140,20 @@ darwin_default_min_version (unsigned int *decoded_options_count,
} }
} }
/* Determine the version of the running OS. If we can't, warn user, #ifndef CROSS_DIRECTORY_STRUCTURE
and do nothing. */
if (sysctl (osversion_name, ARRAY_SIZE (osversion_name), osversion,
&osversion_len, NULL, 0) == -1)
{
warning (0, "sysctl for kern.osversion failed: %m");
return;
}
/* Try to parse the first two parts of the OS version number. Warn /* Try to find the version from the kernel, if we fail - we print a message
user and return if it doesn't make sense. */ and give up. */
if (! ISDIGIT (osversion[0])) if (!darwin_find_version_from_kernel (new_flag))
goto parse_failed; return;
major_vers = osversion[0] - '0';
version_p = osversion + 1; #else
if (ISDIGIT (*version_p))
major_vers = major_vers * 10 + (*version_p++ - '0'); /* For cross-compilers, default to the target OS version. */
if (major_vers > 4 + 9)
goto parse_failed; strncpy (new_flag, DEF_MIN_OSX_VERSION, sizeof (new_flag));
if (*version_p++ != '.')
goto parse_failed; #endif /* CROSS_DIRECTORY_STRUCTURE */
version_pend = strchr(version_p, '.');
if (!version_pend)
goto parse_failed;
if (! ISDIGIT (*version_p))
goto parse_failed;
strncpy(minor_vers, version_p, version_pend - version_p);
minor_vers[version_pend - version_p] = '\0';
/* The major kernel version number is 4 plus the second OS version
component. */
if (major_vers - 4 <= 4)
/* On 10.4 and earlier, the old linker is used which does not
support three-component system versions. */
sprintf (new_flag, "10.%d", major_vers - 4);
else
sprintf (new_flag, "10.%d.%s", major_vers - 4,
minor_vers);
/* Add the new flag. */ /* Add the new flag. */
++*decoded_options_count; ++*decoded_options_count;
...@@ -132,14 +166,8 @@ darwin_default_min_version (unsigned int *decoded_options_count, ...@@ -132,14 +166,8 @@ darwin_default_min_version (unsigned int *decoded_options_count,
(argc - 1) * sizeof (struct cl_decoded_option)); (argc - 1) * sizeof (struct cl_decoded_option));
return; return;
parse_failed:
warning (0, "couldn%'t understand kern.osversion %q.*s",
(int) osversion_len, osversion);
return;
} }
#endif /* CROSS_DIRECTORY_STRUCTURE */
/* Translate -filelist and -framework options in *DECODED_OPTIONS /* Translate -filelist and -framework options in *DECODED_OPTIONS
(size *DECODED_OPTIONS_COUNT) to use -Xlinker so that they are (size *DECODED_OPTIONS_COUNT) to use -Xlinker so that they are
considered to be linker inputs in the case that no other inputs are considered to be linker inputs in the case that no other inputs are
...@@ -192,7 +220,5 @@ darwin_driver_init (unsigned int *decoded_options_count, ...@@ -192,7 +220,5 @@ darwin_driver_init (unsigned int *decoded_options_count,
} }
} }
#ifndef CROSS_DIRECTORY_STRUCTURE
darwin_default_min_version (decoded_options_count, decoded_options); darwin_default_min_version (decoded_options_count, decoded_options);
#endif
} }
...@@ -945,4 +945,8 @@ extern void darwin_driver_init (unsigned int *,struct cl_decoded_option **); ...@@ -945,4 +945,8 @@ extern void darwin_driver_init (unsigned int *,struct cl_decoded_option **);
#undef SUPPORTS_INIT_PRIORITY #undef SUPPORTS_INIT_PRIORITY
#define SUPPORTS_INIT_PRIORITY 0 #define SUPPORTS_INIT_PRIORITY 0
/* When building cross-compilers (and native crosses) we shall default to
providing an osx-version-min of this unless overridden by the User. */
#define DEF_MIN_OSX_VERSION "10.4"
#endif /* CONFIG_DARWIN_H */ #endif /* CONFIG_DARWIN_H */
...@@ -27,3 +27,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -27,3 +27,6 @@ along with GCC; see the file COPYING3. If not see
"%:version-compare(>= 10.6 mmacosx-version-min= -no_compact_unwind) \ "%:version-compare(>= 10.6 mmacosx-version-min= -no_compact_unwind) \
%{!static:%{!static-libgcc: \ %{!static:%{!static-libgcc: \
%:version-compare(>= 10.6 mmacosx-version-min= -lSystem) } } %G %L" %:version-compare(>= 10.6 mmacosx-version-min= -lSystem) } } %G %L"
#undef DEF_MIN_OSX_VERSION
#define DEF_MIN_OSX_VERSION "10.6"
...@@ -51,3 +51,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -51,3 +51,7 @@ along with GCC; see the file COPYING3. If not see
fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", \ fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", \
_new_size, floor_log2 ((ALIGN) / BITS_PER_UNIT)); \ _new_size, floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
} while (0) } while (0)
#undef DEF_MIN_OSX_VERSION
#define DEF_MIN_OSX_VERSION "10.5"
...@@ -28,3 +28,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -28,3 +28,6 @@ along with GCC; see the file COPYING3. If not see
#define LIB_SPEC "%{!static:\ #define LIB_SPEC "%{!static:\
%:version-compare(!< 10.3 mmacosx-version-min= -lmx)\ %:version-compare(!< 10.3 mmacosx-version-min= -lmx)\
-lSystem}" -lSystem}"
#undef DEF_MIN_OSX_VERSION
#define DEF_MIN_OSX_VERSION "10.3.9"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment