Merge the branches/eglibc stuff:

- Add support for eglibc

 /trunk/scripts/functions  |    6     4     2     0 ++++--
 /trunk/docs/CREDITS       |    1     1     0     0 +
 /trunk/config/libc.in     |   12    12     0     0 ++++++++++++
 /trunk/arch/arm/functions |    4     2     2     0 ++--
 4 files changed, 19 insertions(+), 4 deletions(-)
This commit is contained in:
Yann E. MORIN" 2008-08-11 12:22:47 +00:00
parent 57755ca74b
commit 59ef10f5d6
6 changed files with 433 additions and 4 deletions

View File

@ -6,8 +6,8 @@ CT_DoArchValues() {
# The system part of the tuple:
case "${CT_LIBC},${CT_ARCH_ARM_EABI}" in
glibc,) CT_TARGET_SYS=gnu;;
glibc,y) CT_TARGET_SYS=gnueabi;;
*glibc,) CT_TARGET_SYS=gnu;;
*glibc,y) CT_TARGET_SYS=gnueabi;;
uClibc,) CT_TARGET_SYS=uclibc;;
uClibc,y) CT_TARGET_SYS=uclibcgnueabi;;
esac

View File

@ -13,6 +13,13 @@ config LIBC_GLIBC
select LIBC_SUPPORT_NPTL
select LIBC_SUPPORT_LINUXTHREADS
config LIBC_EGLIBC
bool
prompt "eglibc (EXPERIMENTAL)"
select LIBC_SUPPORT_NPTL
select LIBC_SUPPORT_LINUXTHREADS
depends on EXPERIMENTAL
config LIBC_UCLIBC
bool
prompt "uClibc"
@ -26,6 +33,7 @@ config LIBC_VERSION
config LIBC
string
default "glibc" if LIBC_GLIBC
default "eglibc" if LIBC_EGLIBC
default "uClibc" if LIBC_UCLIBC
config LIBC_SUPPORT_NPTL
@ -40,6 +48,10 @@ if LIBC_GLIBC
source config/libc/glibc.in
endif
if LIBC_EGLIBC
source config/libc/eglibc.in
endif
if LIBC_UCLIBC
source config/libc/uClibc.in
endif

131
config/libc/eglibc.in Normal file
View File

@ -0,0 +1,131 @@
# eglibc options
choice
bool
prompt "eglibc version"
config EGLIBC_V_TRUNK
bool
prompt "'trunk'"
help
Selecting this will export the trunk of the eglibc subversion repository.
config EGLIBC_V_2_5
bool
prompt "2.5"
config EGLIBC_V_2_6
bool
prompt "2.6"
config EGLIBC_V_2_7
bool
prompt "2.7"
config EGLIBC_V_2_8
bool
prompt "2.8"
# CT_INSERT_VERSION_ABOVE
# Don't remove above line!
endchoice
config LIBC_VERSION
string
default "trunk" if EGLIBC_V_TRUNK
default "2_5" if EGLIBC_V_2_5
default "2_6" if EGLIBC_V_2_6
default "2_7" if EGLIBC_V_2_7
default "2_8" if EGLIBC_V_2_8
# CT_INSERT_VERSION_STRING_ABOVE
# Don't remove above line!
config EGLIBC_REVISION
string
prompt "Revision to use"
default "HEAD"
help
Enter the revision of trunk you want to use.
Default is HEAD.
A revision argument can be one of:
NUMBER revision number
'{' DATE '}' revision at start of the date (*)
'HEAD' latest in repository
(*) If you want to use a date, please use ISO-8601 formats if
at all possible.
config EGLIBC_CHECKOUT
bool
prompt "checkout instead of export"
default y if EGLIBC_V_TRUNK
default n if ! EGLIBC_V_TRUNK
help
By default, the eglibc download will be an export of the subversion
repository. If you say 'y' here, then the repository will instead be
checked-out, so that you can update it later.
Note that crosstool-NG will *not* update your working copy, you will
have to do that yourself.
config LIBC_EGLIBC_EXTRA_CONFIG
string
prompt "eglibc extra config"
default ""
help
Extra flags to pass onto ./configure when configuring eglibc.
Eg.: --enable-static-nss
config LIBC_EGLIBC_EXTRA_CFLAGS
string
prompt "eglibc extra target CFLAGS"
default ""
help
Extra target CFLAGS to use when building eglibc.
config LIBC_EXTRA_CC_ARGS
string
prompt "gcc extra flags"
default ""
help
Extra flags to pass gcc when building eglibc.
Seldom used, except for sparc64 which seems to need the flag -64
to be passed onto gcc.
config LIBC_EGLIBC_USE_PORTS
bool
prompt "Use the ports addon"
default n
help
The ports addon contains some architecture ports that are not available
in the official glibc distribution.
For example, this is the case for ARM with glibc >= 2.4
Say n only if you're sure that your architecture is in the official
glibc distribution for your chosen version.
config LIBC_ADDONS
bool
prompt "Pass extra addons list"
default n
help
If you say Y here, you'll be able to give the list of addons you want to
include in your C library.
config LIBC_ADDONS_LIST
string
prompt "Extra addons"
default ""
depends on LIBC_ADDONS
help
Extra addons to include in eglibc. Space separated list.
You need to specify neither linuxthreads nor nptl, as they are added
automagically for you depending on the threading model you choosed
earlier.
Eg.: crypt (for very old glibces)

View File

@ -56,6 +56,7 @@ And in order of appearance on the crossgcc ML:
Thomas Jourdan:
- intense gcc-4.3 brainstorming
- eglibc support
Many others have contributed, either in form of patches, suggestions,
comments, or testing... Thank you to all of you!

View File

@ -0,0 +1,283 @@
# eglibc build functions (initially by Thomas JOURDAN).
do_print_filename() {
[ "${CT_LIBC}" = "eglibc" ] || return 0
echo "eglibc-${CT_LIBC_VERSION}"
for addon in $(do_libc_add_ons_list " "); do
# NPTL addon is not to be downloaded, in any case
[ "${addon}" = "nptl" ] && continue || true
echo "eglibc-${addon}-${CT_LIBC_VERSION}"
done
}
# Download eglibc repository
do_eglibc_get() {
CT_HasOrAbort svn
case "${CT_LIBC_VERSION}" in
trunk) svn_url="svn://svn.eglibc.org/trunk";;
*) svn_url="svn://svn.eglibc.org/branches/eglibc-${CT_LIBC_VERSION}";;
esac
CT_MktempDir tmp_dir
CT_Pushd "${tmp_dir}"
case "${CT_EGLIBC_CHECKOUT}" in
y) svn_action="checkout";;
*) svn_action="export --force";;
esac
CT_DoSetProxy ${CT_PROXY_TYPE}
CT_DoExecLog ALL svn ${svn_action} -r "${CT_EGLIBC_REVISION:-HEAD}" "${svn_url}" . 2>&1
# Compress eglibc
CT_DoExecLog ALL mv libc "${CT_LIBC_FILE}"
CT_DoExecLog ALL tar cjf "${CT_TARBALLS_DIR}/${CT_LIBC_FILE}.tar.bz2" "${CT_LIBC_FILE}"
# Compress linuxthreads, localedef and ports
# Assign them the name the way ct-ng like it
for addon in linuxthreads localedef ports; do
CT_DoExecLog ALL tar cjf "${CT_TARBALLS_DIR}/${CT_LIBC}-${addon}-${CT_LIBC_VERSION}.tar.bz2" "${addon}"
done
CT_Popd
# Remove source files
CT_DoExecLog ALL rm -rf "${tmp_dir}"
}
# Download glibc
do_libc_get() {
# eglibc is only available through subversion, there are no
# snapshots available. Moreover, addons will be downloaded
# simultaneously.
# build filename
eglibc="${CT_LIBC_FILE}.tar.bz2"
eglibc_linuxthreads="${CT_LIBC}-linuxthreads-${CT_LIBC_VERSION}.tar.bz2"
eglibc_localedef="${CT_LIBC}-localedef-${CT_LIBC_VERSION}.tar.bz2"
eglibc_ports="${CT_LIBC}-ports-${CT_LIBC_VERSION}.tar.bz2"
# Check if every tarballs are already present
if [ -a "${CT_TARBALLS_DIR}/${eglibc}" ] && \
[ -a "${CT_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \
[ -a "${CT_TARBALLS_DIR}/${eglibc_localedef}" ] && \
[ -a "${CT_TARBALLS_DIR}/${eglibc_ports}" ]; then
CT_DoLog DEBUG "Already have 'eglibc-${CT_LIBC_VERSION}'"
return 0
fi
if [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc}" ] && \
[ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \
[ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_localedef}" ] && \
[ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_ports}" ] && \
[ "${CT_FORCE_DOWNLOAD}" != "y" ]; then
CT_DoLog EXTRA "Got 'eglibc-${CT_LIBC_VERSION}' from local storage"
for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${file}"
done
return 0
fi
# Not found locally, try from the network
CT_DoLog EXTRA "Retrieving eglibc from network"
do_eglibc_get
if [ "${CT_SAVE_TARBALLS}" = "y" ]; then
CT_DoLog EXTRA "Saving eglibc files to local storage"
for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
CT_DoExecLog ALL mv -f "${file}" "${CT_LOCAL_TARBALLS_DIR}"
CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${file}"
done
fi
return 0
}
# Extract eglibc
do_libc_extract() {
CT_ExtractAndPatch "${CT_LIBC_FILE}"
# C library addons
for addon in $(do_libc_add_ons_list " "); do
# NPTL addon is not to be extracted, in any case
[ "${addon}" = "nptl" ] && continue || true
CT_ExtractAndPatch "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
done
return 0
}
# There is nothing to do for eglibc check config
do_libc_check_config() {
:
}
# This function installs the glibc headers needed to build the core compiler
do_libc_headers() {
# Instead of doing two time the same actions, headers will
# be installed with start files
:
}
# Build and install start files
do_libc_start_files() {
CT_DoStep INFO "Installing C library headers / start files"
mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
cd "${CT_BUILD_DIR}/build-libc-startfiles"
CT_DoLog EXTRA "Configuring C library"
cross_cc=$(CT_Which "${CT_TARGET}-gcc")
cross_cxx=$(CT_Which "${CT_TARGET}-g++")
cross_ar=$(CT_Which "${CT_TARGET}-ar")
cross_ranlib=$(CT_Which "${CT_TARGET}-ranlib")
CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
CT_DoLog DEBUG "Using g++ for target: '${cross_cxx}'"
CT_DoLog DEBUG "Using ar for target: '${cross_ar}'"
CT_DoLog DEBUG "Using ranlib for target: '${cross_ranlib}'"
BUILD_CC=${CT_CC_NATIVE} \
CC=${cross_cc} \
CXX=${cross_cxx} \
AR=${cross_ar} \
RANLIB=${cross_ranlib} \
CT_DoExecLog ALL \
"${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
--prefix=/usr \
--with-headers="${CT_HEADERS_DIR}" \
--build="${CT_UNIQ_BUILD}" \
--host="${CT_TARGET}" \
--disable-profile \
--without-gd \
--without-cvs \
--enable-add-ons
CT_DoLog EXTRA "Installing C library headers"
# use the 'install-headers' makefile target to install the
# headers
CT_DoExecLog ALL \
make install-headers \
install_root=${CT_SYSROOT_DIR} \
install-bootstrap-headers=yes
CT_DoLog EXTRA "Installing C library start files"
# there are a few object files needed to link shared libraries,
# which we build and install by hand
CT_DoExecLog ALL mkdir -p ${CT_SYSROOT_DIR}/usr/lib
CT_DoExecLog ALL make csu/subdir_lib
CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
${CT_SYSROOT_DIR}/usr/lib
# Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
# However, since we will never actually execute its code,
# it doesn't matter what it contains. So, treating '/dev/null'
# as a C source file, we produce a dummy 'libc.so' in one step
CT_DoExecLog ALL ${cross_cc} -nostdlib -nostartfiles -shared -x c /dev/null -o ${CT_SYSROOT_DIR}/usr/lib/libc.so
CT_EndStep
}
# This function builds and install the full glibc
do_libc() {
CT_DoStep INFO "Installing C library"
mkdir -p "${CT_BUILD_DIR}/build-libc"
cd "${CT_BUILD_DIR}/build-libc"
CT_DoLog EXTRA "Configuring C library"
# Add some default glibc config options if not given by user.
# We don't need to be conditional on wether the user did set different
# values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
extra_config="--enable-kernel=$(echo ${CT_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
case "${CT_THREADS}" in
nptl) extra_config="${extra_config} --with-__thread --with-tls";;
linuxthreads) extra_config="${extra_config} --with-__thread --without-tls --without-nptl";;
none) extra_config="${extra_config} --without-__thread --without-nptl"
case "${CT_LIBC_EGLIBC_EXTRA_CONFIG}" in
*-tls*) ;;
*) extra_config="${extra_config} --without-tls";;
esac
;;
esac
case "${CT_SHARED_LIBS}" in
y) extra_config="${extra_config} --enable-shared";;
*) extra_config="${extra_config} --disable-shared";;
esac
case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
y,) extra_config="${extra_config} --with-fp";;
,y) extra_config="${extra_config} --without-fp";;
esac
case "$(do_libc_add_ons_list ,)" in
"") ;;
*) extra_config="${extra_config} --enable-add-ons=$(do_libc_add_ons_list ,)";;
esac
extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
cross_cc=$(CT_Which "${CT_TARGET}-gcc")
CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
CT_DoLog DEBUG "Extra CC args passed : '${extra_cc_args}'"
BUILD_CC=${CT_CC_NATIVE} \
CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_EGLIBC_EXTRA_CFLAGS} -O" \
CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
AR=${CT_TARGET}-ar \
RANLIB=${CT_TARGET}-ranlib \
CT_DoExecLog ALL \
"${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
--prefix=/usr \
--with-headers="${CT_HEADERS_DIR}" \
--build=${CT_UNIQ_BUILD} \
--host=${CT_TARGET} \
--disable-profile \
--without-gd \
--without-cvs \
${extra_config} \
${CT_LIBC_EGLIBC_EXTRA_CONFIG}
CT_DoLog EXTRA "Building C library"
CT_DoExecLog ALL make
CT_DoLog EXTRA "Installing C library"
CT_DoExecLog ALL make install install_root="${CT_SYSROOT_DIR}"
CT_EndStep
}
# This function finishes the glibc install
do_libc_finish() {
# Nothing to be done for eglibc
:
}
# Build up the addons list, separated with $1
do_libc_add_ons_list() {
local sep="$1"
local addons_list=$(echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,)
case "${CT_THREADS}" in
none) ;;
*) addons_list="${addons_list}${sep}${CT_THREADS}";;
esac
[ "${CT_LIBC_EGLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
addons_list="${addons_list%%${sep}}"
echo "${addons_list##${sep}}"
}

View File

@ -253,6 +253,8 @@ CT_MktempDir() {
# Some mktemp do not allow more than 6 Xs
eval "$1"=$(mktemp -q -d "${CT_BUILD_DIR}/.XXXXXX")
CT_TestOrAbort "Could not make temporary directory" -n "${!1}" -a -d "${!1}"
CT_DoLog DEBUG "Made temporary directory '${!1}'"
return 0
}
# Echoes the specified string on stdout until the pipe breaks.
@ -546,7 +548,7 @@ CT_ExtractAndPatch() {
# Add-ons need a little love, really.
case "${file}" in
glibc-[a-z]*-*)
glibc-[a-z]*-*|eglibc-[a-z]*-*)
CT_TestAndAbort "Trying to extract the C-library addon/locales '${file}' when C-library not yet extracted" ! -d "${CT_LIBC_FILE}"
cd "${CT_LIBC_FILE}"
libc_addon=y
@ -674,7 +676,7 @@ CT_DoBuildTargetTuple() {
# Set defaults for the system part of the tuple. Can be overriden
# by architecture-specific values.
case "${CT_LIBC}" in
glibc) CT_TARGET_SYS=gnu;;
*glibc) CT_TARGET_SYS=gnu;;
uClibc) CT_TARGET_SYS=uclibc;;
esac