invoke.texi: Document -print-multiarch.

2013-01-14  Matthias Klose  <doko@ubuntu.com>

	* doc/invoke.texi: Document -print-multiarch.
	* doc/install.texi: Document --enable-multiarch.
	* doc/fragments.texi: Document MULTILIB_OSDIRNAMES, MULTIARCH_DIRNAME.
	* configure.ac: Add --enable-multiarch option.
	Substitute with_cpu, with_float.
	* configure: Regenerate.
	* Makefile.in (s-mlib): Pass MULTIARCH_DIRNAME to genmultilib.
	enable_multiarch, with_cpu, with_float: New macros.
	if_multiarch: New macro, define in terms of enable_multiarch.
	* genmultilib: Add new argument for the multiarch name.
	* gcc.c (multiarch_dir): Define.
	(for_each_path): Search for multiarch suffixes.
	(driver_handle_option): Handle multiarch option.
	(do_spec_1): Pass -imultiarch if defined.
	(main): Print multiarch.
	(set_multilib_dir): Separate multilib and multiarch names
	from multilib_select.
	(print_multilib_info): Ignore multiarch names in multilib_select.
	* incpath.c (add_standard_paths): Search the multiarch include dirs.
	* cppdefault.h (default_include): Document multiarch in multilib
	member.
	* cppdefault.c: [LOCAL_INCLUDE_DIR, STANDARD_INCLUDE_DIR] Add an
        include directory for multiarch directories.
	* common.opt: New options --print-multiarch and -imultilib.

	* config.gcc <i[34567]86-*-linux* | x86_64-*-linux*> (tmake_file):
	Include i386/t-linux.
	<i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu> (tmake_file):
	Include i386/t-kfreebsd.
	<i[34567]86-*-gnu*> (tmake_file): Include i386/t-gnu.
	* config/i386/t-linux64: Add multiarch names in
	MULTILIB_OSDIRNAMES, define MULTIARCH_DIRNAME.
	* config/i386/t-gnu: New file.
	* config/i386/t-kfreebsd: Likewise.
	* config/i386/t-linux: Likewise.

	* config/sparc/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.
	* config/sparc/t-linux: New file; define MULTIARCH_DIRNAME.
	* config.gcc <sparc-*-linux*> (tmake_file): Include sparc/t-linux
	for 32bit non-biarch configurations.

	* config/pa/t-linux: New file; define MULTIARCH_DIRNAME.
	* config.gcc <hppa*64*-*-linux*, hppa*-*-linux*> (tmake_file):
	Include pa/t-linux.

	* config/mips/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.

	* config/arm/t-linux-eabi: Define MULTIARCH_DIRNAME for linux target.

	* config/rs6000/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.
	* config/rs6000/t-linux: New file; define MULTIARCH_DIRNAME.
	* config/rs6000/t-fprules (SOFT_FLOAT_CPUS): New macro. Add e300c2
	to the list.
	(MULTILIB_MATCHES_FLOAT): Define in terms of SOFT_FLOAT_CPUS.
	* config.gcc <powerpc-*-linux* | powerpc64-*-linux*> (tmake_file):
	Include rs6000/t-linux for 32bit non-biarch configurations.

	* config/s390/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.

	* config/m68k/t-linux: Define MULTIARCH_DIRNAME.

	* config/ia64/t-linux: New file; define MULTIARCH_DIRNAME.
	* config.gcc <ia64*-*-linux*> (tmake_file): Include ia64/t-linux.

	* config/alpha/t-linux: New file; define MULTIARCH_DIRNAME.
	* config.gcc <alpha*-*-linux*> (tmake_file): Include alpha/t-linux.

From-SVN: r195153
This commit is contained in:
Matthias Klose 2013-01-14 16:32:37 +00:00 committed by Matthias Klose
parent 77fd7d7410
commit 363bc42cf0
30 changed files with 405 additions and 52 deletions

View File

@ -1,3 +1,72 @@
2013-01-14 Matthias Klose <doko@ubuntu.com>
* doc/invoke.texi: Document -print-multiarch.
* doc/install.texi: Document --enable-multiarch.
* doc/fragments.texi: Document MULTILIB_OSDIRNAMES, MULTIARCH_DIRNAME.
* configure.ac: Add --enable-multiarch option.
Substitute with_cpu, with_float.
* configure: Regenerate.
* Makefile.in (s-mlib): Pass MULTIARCH_DIRNAME to genmultilib.
enable_multiarch, with_cpu, with_float: New macros.
if_multiarch: New macro, define in terms of enable_multiarch.
* genmultilib: Add new argument for the multiarch name.
* gcc.c (multiarch_dir): Define.
(for_each_path): Search for multiarch suffixes.
(driver_handle_option): Handle multiarch option.
(do_spec_1): Pass -imultiarch if defined.
(main): Print multiarch.
(set_multilib_dir): Separate multilib and multiarch names
from multilib_select.
(print_multilib_info): Ignore multiarch names in multilib_select.
* incpath.c (add_standard_paths): Search the multiarch include dirs.
* cppdefault.h (default_include): Document multiarch in multilib
member.
* cppdefault.c: [LOCAL_INCLUDE_DIR, STANDARD_INCLUDE_DIR] Add an
include directory for multiarch directories.
* common.opt: New options --print-multiarch and -imultilib.
* config.gcc <i[34567]86-*-linux* | x86_64-*-linux*> (tmake_file):
Include i386/t-linux.
<i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu> (tmake_file):
Include i386/t-kfreebsd.
<i[34567]86-*-gnu*> (tmake_file): Include i386/t-gnu.
* config/i386/t-linux64: Add multiarch names in
MULTILIB_OSDIRNAMES, define MULTIARCH_DIRNAME.
* config/i386/t-gnu: New file.
* config/i386/t-kfreebsd: Likewise.
* config/i386/t-linux: Likewise.
* config/sparc/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.
* config/sparc/t-linux: New file; define MULTIARCH_DIRNAME.
* config.gcc <sparc-*-linux*> (tmake_file): Include sparc/t-linux
for 32bit non-biarch configurations.
* config/pa/t-linux: New file; define MULTIARCH_DIRNAME.
* config.gcc <hppa*64*-*-linux*, hppa*-*-linux*> (tmake_file):
Include pa/t-linux.
* config/mips/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.
* config/arm/t-linux-eabi: Define MULTIARCH_DIRNAME for linux target.
* config/rs6000/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.
* config/rs6000/t-linux: New file; define MULTIARCH_DIRNAME.
* config/rs6000/t-fprules (SOFT_FLOAT_CPUS): New macro. Add e300c2
to the list.
(MULTILIB_MATCHES_FLOAT): Define in terms of SOFT_FLOAT_CPUS.
* config.gcc <powerpc-*-linux* | powerpc64-*-linux*> (tmake_file):
Include rs6000/t-linux for 32bit non-biarch configurations.
* config/s390/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES.
* config/m68k/t-linux: Define MULTIARCH_DIRNAME.
* config/ia64/t-linux: New file; define MULTIARCH_DIRNAME.
* config.gcc <ia64*-*-linux*> (tmake_file): Include ia64/t-linux.
* config/alpha/t-linux: New file; define MULTIARCH_DIRNAME.
* config.gcc <alpha*-*-linux*> (tmake_file): Include alpha/t-linux.
2013-01-14 Eric Botcazou <ebotcazou@adacore.com>
* tree-vectorizer.h (vect_get_single_scalar_iteraion_cost): Fix typo.

View File

@ -540,6 +540,21 @@ extra_modes_file=@extra_modes_file@
extra_opt_files=@extra_opt_files@
host_hook_obj=@out_host_hook_obj@
# Multiarch support
enable_multiarch = @enable_multiarch@
with_cpu = @with_cpu@
with_float = @with_float@
ifeq ($(enable_multiarch),yes)
if_multiarch = $(1)
else
ifeq ($(enable_multiarch),auto)
# SYSTEM_HEADER_DIR is makefile syntax, cannot be evaluated in configure.ac
if_multiarch = $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib/*/crti.o),$(1))
else
if_multiarch =
endif
endif
# ------------------------
# Installation directories
# ------------------------
@ -1833,10 +1848,11 @@ s-mlib: $(srcdir)/genmultilib Makefile
"$(MULTILIB_EXTRA_OPTS)" \
"$(MULTILIB_EXCLUSIONS)" \
"$(MULTILIB_OSDIRNAMES)" \
"$(MULTIARCH_DIRNAME)" \
"@enable_multilib@" \
> tmp-mlib.h; \
else \
$(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' no \
$(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' "$(MULTIARCH_DIRNAME)" no \
> tmp-mlib.h; \
fi
$(SHELL) $(srcdir)/../move-if-change tmp-mlib.h multilib.h

View File

@ -345,6 +345,9 @@ Driver Alias(print-multi-lib)
-print-multi-os-directory
Driver Alias(print-multi-os-directory)
-print-multiarch
Driver Alias(print-multiarch)
-print-prog-name
Driver Separate Alias(print-prog-name=)
@ -2260,6 +2263,10 @@ iplugindir=
Common Joined Var(plugindir_string) Init(0)
-iplugindir=<dir> Set <dir> to be the default plugin directory
imultiarch
Common Joined Separate RejectDriver Var(imultiarch) Init(0)
-imultiarch <dir> Set <dir> to be the multiarch include subdirectory
l
Driver Joined Separate
@ -2317,6 +2324,9 @@ Driver Var(print_multi_lib)
print-multi-os-directory
Driver Var(print_multi_os_directory)
print-multiarch
Driver Var(print_multiarch)
print-prog-name=
Driver JoinedOrMissing Var(print_prog_name)

View File

@ -777,6 +777,7 @@ esac
case ${target} in
alpha*-*-linux*)
tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h glibc-stdint.h"
tmake_file="${tmake_file} alpha/t-linux"
extra_options="${extra_options} alpha/elf.opt"
target_cpu_default="MASK_GAS"
;;
@ -1063,6 +1064,7 @@ hppa*64*-*-linux*)
tm_file="pa/pa64-start.h ${tm_file} dbxelf.h elfos.h gnu-user.h linux.h \
glibc-stdint.h pa/pa-linux.h pa/pa64-regs.h pa/pa-64.h \
pa/pa64-linux.h"
tmake_file="${tmake_file} pa/t-linux"
gas=yes gnu_ld=yes
need_64bit_hwint=yes
;;
@ -1070,6 +1072,7 @@ hppa*-*-linux*)
target_cpu_default="MASK_PA_11|MASK_NO_SPACE_REGS"
tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h pa/pa-linux.h \
pa/pa32-regs.h pa/pa32-linux.h"
tmake_file="${tmake_file} pa/t-linux"
;;
# port not yet contributed.
#hppa*-*-openbsd*)
@ -1548,7 +1551,7 @@ ia64*-*-freebsd*)
;;
ia64*-*-linux*)
tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ia64/sysv4.h ia64/linux.h"
tmake_file="${tmake_file} ia64/t-ia64 t-libunwind"
tmake_file="${tmake_file} ia64/t-ia64 ia64/t-linux t-libunwind"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
;;
ia64*-*-hpux*)
@ -2075,6 +2078,7 @@ powerpc-*-linux* | powerpc64-*-linux*)
;;
*)
tm_file="${tm_file} rs6000/linux.h glibc-stdint.h"
tmake_file="$tmake_file rs6000/t-linux"
;;
esac
case ${target} in
@ -2438,6 +2442,7 @@ sparc-*-linux*)
tmake_file="${tmake_file} sparc/t-linux64"
else
tm_file="${tm_file} sparc/linux.h"
tmake_file="${tmake_file} sparc/t-linux"
fi
;;
sparc-*-netbsdelf*)
@ -3559,9 +3564,14 @@ case ${target} in
i[34567]86-*-darwin* | x86_64-*-darwin*)
;;
i[34567]86-*-linux* | x86_64-*-linux* | \
i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
i[34567]86-*-gnu*)
i[34567]86-*-linux* | x86_64-*-linux*)
tmake_file="$tmake_file i386/t-linux"
;;
i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu)
tmake_file="$tmake_file i386/t-kfreebsd"
;;
i[34567]86-*-gnu*)
tmake_file="$tmake_file i386/t-gnu"
;;
i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
;;

1
gcc/config/alpha/t-linux Normal file
View File

@ -0,0 +1 @@
MULTIARCH_DIRNAME = $(call if_multiarch,alpha-linux-gnu)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2005, 2009, 2010, 2011 Free Software Foundation, Inc.
# Copyright (C) 2005-2012 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
@ -24,3 +24,8 @@ MULTILIB_DIRNAMES =
#MULTILIB_OPTIONS += mcpu=fa606te/mcpu=fa626te/mcpu=fmp626/mcpu=fa726te
#MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te
#MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te*
ifneq (,$(findstring gnueabi,$(target)))
ARM_EB = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),eb)
MULTIARCH_DIRNAME = $(call if_multiarch,arm$(ARM_EB)-linux-gnueabi$(if $(filter hard,$(with_float)),hf))
endif

1
gcc/config/i386/t-gnu Normal file
View File

@ -0,0 +1 @@
MULTIARCH_DIRNAME = $(call if_multiarch,i386-gnu)

View File

@ -0,0 +1,5 @@
MULTIARCH_DIRNAME = $(call if_multiarch,i386-kfreebsd-gnu)
# MULTILIB_OSDIRNAMES are set in t-linux64.
KFREEBSD_OS = $(filter kfreebsd%, $(word 3, $(subst -, ,$(target))))
MULTILIB_OSDIRNAMES := $(filter-out mx32=%,$(subst linux,$(KFREEBSD_OS),$(MULTILIB_OSDIRNAMES)))

1
gcc/config/i386/t-linux Normal file
View File

@ -0,0 +1 @@
MULTIARCH_DIRNAME = $(call if_multiarch,i386-linux-gnu)

View File

@ -34,6 +34,6 @@
comma=,
MULTILIB_OPTIONS = $(subst $(comma),/,$(TM_MULTILIB_CONFIG))
MULTILIB_DIRNAMES = $(patsubst m%, %, $(subst /, ,$(MULTILIB_OPTIONS)))
MULTILIB_OSDIRNAMES = m64=../lib64
MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)
MULTILIB_OSDIRNAMES+= mx32=../libx32
MULTILIB_OSDIRNAMES = m64=../lib64$(call if_multiarch,:x86_64-linux-gnu)
MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:i386-linux-gnu)
MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32)

1
gcc/config/ia64/t-linux Normal file
View File

@ -0,0 +1 @@
MULTIARCH_DIRNAME = $(call if_multiarch,ia64-linux-gnu)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc.
# Copyright (C) 2008, 2010, 2011, 2012 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
@ -19,6 +19,10 @@
# Only include multilibs for 680x0 and ColdFire CPUs with an MMU.
M68K_MLIB_CPU += && ((CPU ~ "^m680") || (CPU ~ "^mcf")) && (FLAGS ~ "FL_MMU")
ifeq ($(M68K_ARCH),m68k)
MULTIARCH_DIRNAME = $(call if_multiarch,m68k-linux-gnu)
endif
# This rule uses MULTILIB_MATCHES to generate a definition of
# SYSROOT_SUFFIX_SPEC.
sysroot-suffix.h: $(srcdir)/config/m68k/print-sysroot-suffix.sh

View File

@ -18,4 +18,9 @@
MULTILIB_OPTIONS = mabi=n32/mabi=32/mabi=64
MULTILIB_DIRNAMES = n32 32 64
MULTILIB_OSDIRNAMES = ../lib32 ../lib ../lib64
MIPS_EL = $(if $(filter %el, $(firstword $(subst -, ,$(target)))),el)
MIPS_SOFT = $(if $(strip $(filter MASK_SOFT_FLOAT_ABI, $(target_cpu_default)) $(filter soft, $(with_float))),soft)
MULTILIB_OSDIRNAMES = \
../lib32$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabin32$(MIPS_SOFT)) \
../lib$(call if_multiarch,:mips$(MIPS_EL)-linux-gnu$(MIPS_SOFT)) \
../lib64$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabi64$(MIPS_SOFT))

1
gcc/config/pa/t-linux Normal file
View File

@ -0,0 +1 @@
MULTIARCH_DIRNAME = $(call if_multiarch,hppa-linux-gnu)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2002, 2005, 2006, 2008, 2011 Free Software Foundation, Inc.
# Copyright (C) 2002, 2005, 2006, 2008, 2011, 2012 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
@ -16,17 +16,8 @@
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
MULTILIB_MATCHES_FLOAT = msoft-float=mcpu?401 \
msoft-float=mcpu?403 \
msoft-float=mcpu?405 \
msoft-float=mcpu?440 \
msoft-float=mcpu?464 \
msoft-float=mcpu?476 \
msoft-float=mcpu?ec603e \
msoft-float=mcpu?801 \
msoft-float=mcpu?821 \
msoft-float=mcpu?823 \
msoft-float=mcpu?860
SOFT_FLOAT_CPUS = e300c2 401 403 405 440 464 476 ec603e 801 821 823 860
MULTILIB_MATCHES_FLOAT = $(foreach cpu, $(SOFT_FLOAT_CPUS), msoft-float=mcpu?$(cpu))
# Build the libraries for both hard and soft floating point by default

View File

@ -0,0 +1,9 @@
# do not define the multiarch name if configured for a soft-float cpu
# or soft-float.
ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float)))
ifneq (,$(findstring spe,$(target)))
MULTIARCH_DIRNAME = powerpc-linux-gnuspe$(if $(findstring rs6000/e500-double.h, $(tm_file_list)),,v1)
else
MULTIARCH_DIRNAME = powerpc-linux-gnu
endif
endif

View File

@ -31,5 +31,7 @@ MULTILIB_DIRNAMES = 64 32 nof
MULTILIB_EXTRA_OPTS = fPIC mstrict-align
MULTILIB_EXCEPTIONS = m64/msoft-float
MULTILIB_EXCLUSIONS = m64/!m32/msoft-float
MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) nof
MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:powerpc64-linux-gnu)
MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu)
MULTILIB_OSDIRNAMES += nof
MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT)

View File

@ -7,4 +7,5 @@
MULTILIB_OPTIONS = m64/m31
MULTILIB_DIRNAMES = 64 32
MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)
MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:s390x-linux-gnu)
MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:s390-linux-gnu)

1
gcc/config/sparc/t-linux Normal file
View File

@ -0,0 +1 @@
MULTIARCH_DIRNAME = $(call if_multiarch,sparc-linux-gnu)

View File

@ -1,5 +1,5 @@
# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004,
# 2006, 2010, 2011 Free Software Foundation, Inc.
# 2006, 2010, 2011, 2012 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
@ -26,4 +26,5 @@
MULTILIB_OPTIONS = m64/m32
MULTILIB_DIRNAMES = 64 32
MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)
MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:sparc64-linux-gnu)
MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:sparc-linux-gnu)

40
gcc/configure vendored
View File

@ -764,6 +764,9 @@ SYSROOT_CFLAGS_FOR_TARGET
enable_shared
enable_fixed_point
enable_decimal_float
with_float
with_cpu
enable_multiarch
enable_multilib
ENABLE_BUILD_WITH_CXX
coverage_flags
@ -875,6 +878,7 @@ enable_gather_detailed_mem_stats
enable_build_with_cxx
with_stabs
enable_multilib
enable_multiarch
enable___cxa_atexit
enable_decimal_float
enable_fixed_point
@ -1576,6 +1580,7 @@ Optional Features:
enable detailed memory allocation stats gathering
--enable-build-with-cxx build with C++ compiler instead of C compiler
--enable-multilib enable library support for multiple ABIs
--enable-multiarch enable support for multiarch paths
--enable-__cxa_atexit enable __cxa_atexit for C++
--enable-decimal-float={no,yes,bid,dpd}
enable decimal float extension to C. Selecting 'bid'
@ -7030,6 +7035,37 @@ fi
# Determine whether or not multiarch is enabled.
# Check whether --enable-multiarch was given.
if test "${enable_multiarch+set}" = set; then :
enableval=$enable_multiarch; case "${enableval}" in
yes|no|auto) enable_multiarch=$enableval;;
*) as_fn_error "bad value ${enableval} given for --enable-multiarch option" "$LINENO" 5 ;;
esac
else
enable_multiarch=auto
fi
if test x${enable_multiarch} = xauto; then
if test x${with_native_system_header_dir} != x; then
ma_msg_suffix=", disabled auto check (configured with --native-system-header-dir)"
enable_multiarch=no
fi
if test x$host != x$target && test "x$with_sysroot" = x; then
ma_msg_suffix=", disabled auto check (cross build configured without --with-sysroot)"
enable_multiarch=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for multiarch configuration" >&5
$as_echo_n "checking for multiarch configuration... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_multiarch$ma_msg_suffix" >&5
$as_echo "$enable_multiarch$ma_msg_suffix" >&6; }
# needed for setting the multiarch name for soft-float/hard-float ABIs
# Enable __cxa_atexit for C++.
# Check whether --enable-__cxa_atexit was given.
if test "${enable___cxa_atexit+set}" = set; then :
@ -18010,7 +18046,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 18013 "configure"
#line 18049 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -18116,7 +18152,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 18119 "configure"
#line 18155 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H

View File

@ -623,6 +623,32 @@ AC_ARG_ENABLE(multilib,
[], [enable_multilib=yes])
AC_SUBST(enable_multilib)
# Determine whether or not multiarch is enabled.
AC_ARG_ENABLE(multiarch,
[AS_HELP_STRING([--enable-multiarch],
[enable support for multiarch paths])],
[case "${enableval}" in
yes|no|auto) enable_multiarch=$enableval;;
*) AC_MSG_ERROR(bad value ${enableval} given for --enable-multiarch option) ;;
esac], [enable_multiarch=auto])
if test x${enable_multiarch} = xauto; then
if test x${with_native_system_header_dir} != x; then
ma_msg_suffix=", disabled auto check (configured with --native-system-header-dir)"
enable_multiarch=no
fi
if test x$host != x$target && test "x$with_sysroot" = x; then
ma_msg_suffix=", disabled auto check (cross build configured without --with-sysroot)"
enable_multiarch=no
fi
fi
AC_MSG_CHECKING(for multiarch configuration)
AC_SUBST(enable_multiarch)
AC_MSG_RESULT($enable_multiarch$ma_msg_suffix)
# needed for setting the multiarch name for soft-float/hard-float ABIs
AC_SUBST(with_cpu)
AC_SUBST(with_float)
# Enable __cxa_atexit for C++.
AC_ARG_ENABLE(__cxa_atexit,
[AS_HELP_STRING([--enable-__cxa_atexit], [enable __cxa_atexit for C++])],

View File

@ -63,6 +63,7 @@ const struct default_include cpp_include_defaults[]
#endif
#ifdef LOCAL_INCLUDE_DIR
/* /usr/local/include comes before the fixincluded header files. */
{ LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 },
{ LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
#endif
#ifdef PREFIX_INCLUDE_DIR
@ -90,6 +91,7 @@ const struct default_include cpp_include_defaults[]
#endif
#ifdef NATIVE_SYSTEM_HEADER_DIR
/* /usr/include comes dead last. */
{ NATIVE_SYSTEM_HEADER_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 2 },
{ NATIVE_SYSTEM_HEADER_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 0 },
#endif
{ 0, 0, 0, 0, 0, 0 }

View File

@ -1,6 +1,6 @@
/* CPP Library.
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
1999, 2000, 2003, 2004, 2006, 2007, 2012 Free Software Foundation, Inc.
Contributed by Per Bothner, 1994-95.
Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987
@ -43,9 +43,11 @@ struct default_include
C++. */
const char add_sysroot; /* FNAME should be prefixed by
cpp_SYSROOT. */
const char multilib; /* FNAME should have the multilib path
specified with -imultilib
appended. */
const char multilib; /* FNAME should have appended
- the multilib path specified with -imultilib
when set to 1,
- the multiarch path specified with
-imultiarch, when set to 2. */
};
extern const struct default_include cpp_include_defaults[];

View File

@ -1,5 +1,5 @@
@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
@c 1999, 2000, 2001, 2003, 2004, 2005, 2008, 2011
@c 1999, 2000, 2001, 2003, 2004, 2005, 2008, 2011, 2012
@c Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
@ -93,6 +93,12 @@ Write one element in @code{MULTILIB_DIRNAMES} for each element in
default value will be @code{MULTILIB_OPTIONS}, with all slashes treated
as spaces.
@code{MULTILIB_DIRNAMES} describes the multilib directories using GCC
conventions and is applied to directories that are part of the GCC
installation. When multilib-enabled, the compiler will add a
subdirectory of the form @var{prefix}/@var{multilib} before each
directory in the search path for libraries and crt files.
For example, if @code{MULTILIB_OPTIONS} is set to @samp{m68000/m68020
msoft-float}, then the default value of @code{MULTILIB_DIRNAMES} is
@samp{m68000 m68020 msoft-float}. You may specify a different value if
@ -129,6 +135,60 @@ compiler. In that case, set @code{MULTILIB_EXTRA_OPTS} to be the list
of options to be used for all builds. If you set this, you should
probably set @code{CRTSTUFF_T_CFLAGS} to a dash followed by it.
@findex MULTILIB_OSDIRNAMES
@item MULTILIB_OSDIRNAMES
If @code{MULTILIB_OPTIONS} is used, this variable specifies
a list of subdirectory names, that are used to modify the search
path depending on the chosen multilib. Unlike @code{MULTILIB_DIRNAMES},
@code{MULTILIB_OSDIRNAMES} describes the multilib directories using
operating systems conventions, and is applied to the directories such as
@code{lib} or those in the @env{LIBRARY_PATH} environment variable.
The format is either the same as of
@code{MULTILIB_DIRNAMES}, or a set of mappings. When it is the same
as @code{MULTILIB_DIRNAMES}, it describes the multilib directories
using operating system conventions, rather than GCC conventions. When it is a set
of mappings of the form @var{gccdir}=@var{osdir}, the left side gives
the GCC convention and the right gives the equivalent OS defined
location. If the @var{osdir} part begins with a @samp{!},
GCC will not search in the non-multilib directory and use
exclusively the multilib directory. Otherwise, the compiler will
examine the search path for libraries and crt files twice; the first
time it will add @var{multilib} to each directory in the search path,
the second it will not.
For configurations that support both multilib and multiarch,
@code{MULTILIB_OSDIRNAMES} also encodes the multiarch name, thus
subsuming @code{MULTIARCH_DIRNAME}. The multiarch name is appended to
each directory name, separated by a colon (e.g.
@samp{../lib32:i386-linux-gnu}).
Each multiarch subdirectory will be searched before the corresponding OS
multilib directory, for example @samp{/lib/i386-linux-gnu} before
@samp{/lib/../lib32}. The multiarch name will also be used to modify the
system header search path, as explained for @code{MULTIARCH_DIRNAME}.
@findex MULTIARCH_DIRNAME
@item MULTIARCH_DIRNAME
This variable specifies the multiarch name for configurations that are
multiarch-enabled but not multilibbed configurations.
The multiarch name is used to augment the search path for libraries, crt
files and system header files with additional locations. The compiler
will add a multiarch subdirectory of the form
@var{prefix}/@var{multiarch} before each directory in the library and
crt search path. It will also add two directories
@code{LOCAL_INCLUDE_DIR}/@var{multiarch} and
@code{NATIVE_SYSTEM_HEADER_DIR}/@var{multiarch}) to the system header
search path, respectively before @code{LOCAL_INCLUDE_DIR} and
@code{NATIVE_SYSTEM_HEADER_DIR}.
@code{MULTIARCH_DIRNAME} is not used for configurations that support
both multilib and multiarch. In that case, multiarch names are encoded
in @code{MULTILIB_OSDIRNAMES} instead.
More documentation about multiarch can be found at
@uref{http://wiki.debian.org/Multiarch}.
@findex SPECS
@item SPECS
Unfortunately, setting @code{MULTILIB_EXTRA_OPTS} is not enough, since

View File

@ -1032,6 +1032,15 @@ For ARM targets, possible values for @var{dialect} are @code{gnu} or
@code{gnu2}, which select between the original GNU dialect and the GNU TLS
descriptor-based dialect.
@item --enable-multiarch
Specify whether to enable or disable multiarch support. The default is
to check for glibc start files in a multiarch location, and enable it
if the files are found. The auto detection is enabled for native builds,
and for cross builds configured with @option{--with-sysroot}, and without
@option{--with-native-system-header-dir}.
More documentation about multiarch can be found at
@uref{http://wiki.debian.org/Multiarch}.
@item --disable-multilib
Specify that multiple target
libraries to support different target variants, calling

View File

@ -6035,6 +6035,11 @@ sibling directories this prints e.g.@: @file{../lib64}, @file{../lib} or
@file{../lib32}, or if OS libraries are present in @file{lib/@var{subdir}}
subdirectories it prints e.g.@: @file{amd64}, @file{sparcv9} or @file{ev6}.
@item -print-multiarch
@opindex print-multiarch
Print the path to OS libraries for the selected multiarch,
relative to some @file{lib} subdirectory.
@item -print-prog-name=@var{program}
@opindex print-prog-name
Like @option{-print-file-name}, but searches for a program such as @samp{cpp}.

View File

@ -1153,6 +1153,11 @@ static const char *multilib_dir;
set_multilib_dir based on the compilation options. */
static const char *multilib_os_dir;
/* Subdirectory to use for locating libraries in multiarch conventions. Set by
set_multilib_dir based on the compilation options. */
static const char *multiarch_dir;
/* Structure to keep track of the specs that have been defined so far.
These are accessed using %(specname) in a compiler or link
@ -2078,6 +2083,7 @@ for_each_path (const struct path_prefix *paths,
struct prefix_list *pl;
const char *multi_dir = NULL;
const char *multi_os_dir = NULL;
const char *multiarch_suffix = NULL;
const char *multi_suffix;
const char *just_multi_suffix;
char *path = NULL;
@ -2095,11 +2101,14 @@ for_each_path (const struct path_prefix *paths,
}
if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
if (multiarch_dir)
multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL);
while (1)
{
size_t multi_dir_len = 0;
size_t multi_os_dir_len = 0;
size_t multiarch_len = 0;
size_t suffix_len;
size_t just_suffix_len;
size_t len;
@ -2108,16 +2117,15 @@ for_each_path (const struct path_prefix *paths,
multi_dir_len = strlen (multi_dir);
if (multi_os_dir)
multi_os_dir_len = strlen (multi_os_dir);
if (multiarch_suffix)
multiarch_len = strlen (multiarch_suffix);
suffix_len = strlen (multi_suffix);
just_suffix_len = strlen (just_multi_suffix);
if (path == NULL)
{
len = paths->max_len + extra_space + 1;
if (suffix_len > multi_os_dir_len)
len += suffix_len;
else
len += multi_os_dir_len;
len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len);
path = XNEWVEC (char, len);
}
@ -2146,6 +2154,16 @@ for_each_path (const struct path_prefix *paths,
break;
}
/* Now try the multiarch path. */
if (!skip_multi_dir
&& !pl->require_machine_suffix && multiarch_dir)
{
memcpy (path + len, multiarch_suffix, multiarch_len + 1);
ret = callback (path, callback_info);
if (ret)
break;
}
/* Now try the base path. */
if (!pl->require_machine_suffix
&& !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
@ -2970,6 +2988,9 @@ display_help (void)
fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
fputs (_("\
-print-multiarch Display the target's normalized GNU triplet, used as\n\
a component in the library path\n"), stdout);
fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
fputs (_("\
-print-multi-lib Display the mapping between command line options and\n\
@ -3244,6 +3265,7 @@ driver_handle_option (struct gcc_options *opts,
case OPT_print_multi_directory:
case OPT_print_sysroot:
case OPT_print_multi_os_directory:
case OPT_print_multiarch:
case OPT_print_sysroot_headers_suffix:
case OPT_time:
case OPT_wrapper:
@ -4896,6 +4918,15 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
do_spec_1 (" ", 0, NULL);
}
if (multiarch_dir)
{
do_spec_1 ("-imultiarch", 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
do_spec_1 (multiarch_dir, 1, NULL);
do_spec_1 (" ", 0, NULL);
}
if (gcc_exec_prefix)
{
do_spec_1 ("-iprefix", 1, NULL);
@ -6532,6 +6563,15 @@ main (int argc, char **argv)
return (0);
}
if (print_multiarch)
{
if (multiarch_dir == NULL)
printf ("\n");
else
printf ("%s\n", multiarch_dir);
return (0);
}
if (print_sysroot)
{
if (target_system_root)
@ -7302,7 +7342,9 @@ default_arg (const char *p, int len)
options are present, then we will ignore this completely. Passing
that, gcc will consider each multilib_select in turn using the same
rules for matching the options. If a match is found, that subdirectory
will be used. */
will be used.
A subdirectory name is optionally followed by a colon and the corresponding
multiarch name. */
static void
set_multilib_dir (void)
@ -7514,10 +7556,25 @@ set_multilib_dir (void)
q++;
if (q < end)
{
char *new_multilib_os_dir = XNEWVEC (char, end - q);
memcpy (new_multilib_os_dir, q + 1, end - q - 1);
new_multilib_os_dir[end - q - 1] = '\0';
multilib_os_dir = new_multilib_os_dir;
const char *q2 = q + 1, *ml_end = end;
char *new_multilib_os_dir;
while (q2 < end && *q2 != ':')
q2++;
if (*q2 == ':')
ml_end = q2;
new_multilib_os_dir = XNEWVEC (char, ml_end - q);
memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
new_multilib_os_dir[ml_end - q - 1] = '\0';
multilib_os_dir = *new_multilib_os_dir ? new_multilib_os_dir : ".";
if (q2 < end && *q2 == ':')
{
char *new_multiarch_dir = XNEWVEC (char, end - q2);
memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
new_multiarch_dir[end - q2 - 1] = '\0';
multiarch_dir = new_multiarch_dir;
}
break;
}
}
@ -7577,9 +7634,10 @@ print_multilib_info (void)
}
/* When --disable-multilib was used but target defines
MULTILIB_OSDIRNAMES, entries starting with .: are there just
to find multilib_os_dir, so skip them from output. */
if (this_path[0] == '.' && this_path[1] == ':')
MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
with .:: for multiarch configurations) are there just to find
multilib_os_dir, so skip them from output. */
if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':')
skip = 1;
/* Check for matches with the multilib_exclusions. We don't bother

View File

@ -1,6 +1,6 @@
#!/bin/sh
# Generates multilib.h.
# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2002, 2007
# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2002, 2007, 2012
# Free Software Foundation, Inc.
#This file is part of GCC.
@ -73,6 +73,8 @@
# the os directory names are used exclusively. Use the mapping when
# there is no one-to-one equivalence between GCC levels and the OS.
# The optional eighth argument is the multiarch name.
# The last option should be "yes" if multilibs are enabled. If it is not
# "yes", all GCC multilib dir names will be ".".
@ -121,7 +123,8 @@ exceptions=$4
extra=$5
exclusions=$6
osdirnames=$7
enable_multilib=$8
multiarch=$8
enable_multilib=$9
echo "static const char *const multilib_raw[] = {"
@ -222,6 +225,9 @@ fi
# names.
toosdirnames=
defaultosdirname=
if [ -n "${multiarch}" ]; then
defaultosdirname=::${multiarch}
fi
if [ -n "${osdirnames}" ]; then
set x ${osdirnames}
shift
@ -229,6 +235,9 @@ if [ -n "${osdirnames}" ]; then
case "$1" in
.=*)
defaultosdirname=`echo $1 | sed 's|^.=|:|'`
if [ -n "${multiarch}" ]; then
defaultosdirname=${defaultosdirname}:${multiarch}
fi
shift
;;
*=*)
@ -314,13 +323,13 @@ for combo in ${combinations}; do
dirout=`echo ${combo} | sed -e 's/=/-/g'`
fi
# Remove the leading and trailing slashes.
dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'`
dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'`
# Use the OS directory names rather than the option names.
if [ -n "${toosdirnames}" ]; then
osdirout=`echo ${combo} | sed ${toosdirnames}`
# Remove the leading and trailing slashes.
osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/$||g'`
osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'`
if [ "x${enable_multilib}" != xyes ]; then
dirout=".:${osdirout}"
disable_multilib=yes

View File

@ -150,8 +150,14 @@ add_standard_paths (const char *sysroot, const char *iprefix,
if (!filename_ncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
{
char *str = concat (iprefix, p->fname + len, NULL);
if (p->multilib && imultilib)
if (p->multilib == 1 && imultilib)
str = concat (str, dir_separator_str, imultilib, NULL);
else if (p->multilib == 2)
{
if (!imultiarch)
continue;
str = concat (str, dir_separator_str, imultiarch, NULL);
}
add_path (str, SYSTEM, p->cxx_aware, false);
}
}
@ -203,8 +209,14 @@ add_standard_paths (const char *sysroot, const char *iprefix,
else
str = update_path (p->fname, p->component);
if (p->multilib && imultilib)
if (p->multilib == 1 && imultilib)
str = concat (str, dir_separator_str, imultilib, NULL);
else if (p->multilib == 2)
{
if (!imultiarch)
continue;
str = concat (str, dir_separator_str, imultiarch, NULL);
}
add_path (str, SYSTEM, p->cxx_aware, false);
}