diff options
author | Michael Meissner <meissner@linux.vnet.ibm.com> | 2013-04-18 17:59:21 +0000 |
---|---|---|
committer | Michael Meissner <meissner@linux.vnet.ibm.com> | 2013-04-18 17:59:21 +0000 |
commit | b2553c5b89a44b1507fa3337a8e1cf383afc9f6a (patch) | |
tree | 583487dd2f9ad5f8ec3c9b8069619586402d64ec | |
parent | 98e3934470f9eb0d91635898a147d3bffb3a0eda (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.meissner | 78 | ||||
-rw-r--r-- | gcc/config.in | 23 | ||||
-rw-r--r-- | gcc/config/rs6000/driver-rs6000.c | 30 | ||||
-rw-r--r-- | gcc/config/rs6000/linux64.h | 33 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/sysv4.h | 42 | ||||
-rw-r--r-- | gcc/config/rs6000/x-rs6000 | 2 | ||||
-rwxr-xr-x | gcc/configure | 117 | ||||
-rw-r--r-- | gcc/configure.ac | 68 | ||||
-rw-r--r-- | gcc/doc/install.texi | 45 | ||||
-rw-r--r-- | gcc/gcc.c | 388 | ||||
-rw-r--r-- | gcc/gcc.h | 1 |
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. */ |