aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2013-04-18 17:59:21 +0000
committerMichael Meissner <meissner@linux.vnet.ibm.com>2013-04-18 17:59:21 +0000
commitb2553c5b89a44b1507fa3337a8e1cf383afc9f6a (patch)
tree583487dd2f9ad5f8ec3c9b8069619586402d64ec
parent98e3934470f9eb0d91635898a147d3bffb3a0eda (diff)
Backport --with-extra-config to AT 5.0
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/ibm/gcc-4_6-prefixes@198061 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.meissner78
-rw-r--r--gcc/config.in23
-rw-r--r--gcc/config/rs6000/driver-rs6000.c30
-rw-r--r--gcc/config/rs6000/linux64.h33
-rw-r--r--gcc/config/rs6000/rs6000.h8
-rw-r--r--gcc/config/rs6000/sysv4.h42
-rw-r--r--gcc/config/rs6000/x-rs60002
-rwxr-xr-xgcc/configure117
-rw-r--r--gcc/configure.ac68
-rw-r--r--gcc/doc/install.texi45
-rw-r--r--gcc/gcc.c388
-rw-r--r--gcc/gcc.h1
12 files changed, 738 insertions, 97 deletions
diff --git a/gcc/ChangeLog.meissner b/gcc/ChangeLog.meissner
new file mode 100644
index 00000000000..54cca2b78a3
--- /dev/null
+++ b/gcc/ChangeLog.meissner
@@ -0,0 +1,78 @@
+2013-04-18 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ * configure.ac (--with-extra-prefix=): Add configure time switches
+ to add addition prefix directories for the compiler to search for
+ extra executables, startfiles, and directories to add to the list
+ of shared library locations.
+ (--with-extra-exec-prefix=): Likewise.
+ (--with-extra-include-prefix=): Likewise.
+ (--with-extra-startfile-prefix=): Likewise.
+ (--with-extra-rpath-prefix=): Likewise.
+ * configure: Regenerate.
+
+ * doc/install.texi (--with-extra-prefix=): Document new configure
+ switches.
+ (--with-extra-exec-prefix=): Likewise.
+ (--with-extra-include-prefix=): Likewise.
+ (--with-extra-startfile-prefix=): Likewise.
+ (--with-extra-rpath-prefix=): Likewise.
+
+ * gcc.c (LINK_RPATH_DIRS_SPEC): Add support for configuration time
+ additional executable, startfile, include, and shared library
+ location prefixes. Add %find-dynamic-linker(), %extra-rpath-dirs(),
+ %extra-cpu-dirs() as spec functions.
+ (LINK_COMMAND_SPEC): Likewise.
+ (CONFIGURE_INCLUDE_PREFIX): Likewise.
+ (CONFIGURE_STARTFILE_PREFIX): Likewise.
+ (configure_include_prefix): Likewise.
+ (configure_startfile_prefix): Likewise.
+ (configure_exec_prefix): Likewise.
+ (static_spec_functions): Likewise.
+ (IS_STD_DIR): Likewise.
+ (config_rpath): Likewise.
+ (build_rpath_or_cpu_dirs): Likewise.
+ (extra_rpath_dirs_spec_function): Likewsie.
+ (extra_cpu_dirs_spec_function): Likewise.
+ (find_dynamic_linker_spec_function): Likewise.
+ (add_multiple_prefix): New function that is like add_prefix, but
+ splits the prefix at PATH_SEPARATOR.
+ (process_command): Simplify processing COMPILER_PATH, LPATH, and
+ LIBRARY_PATH_ENV environment variables by using the function
+ add_multiple_prefix to do the splitting of the separate prefixes.
+ Add support for the configuration switch to add new executable,
+ startfile, include, and shared library prefixes.
+
+ * gcc.h (extra_cpu_dirs_spec_function): Add declaration.
+
+ * config.in (CONFIGURE_EXEC_PREFIX): Add defines for the configure
+ switches to add executable, startfile, include, and shared library
+ configuration directories.
+ (CONFIGURE_INCLUDE_PREFIX): Likewise.
+ (CONFIGURE_STARTFILE_PREFIX): Likewise.
+ (CONFIGURE_RPATH_PREFIX): Likewise.
+
+ * config/rs6000/x-rs6000 (driver-rs6000.o): Add $(GCC_H)
+ dependency.
+
+ * config/rs6000/linux64.h (GLIBC_DYNAMIC_LINKER32): If
+ --with-extra-startfile-prefix or --with-extra-prefix was used, use
+ %find-dynamic-linker() to find the dynamic linker in the startfile
+ prefixes.
+ (GLIBC_DYNAMIC_LINKER64): Likewise.
+ (LINUX_EXTRA_STATIC_LIBDIRS64): Likewise.
+ (LINK_OS_LINUX_SPEC32): Likewise.
+ (LINK_OS_LINUX_SPEC64): Likewise.
+ * config/rs6000/rs6000.h (EXTRA_SPEC_FUNCTIONS): Likewise.
+ (LOCAL_CPU_EXTR_SPEC_FUNCTIONS): Likewise.
+ * config/rs6000/sysv4.h (GLIBC_DYNAMIC_LINKER): Likewise.
+ (LINUX_EXTRA_STATIC_LIBDIRS32): Likewise.
+ (LINK_OS_LINUX_SPEC): Likewise.
+ (rs6000_extra_static_libdirs): Likewise.
+ (SUBTARGET_EXTRA_SPEC_FUNCTIONS): Likewise.
+
+ * config/rs6000/driver-rs6000.c (toplevel): Include gcc.h.
+ (rs6000_extra_static_libdirs): If we have extra configure
+ startfile prefixes, look for a machine specific file as a
+ subdirectory in the startfile prefixes if the user used
+ -mcpu=<xxx>.
+
diff --git a/gcc/config.in b/gcc/config.in
index 584ec65b2b7..0fed453a150 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -1976,3 +1976,26 @@
#undef vfork
#endif
+
+/* Define extra executable prefixes at configure time. */
+#ifndef USED_FOR_TARGET
+#undef CONFIGURE_EXEC_PREFIX
+#endif
+
+
+/* Define extra rpath prefixes at configure time. */
+#ifndef USED_FOR_TARGET
+#undef CONFIGURE_INCLUDE_PREFIX
+#endif
+
+
+/* Define extra startfile prefixes at configure time. */
+#ifndef USED_FOR_TARGET
+#undef CONFIGURE_STARTFILE_PREFIX
+#endif
+
+
+/* Define extra rpath prefixes at configure time. */
+#ifndef USED_FOR_TARGET
+#undef CONFIGURE_RPATH_PREFIX
+#endif
diff --git a/gcc/config/rs6000/driver-rs6000.c b/gcc/config/rs6000/driver-rs6000.c
index 11e76ea968f..2c5198923e9 100644
--- a/gcc/config/rs6000/driver-rs6000.c
+++ b/gcc/config/rs6000/driver-rs6000.c
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see
#include "coretypes.h"
#include "tm.h"
#include <stdlib.h>
+#include "gcc.h"
#ifdef _AIX
# include <sys/systemcfg.h>
@@ -545,3 +546,32 @@ host_detect_local_cpu (int argc, const char **argv)
#endif /* GCC_VERSION */
+
+#ifdef CONFIGURE_STARTFILE_PREFIX
+/* Add -L for all of the machine dependent directories found in the extra rpath
+ directories. We don't need to do this for dynamic links, since the dynamic
+ linker will pick up the right library based on the machine that is currently
+ running. */
+
+const char *
+rs6000_extra_static_libdirs (int argc, const char **argv)
+{
+ const char *new_argv[2];
+ const char *cpu;
+
+ if (argc == 1 && strncmp (argv[0], "mcpu=", sizeof ("-mcpu=")-1) == 0)
+ cpu = argv[0] + sizeof ("-mcpu=") - 1;
+
+ else if (argc == 2 && strcmp (argv[0], "-") == 0
+ && strncmp (argv[1], "mcpu=", sizeof ("mcpu=")-1) == 0)
+ cpu = argv[1] + sizeof ("mcpu=") - 1;
+
+ else
+ abort ();
+
+ new_argv[0] = cpu;
+ new_argv[1] = NULL;
+ return extra_cpu_dirs_spec_function (1, new_argv);
+}
+
+#endif /* !CONFIGURE_STARTFILE_PREFIX */
diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
index e6840d63e80..70cbf21bb5a 100644
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -1,7 +1,7 @@
/* Definitions of target machine for GNU compiler,
for 64 bit PowerPC linux.
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
- 2009, 2010, 2011 Free Software Foundation, Inc.
+ 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@@ -372,8 +372,14 @@ extern int dot_symbols;
#undef LINK_OS_DEFAULT_SPEC
#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
+#ifdef CONFIGURE_STARTFILE_PREFIX
+#define GLIBC_DYNAMIC_LINKER32 "%:find-dynamic-linker(/lib/ld.so.1)"
+#define GLIBC_DYNAMIC_LINKER64 "%:find-dynamic-linker(/lib64/ld64.so.1)"
+#else
#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
#define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1"
+#endif
+
#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
#if DEFAULT_LIBC == LIBC_UCLIBC
@@ -388,12 +394,33 @@ extern int dot_symbols;
#define LINUX_DYNAMIC_LINKER64 \
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
+#ifdef CONFIGURE_STARTFILE_PREFIX
+#ifdef HAVE_LOCAL_CPU_DETECT
+#define LINUX_EXTRA_STATIC_LIBDIRS64 \
+"%{static: \
+%{mcpu=native: %:linux_extra_static_libdirs(%:local_cpu_detect(cpu))} \
+%{!mcpu=native: %{mcpu=*: %:linux_extra_static_libdirs(%{mcpu=*}) }}} "
+
+#else
+#define LINUX_EXTRA_STATIC_LIBDIRS64 \
+"%{static: \
+%{mcpu=: %:linux_extra_static_libdirs(%{mcpu=*}) }} "
+#endif
+
+#else
+#define LINUX_EXTRA_STATIC_LIBDIRS64
+#endif
+
-#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \
+#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux " \
+LINUX_EXTRA_STATIC_LIBDIRS32 \
+"%{!shared: %{!static: \
%{rdynamic:-export-dynamic} \
-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}"
-#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \
+#define LINK_OS_LINUX_SPEC64 "-m elf64ppc " \
+LINUX_EXTRA_STATIC_LIBDIRS64 \
+"%{!shared: %{!static: \
%{rdynamic:-export-dynamic} \
-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}"
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 453b49f34de..ff8afa5017d 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -206,15 +206,21 @@
#if defined(__powerpc__) || defined(__POWERPC__) || defined(_AIX)
/* In driver-rs6000.c. */
extern const char *host_detect_local_cpu (int argc, const char **argv);
-#define EXTRA_SPEC_FUNCTIONS \
+#define LOCAL_CPU_EXTRA_SPEC_FUNCTIONS \
{ "local_cpu_detect", host_detect_local_cpu },
#define HAVE_LOCAL_CPU_DETECT
#define ASM_CPU_NATIVE_SPEC "%:local_cpu_detect(asm)"
#else
#define ASM_CPU_NATIVE_SPEC "%(asm_default)"
+#define LOCAL_CPU_EXTR_SPEC_FUNCTIONS
#endif
+#define SUBTARGET_EXTRA_SPEC_FUNCTIONS
+#define EXTRA_SPEC_FUNCTIONS \
+ SUBTARGET_EXTRA_SPEC_FUNCTIONS \
+ LOCAL_CPU_EXTRA_SPEC_FUNCTIONS
+
#ifndef CC1_CPU_SPEC
#ifdef HAVE_LOCAL_CPU_DETECT
#define CC1_CPU_SPEC \
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index aeb934f6ed5..e724d5187a7 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -818,7 +818,12 @@ extern int fixuplabelno;
#define LINK_START_LINUX_SPEC ""
+#ifdef CONFIGURE_STARTFILE_PREFIX
+#define GLIBC_DYNAMIC_LINKER "%:find-dynamic-linker(/lib/ld.so.1)"
+#else
#define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
+#endif
+
#define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
#if DEFAULT_LIBC == LIBC_UCLIBC
#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
@@ -830,7 +835,26 @@ extern int fixuplabelno;
#define LINUX_DYNAMIC_LINKER \
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
+#ifdef CONFIGURE_STARTFILE_PREFIX
+#ifdef HAVE_LOCAL_CPU_DETECT
+#define LINUX_EXTRA_STATIC_LIBDIRS32 \
+"%{static: \
+%{mcpu=native: %:linux_extra_static_libdirs(%:local_cpu_detect(cpu))} \
+%{!mcpu=native: %{mcpu=*: %:linux_extra_static_libdirs(%{mcpu=*}) }}} "
+
+#else
+#define LINUX_EXTRA_STATIC_LIBDIRS32 \
+"%{static: \
+%{mcpu=: %:linux_extra_static_libdirs(%{mcpu=*}) }} "
+#endif
+
+#else
+#define LINUX_EXTRA_STATIC_LIBDIRS32 ""
+#endif
+
+#define LINK_OS_LINUX_SPEC "-m elf32ppclinux " \
+LINUX_EXTRA_STATIC_LIBDIRS32 \
+"%{!shared: %{!static: \
%{rdynamic:-export-dynamic} \
-dynamic-linker " LINUX_DYNAMIC_LINKER "}}"
@@ -921,6 +945,22 @@ ncrtn.o%s"
#define CPP_OS_OPENBSD_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
#endif
+/* If we have additional startfiles, we want to use the dynamic linker from the
+ directories those startfiles are in. We also want to set the -rpath for
+ those directories.
+
+ Also if this is a static link, see if we have any processor specific
+ directories in the extra startfiles directories. We don't have to worry
+ about dynamic libraries, since the dynamic linker will include them
+ automatically. */
+#ifdef CONFIGURE_STARTFILE_PREFIX
+extern const char *rs6000_extra_static_libdirs (int argc, const char **argv);
+
+#undef SUBTARGET_EXTRA_SPEC_FUNCTIONS
+#define SUBTARGET_EXTRA_SPEC_FUNCTIONS \
+ { "linux_extra_static_libdirs", rs6000_extra_static_libdirs },
+#endif
+
/* Define any extra SPECS that the compiler needs to generate. */
/* Override rs6000.h definition. */
#undef SUBTARGET_EXTRA_SPECS
diff --git a/gcc/config/rs6000/x-rs6000 b/gcc/config/rs6000/x-rs6000
index 9e31f24cd64..ab526fd2584 100644
--- a/gcc/config/rs6000/x-rs6000
+++ b/gcc/config/rs6000/x-rs6000
@@ -1,3 +1,3 @@
driver-rs6000.o : $(srcdir)/config/rs6000/driver-rs6000.c \
- $(CONFIG_H) $(SYSTEM_H) $(TM_H) coretypes.h
+ $(CONFIG_H) $(SYSTEM_H) $(TM_H) coretypes.h $(GCC_H)
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
diff --git a/gcc/configure b/gcc/configure
index e0414d6cf9b..89e9459ba06 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -891,6 +891,11 @@ with_libiconv_prefix
enable_initfini_array
enable_sjlj_exceptions
with_system_libunwind
+with_extra_prefix
+with_extra_exec_prefix
+with_extra_startfile_prefix
+with_extra_include_prefix
+with_extra_rpath_prefix
enable_secureplt
enable_leading_mingw64_underscores
enable_cld
@@ -1654,6 +1659,21 @@ Optional Packages:
--with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
--without-libiconv-prefix don't search for libiconv in includedir and libdir
--with-system-libunwind use installed libunwind
+ --with-extra-prefix={prefixes}
+ Add extra prefixes to the list of locations to
+ search for all files
+ --with-extra-exec-prefix={prefixes}
+ Add extra prefixes to the list of locations to
+ search for executables
+ --with-extra-startfile-prefix={prefix}
+ Add extra prefixes to the list of locations to
+ search for startfiles
+ --with-extra-include-prefix={prefix}
+ Add extra prefixes to the list of locations to
+ search for system include files
+ --with-extra-rpath-prefix={prefixes}
+ Specify prefixes to pass to the linker via
+ -rpath=dir to locate shared libraries
--with-pic try to use only PIC/non-PIC objects [default=use
both]
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
@@ -11043,6 +11063,99 @@ case "$LIBINTL" in *$LIBICONV*)
LIBICONV= ;;
esac
+
+# Check whether --with-extra-prefix was given.
+if test "${with_extra_prefix+set}" = set; then :
+ withval=$with_extra_prefix; EXTRA_PREFIX="$withval"
+else
+ EXTRA_PREFIX=''
+fi
+
+
+
+# Check whether --with-extra-exec-prefix was given.
+if test "${with_extra_exec_prefix+set}" = set; then :
+ withval=$with_extra_exec_prefix; EXTRA_EXEC_PREFIX="$withval"
+else
+ if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_EXEC_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/bin:/g'`/bin"
+ else
+ EXTRA_EXEC_PREFIX=""
+ fi
+fi
+
+
+if test x"${EXTRA_EXEC_PREFIX}" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define CONFIGURE_EXEC_PREFIX "$EXTRA_EXEC_PREFIX"
+_ACEOF
+
+fi
+
+
+# Check whether --with-extra-startfile-prefix was given.
+if test "${with_extra_startfile_prefix+set}" = set; then :
+ withval=$with_extra_startfile_prefix; EXTRA_STARTFILE_PREFIX="$withval"
+else
+ if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_STARTFILE_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib"
+ else
+ EXTRA_STARTFILE_PREFIX=""
+ fi
+fi
+
+
+if test x"${EXTRA_STARTFILE_PREFIX}" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define CONFIGURE_STARTFILE_PREFIX "$EXTRA_STARTFILE_PREFIX"
+_ACEOF
+
+fi
+
+
+# Check whether --with-extra-include-prefix was given.
+if test "${with_extra_include_prefix+set}" = set; then :
+ withval=$with_extra_include_prefix; EXTRA_INCLUDE_PREFIX="$withval"
+else
+ if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_INCLUDE_PREFIX="${EXTRA_PREFIX}"
+ else
+ EXTRA_INCLUDE_PREFIX=""
+ fi
+fi
+
+
+if test x"${EXTRA_INCLUDE_PREFIX}" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define CONFIGURE_INCLUDE_PREFIX "$EXTRA_INCLUDE_PREFIX"
+_ACEOF
+
+fi
+
+
+# Check whether --with-extra-rpath-prefix was given.
+if test "${with_extra_rpath_prefix+set}" = set; then :
+ withval=$with_extra_rpath_prefix; EXTRA_RPATH_PREFIX="$withval"
+else
+ if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_RPATH_PREFIX="${prefix}/lib:`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib"
+ else
+ EXTRA_RPATH_PREFIX=""
+ fi
+fi
+
+
+if test x"${EXTRA_RPATH_PREFIX}" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define CONFIGURE_RPATH_PREFIX "$EXTRA_RPATH_PREFIX"
+_ACEOF
+
+fi
+
# Check whether --enable-secureplt was given.
if test "${enable_secureplt+set}" = set; then :
enableval=$enable_secureplt;
@@ -17495,7 +17608,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 17498 "configure"
+#line 17611 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -17601,7 +17714,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 17604 "configure"
+#line 17717 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 6c4d8a9b9ed..17bbe9d258e 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2,7 +2,7 @@
# Process this file with autoconf to generate a configuration script.
# Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
#This file is part of GCC.
@@ -1515,6 +1515,72 @@ case "$LIBINTL" in *$LIBICONV*)
LIBICONV= ;;
esac
+AC_ARG_WITH([extra-prefix],
+[AC_HELP_STRING([--with-extra-prefix={prefixes}],
+ [Add extra prefixes to the list of locations to search for all files])],
+ [EXTRA_PREFIX="$withval"],
+ [EXTRA_PREFIX=''])
+
+AC_ARG_WITH([extra-exec-prefix],
+[AC_HELP_STRING([--with-extra-exec-prefix={prefixes}],
+ [Add extra prefixes to the list of locations to search for executables])],
+ [EXTRA_EXEC_PREFIX="$withval"],
+ [if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_EXEC_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/bin:/g'`/bin"
+ else
+ EXTRA_EXEC_PREFIX=""
+ fi])
+
+if test x"${EXTRA_EXEC_PREFIX}" != x; then
+ AC_DEFINE_UNQUOTED(CONFIGURE_EXEC_PREFIX, "$EXTRA_EXEC_PREFIX",
+ [Extra executable prefixes])
+fi
+
+AC_ARG_WITH([extra-startfile-prefix],
+[AC_HELP_STRING([--with-extra-startfile-prefix={prefix}],
+ [Add extra prefixes to the list of locations to search for startfiles])],
+ [EXTRA_STARTFILE_PREFIX="$withval"],
+ [if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_STARTFILE_PREFIX="`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib"
+ else
+ EXTRA_STARTFILE_PREFIX=""
+ fi])
+
+if test x"${EXTRA_STARTFILE_PREFIX}" != x; then
+ AC_DEFINE_UNQUOTED(CONFIGURE_STARTFILE_PREFIX, "$EXTRA_STARTFILE_PREFIX",
+ [Extra startfile prefix])
+fi
+
+AC_ARG_WITH([extra-include-prefix],
+[AC_HELP_STRING([--with-extra-include-prefix={prefix}],
+ [Add extra prefixes to the list of locations to search for system include files])],
+ [EXTRA_INCLUDE_PREFIX="$withval"],
+ [if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_INCLUDE_PREFIX="${EXTRA_PREFIX}"
+ else
+ EXTRA_INCLUDE_PREFIX=""
+ fi])
+
+if test x"${EXTRA_INCLUDE_PREFIX}" != x; then
+ AC_DEFINE_UNQUOTED(CONFIGURE_INCLUDE_PREFIX, "$EXTRA_INCLUDE_PREFIX",
+ [Extra include file prefix])
+fi
+
+AC_ARG_WITH([extra-rpath-prefix],
+[AC_HELP_STRING([--with-extra-rpath-prefix={prefixes}],
+ [Specify prefixes to pass to the linker via -rpath=dir to locate shared libraries])],
+ [EXTRA_RPATH_PREFIX="$withval"],
+ [if test x"${EXTRA_PREFIX}" != x; then
+ EXTRA_RPATH_PREFIX="${prefix}/lib:`echo ${EXTRA_PREFIX} | sed 's/:/\\/lib:/g'`/lib"
+ else
+ EXTRA_RPATH_PREFIX=""
+ fi])
+
+if test x"${EXTRA_RPATH_PREFIX}" != x; then
+ AC_DEFINE_UNQUOTED(CONFIGURE_RPATH_PREFIX, "$EXTRA_RPATH_PREFIX",
+ [Extra rpath prefix])
+fi
+
AC_ARG_ENABLE(secureplt,
[ --enable-secureplt enable -msecure-plt by default for PowerPC],
[], [])
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 4ba2c877f04..be8a12aa86d 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -767,6 +767,51 @@ from the full GCC manuals, which are provided in Texinfo format. The manpages
are derived by an automatic conversion process from parts of the full
manual.)
+@item --with-extra-prefix=@var{prefix}
+Specify an additional prefix for finding executables, libraries, and
+startfiles when the compiler is run. By default no extra
+prefixes are used. This option sets the options
+@option{--with-extra-exec-prefix=},
+@option{--with-extra-include-prefix=},
+@option{--with-extra-startfiles-prefix=},
+and @option{--with-extra-rpath-prefix=} if they are not specified.
+
+@item --with-extra-exec-prefix=@var{prefixes}
+Specify additional prefixes for finding executables when the compiler
+is run. Each prefix is separated by the standard path sepator
+(usually colon, @option{:}). By default no extra prefixes are used.
+
+@item --with-extra-include-prefix=@var{prefixes}
+Specify additional prefixes for finding system include files when the
+compiler is run. Each prefix is separated by the standard path
+sepator (usually colon, @option{:}). By default no extra prefixes are
+used.
+
+@item --with-extra-startfile-prefix=@var{prefixes}
+Specify additional prefixes for finding libraries, and startfiles when
+the compiler is run. Each prefix is separated by the standard path
+sepator (usually colon, @option{:}). By default no extra prefixes are
+used.
+
+On powerpc64-linux systems, the dynamic linker will be searched for in
+the directories specified by the prefixed, that is used instead of the
+standard system dynamic linker.
+
+In addition on powerpc64-linux systems, if the user used static
+linking, as well as the @option{-mcpu=} option, the linker will be
+told to search in appropriate directories for libraries that are built
+for that particular machine. If dynamic linking is used, these cpu
+tuned libraries will not be searched, since the dynamic linker will
+load the appropriate cpu tuned library, based on the system that is
+executing the code.
+
+@item --with-extra-rpath-prefix=@var{prefixes}
+Specify additional directories for finding shared libraries when
+the compiler is run. Each prefix is separated by the standard path
+sepator (usually colon, @option{:}). By default no extra prefixes are
+used. If this option is used, each of the directories if they exist
+will be specified to the linker via the @option{-rpath=} option.
+
@item --with-gxx-include-dir=@var{dirname}
Specify
the installation directory for G++ header files. The default depends
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 75f522e1db5..9f98be360ed 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -200,6 +200,8 @@ static int access_check (const char *, int);
static char *find_a_file (const struct path_prefix *, const char *, int, bool);
static void add_prefix (struct path_prefix *, const char *, const char *,
int, int, int);
+static void add_multiple_prefix (struct path_prefix *, const char *,
+ const char *, int, int, int);
static void add_sysrooted_prefix (struct path_prefix *, const char *,
const char *, int, int, int);
static char *skip_whitespace (char *);
@@ -259,12 +261,15 @@ static const char *remove_outfile_spec_function (int, const char **);
static const char *version_compare_spec_function (int, const char **);
static const char *include_spec_function (int, const char **);
static const char *find_file_spec_function (int, const char **);
+static const char *find_dynamic_linker_spec_function (int, const char **);
static const char *find_plugindir_spec_function (int, const char **);
static const char *print_asm_header_spec_function (int, const char **);
static const char *compare_debug_dump_opt_spec_function (int, const char **);
static const char *compare_debug_self_opt_spec_function (int, const char **);
static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
static const char *pass_through_libs_spec_func (int, const char **);
+static const char *extra_rpath_dirs_spec_function (int, const char **);
+const char *extra_cpu_dirs_spec_function (int, const char **);
/* The Specs Language
@@ -636,6 +641,16 @@ proper position among the other output files. */
#endif
+#ifndef LINK_RPATH_DIRS_SPEC
+#ifdef CONFIGURE_RPATH_PREFIX
+/* Add extra -rpath= options if configured. */
+#define LINK_RPATH_DIRS_SPEC \
+ "%{!nostdlib:%{!nodefaultlibs:%{!static: %:extra-rpath-dirs()}}}"
+#else
+#define LINK_RPATH_DIRS_SPEC
+#endif
+#endif
+
/* -u* was put back because both BSD and SysV seem to support it. */
/* %{static:} simply prevents an error message if the target machine
doesn't handle -static. */
@@ -649,6 +664,7 @@ proper position among the other output files. */
#define LINK_COMMAND_SPEC "\
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
%(linker) \
+ "LINK_RPATH_DIRS_SPEC" \
%{"PLUGIN_COND": \
-plugin %(linker_plugin_file) \
-plugin-opt=%(lto_wrapper) \
@@ -1080,6 +1096,17 @@ static const char *gcc_libexec_prefix;
#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
#endif
+/* Additional directories added at configure time. */
+#ifndef CONFIGURE_INCLUDE_PREFIX
+#define CONFIGURE_INCLUDE_PREFIX ""
+#endif
+#ifndef CONFIGURE_STARTFILE_PREFIX
+#define CONFIGURE_STARTFILE_PREFIX ""
+#endif
+#ifndef CONFIGURE_EXEC_PREFIX
+#define CONFIGURE_EXEC_PREFIX ""
+#endif
+
#ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX
@@ -1118,6 +1145,12 @@ static const char *const standard_startfile_prefix_1
= STANDARD_STARTFILE_PREFIX_1;
static const char *const standard_startfile_prefix_2
= STANDARD_STARTFILE_PREFIX_2;
+static const char *const configure_startfile_prefix
+ = CONFIGURE_STARTFILE_PREFIX;
+static const char *const configure_exec_prefix
+ = CONFIGURE_EXEC_PREFIX;
+static const char *const configure_include_prefix
+ = CONFIGURE_INCLUDE_PREFIX;
/* A relative path to be used in finding the location of tools
relative to the driver. */
@@ -1232,12 +1265,15 @@ static const struct spec_function static_spec_functions[] =
{ "version-compare", version_compare_spec_function },
{ "include", include_spec_function },
{ "find-file", find_file_spec_function },
+ { "find-dynamic-linker", find_dynamic_linker_spec_function },
{ "find-plugindir", find_plugindir_spec_function },
{ "print-asm-header", print_asm_header_spec_function },
{ "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
{ "compare-debug-self-opt", compare_debug_self_opt_spec_function },
{ "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
{ "pass-through-libs", pass_through_libs_spec_func },
+ { "extra-rpath-dirs", extra_rpath_dirs_spec_function },
+ { "extra-cpu-dirs", extra_cpu_dirs_spec_function },
#ifdef EXTRA_SPEC_FUNCTIONS
EXTRA_SPEC_FUNCTIONS
#endif
@@ -2405,6 +2441,44 @@ add_prefix (struct path_prefix *pprefix, const char *prefix,
(*prev) = pl;
}
+/* Same as add_prefix, but split the prefix at each PATH_SEPARATOR. */
+static void
+add_multiple_prefix (struct path_prefix *pprefix, const char *prefix,
+ const char *component,
+ /* enum prefix_priority */ int priority,
+ int require_machine_suffix, int os_multilib)
+{
+ const char *startp, *endp;
+ char *nstore = (char *) alloca (strlen (prefix) + 3);
+
+ startp = endp = prefix;
+ while (1)
+ {
+ if (*endp == PATH_SEPARATOR || *endp == 0)
+ {
+ strncpy (nstore, startp, endp - startp);
+ if (endp == startp)
+ strcpy (nstore, concat (".", dir_separator_str, NULL));
+ else if (!IS_DIR_SEPARATOR (endp[-1]))
+ {
+ nstore[endp - startp] = DIR_SEPARATOR;
+ nstore[endp - startp + 1] = 0;
+ }
+ else
+ nstore[endp - startp] = 0;
+ add_prefix (pprefix, nstore, component, priority,
+ require_machine_suffix, os_multilib);
+ if (*endp == 0)
+ break;
+ endp = startp = endp + 1;
+ }
+ else
+ endp++;
+ }
+
+ return;
+}
+
/* Same as add_prefix, but prepending target_system_root to prefix. */
/* The target_system_root prefix has been relocated by gcc_exec_prefix. */
static void
@@ -3625,101 +3699,22 @@ process_command (unsigned int decoded_options_count,
temp = getenv ("COMPILER_PATH");
if (temp)
{
- const char *startp, *endp;
- char *nstore = (char *) alloca (strlen (temp) + 3);
-
- startp = endp = temp;
- while (1)
- {
- if (*endp == PATH_SEPARATOR || *endp == 0)
- {
- strncpy (nstore, startp, endp - startp);
- if (endp == startp)
- strcpy (nstore, concat (".", dir_separator_str, NULL));
- else if (!IS_DIR_SEPARATOR (endp[-1]))
- {
- nstore[endp - startp] = DIR_SEPARATOR;
- nstore[endp - startp + 1] = 0;
- }
- else
- nstore[endp - startp] = 0;
- add_prefix (&exec_prefixes, nstore, 0,
- PREFIX_PRIORITY_LAST, 0, 0);
- add_prefix (&include_prefixes, nstore, 0,
- PREFIX_PRIORITY_LAST, 0, 0);
- if (*endp == 0)
- break;
- endp = startp = endp + 1;
- }
- else
- endp++;
- }
+ add_multiple_prefix (&exec_prefixes, temp, 0,
+ PREFIX_PRIORITY_LAST, 0, 0);
+ add_multiple_prefix (&include_prefixes, temp, 0,
+ PREFIX_PRIORITY_LAST, 0, 0);
}
temp = getenv (LIBRARY_PATH_ENV);
if (temp && *cross_compile == '0')
- {
- const char *startp, *endp;
- char *nstore = (char *) alloca (strlen (temp) + 3);
-
- startp = endp = temp;
- while (1)
- {
- if (*endp == PATH_SEPARATOR || *endp == 0)
- {
- strncpy (nstore, startp, endp - startp);
- if (endp == startp)
- strcpy (nstore, concat (".", dir_separator_str, NULL));
- else if (!IS_DIR_SEPARATOR (endp[-1]))
- {
- nstore[endp - startp] = DIR_SEPARATOR;
- nstore[endp - startp + 1] = 0;
- }
- else
- nstore[endp - startp] = 0;
- add_prefix (&startfile_prefixes, nstore, NULL,
- PREFIX_PRIORITY_LAST, 0, 1);
- if (*endp == 0)
- break;
- endp = startp = endp + 1;
- }
- else
- endp++;
- }
- }
+ add_multiple_prefix (&startfile_prefixes, temp, NULL,
+ PREFIX_PRIORITY_LAST, 0, 1);
/* Use LPATH like LIBRARY_PATH (for the CMU build program). */
temp = getenv ("LPATH");
if (temp && *cross_compile == '0')
- {
- const char *startp, *endp;
- char *nstore = (char *) alloca (strlen (temp) + 3);
-
- startp = endp = temp;
- while (1)
- {
- if (*endp == PATH_SEPARATOR || *endp == 0)
- {
- strncpy (nstore, startp, endp - startp);
- if (endp == startp)
- strcpy (nstore, concat (".", dir_separator_str, NULL));
- else if (!IS_DIR_SEPARATOR (endp[-1]))
- {
- nstore[endp - startp] = DIR_SEPARATOR;
- nstore[endp - startp + 1] = 0;
- }
- else
- nstore[endp - startp] = 0;
- add_prefix (&startfile_prefixes, nstore, NULL,
- PREFIX_PRIORITY_LAST, 0, 1);
- if (*endp == 0)
- break;
- endp = startp = endp + 1;
- }
- else
- endp++;
- }
- }
+ add_multiple_prefix (&startfile_prefixes, temp, NULL,
+ PREFIX_PRIORITY_LAST, 0, 1);
/* Process the options and store input files and switches in their
vectors. */
@@ -3895,6 +3890,19 @@ process_command (unsigned int decoded_options_count,
}
#endif
+ /* Add prefixes specified by configure's --with-prefix. */
+ if (*configure_exec_prefix)
+ add_multiple_prefix (&exec_prefixes, configure_exec_prefix, "GCC",
+ PREFIX_PRIORITY_LAST, 0, 0);
+
+ if (*configure_include_prefix)
+ add_multiple_prefix (&include_prefixes, configure_include_prefix,
+ "GCC", PREFIX_PRIORITY_LAST, 0, 1);
+
+ if (*configure_startfile_prefix)
+ add_multiple_prefix (&startfile_prefixes, configure_startfile_prefix,
+ "GCC", PREFIX_PRIORITY_LAST, 0, 1);
+
/* More prefixes are enabled in main, after we read the specs file
and determine whether this is cross-compilation or not. */
@@ -8021,7 +8029,6 @@ find_file_spec_function (int argc, const char **argv)
return file;
}
-
/* %:find-plugindir spec function. This function replaces its argument
by the -iplugindir=<dir> option. `dir' is found thru find_file, that
is the -print-file-name gcc program option. */
@@ -8266,3 +8273,208 @@ pass_through_libs_spec_func (int argc, const char **argv)
}
return prepended;
}
+
+#define IS_STD_DIR(PATH,STD) (strncmp (PATH, STD, sizeof (STD)-1) == 0)
+
+#ifdef CONFIGURE_RPATH_PREFIX
+
+static const char config_rpath[] = CONFIGURE_RPATH_PREFIX;
+
+/* Common code for extra_rpath_dirs_spec_function and
+ extra_cpu_dirs_spec_function to build up a list of -rpath=<dir> or -L<dir>
+ options, based on the extra rpath directories that were configured in. */
+
+static char *
+build_rpath_or_cpu_dirs (const char *rpath_dirs,
+ const char *prefix,
+ const char *subdir)
+{
+ char *ret = NULL;
+ char *tmpstr, *endp, *prev_dir;
+ size_t rpath_len = strlen (rpath_dirs);
+ size_t subdir_len = (subdir) ? strlen (subdir) : 0;
+ size_t mlib_len = (multilib_os_dir) ? strlen (multilib_os_dir) : 0;
+ bool mlib_updir;
+ size_t i;
+
+ mlib_updir = (DIR_SEPARATOR == '/'
+ && mlib_len > sizeof ("../") - 1
+ && multilib_os_dir[0] == '.'
+ && multilib_os_dir[1] == '.'
+ && multilib_os_dir[2] == '/');
+
+ endp = tmpstr = XALLOCAVEC (char, rpath_len + subdir_len + mlib_len + 4);
+ prev_dir = NULL;
+ for (i = 0; i <= rpath_len; i++)
+ {
+ int ch = rpath_dirs[i];
+ if (ch != PATH_SEPARATOR && ch != '\0')
+ {
+ *endp++ = ch;
+ if (ch == DIR_SEPARATOR)
+ prev_dir = endp;
+ }
+ else if (endp > tmpstr)
+ {
+ /* Add current multlib directory. Convert <stuff>/lib/../lib64 into
+ <stuff>/lib64. */
+ if (mlib_len > 0)
+ {
+ if (mlib_updir && prev_dir)
+ {
+ memcpy (prev_dir, multilib_os_dir + 3, mlib_len - 3);
+ endp = prev_dir + mlib_len - 3;
+ }
+ else
+ {
+ *endp = DIR_SEPARATOR;
+ memcpy (endp+1, multilib_os_dir, mlib_len);
+ endp += mlib_len + 1;
+ }
+ }
+
+ /* Look for machine specific subdir? */
+ if (subdir)
+ {
+ *endp = DIR_SEPARATOR;
+ memcpy (endp+1, subdir, subdir_len);
+ endp += subdir_len + 1;
+ }
+
+ endp[0] = DIR_SEPARATOR;
+ endp[1] = '.';
+ endp[2] = '\0';
+
+ if (is_directory (tmpstr, false))
+ {
+ *endp = '\0';
+ if (ret)
+ ret = reconcat (ret, ret, " ", prefix, tmpstr, NULL);
+ else
+ ret = concat (prefix, tmpstr, NULL);
+ }
+
+ endp = tmpstr;
+ }
+ }
+
+ return ret;
+}
+
+/* %:extra-rpath-dirs spec function. If we have alternate rpath directories
+ (install lib directory + alternate startfile prefix directories), build a
+ string with all of the directories that are found with appropriate -rpath
+ options for the linker. If the LD_RUN_PATH environment variable is
+ specified, include this into the -rpath arguments, since LD_RUN_PATH is
+ only used if -rpath is not specified. */
+
+static const char *
+extra_rpath_dirs_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
+{
+ static const char path_sep[2] = { PATH_SEPARATOR, '\0' };
+ const char *ld_run_path = getenv ("LD_RUN_PATH");
+ const char *ret;
+
+ if (argc != 0)
+ abort ();
+
+ if (ld_run_path)
+ {
+ char *new_rpath = concat (config_rpath, path_sep, ld_run_path, NULL);
+ ret = build_rpath_or_cpu_dirs (new_rpath, "-rpath=", NULL);
+ free (new_rpath);
+ }
+ else
+ ret = build_rpath_or_cpu_dirs (config_rpath, "-rpath=", NULL);
+
+ return ret;
+}
+
+/* %:extra-cpu-dirs spec function. If we have alternate rpath directories,
+ search them to see if there are subdirectories that hold the static
+ libraries built for a particular machines, and return appropriate -L<dir>
+ to those directories. */
+
+const char *
+extra_cpu_dirs_spec_function (int argc, const char **argv)
+{
+ if (argc != 1)
+ abort ();
+
+ return build_rpath_or_cpu_dirs (config_rpath, "-L", argv[0]);
+}
+
+/* %:find-dynamic-linker spec function. Find the dynamic linker if we have
+ extra search paths configured. */
+
+static const char *
+find_dynamic_linker_spec_function (int argc, const char **argv)
+{
+ const char *file;
+ char *tmpstr;
+ char *endp;
+ char *prev_dir;
+ size_t len;
+ size_t i;
+ int ch;
+
+ if (argc < 1)
+ abort ();
+
+ file = argv[0];
+ len = strlen (file);
+ gcc_assert (file[0] == DIR_SEPARATOR);
+
+ endp = tmpstr = XALLOCAVEC (char, ARRAY_SIZE (config_rpath) + len + 1);
+ prev_dir = NULL;
+ for (i = 0; i <= ARRAY_SIZE (config_rpath); i++)
+ {
+ ch = config_rpath[i];
+ if (ch != PATH_SEPARATOR && ch != '\0')
+ {
+ if (ch == DIR_SEPARATOR)
+ prev_dir = endp;
+
+ *endp++ = ch;
+ }
+ else if (endp > tmpstr)
+ {
+ *endp = '\0';
+ if (prev_dir && strncmp (prev_dir, "/lib", sizeof ("/lib")-1) == 0)
+ endp = prev_dir;
+ memcpy (endp, file, len);
+ endp[len] = '\0';
+ if (access (tmpstr, X_OK) == 0)
+ return xstrdup (tmpstr);
+
+ endp = tmpstr;
+ }
+ }
+
+ return xstrdup (file);
+}
+
+#else
+const char *
+extra_rpath_dirs_spec_function (int argc ATTRIBUTE_UNUSED,
+ const char **argv ATTRIBUTE_UNUSED)
+{
+ return NULL;
+}
+
+const char *
+extra_cpu_dirs_spec_function (int argc ATTRIBUTE_UNUSED,
+ const char **argv ATTRIBUTE_UNUSED)
+{
+ return NULL;
+}
+
+static const char *
+find_dynamic_linker_spec_function (int argc, const char **argv)
+{
+ if (argc != 1)
+ abort ();
+
+ return xstrdup (argv[0]);
+}
+#endif
diff --git a/gcc/gcc.h b/gcc/gcc.h
index 091d9c86216..1455ebf6b29 100644
--- a/gcc/gcc.h
+++ b/gcc/gcc.h
@@ -37,6 +37,7 @@ extern int do_spec (const char *);
extern void record_temp_file (const char *, int, int);
extern void pfatal_with_name (const char *) ATTRIBUTE_NORETURN;
extern void set_input (const char *);
+extern const char *extra_cpu_dirs_spec_function (int, const char **);
/* Spec files linked with gcc.c must provide definitions for these. */