scripts/build/libc/eglibc.sh
author Michael Hope <michael.hope@linaro.org>
Wed Oct 19 15:27:32 2011 +1300 (2011-10-19)
changeset 2739 f320e22f2cba
parent 2520 e3523df95b6b
child 2776 5f557056c530
child 2848 1ff89596dab0
permissions -rw-r--r--
arch: add softfp support

Some architectures support a mixed hard/soft floating point, where
the compiler emits hardware floating point instructions, but passes
the operands in core (aka integer) registers.

For example, ARM supports this mode (to come in the next changeset).

Add support for softfp cross compilers to the GCC and GLIBC
configuration. Needed for Ubuntu and other distros that are softfp.

Signed-off-by: Michael Hope <michael.hope@linaro.org>
[yann.morin.1998@anciens.enib.fr: split the original patch]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 # eglibc build functions (initially by Thomas JOURDAN).
     2 
     3 # Add the definitions common to glibc and eglibc
     4 #   do_libc_extract
     5 #   do_libc_start_files
     6 #   do_libc
     7 #   do_libc_finish
     8 #   do_libc_add_ons_list
     9 #   do_libc_min_kernel_config
    10 . "${CT_LIB_DIR}/scripts/build/libc/glibc-eglibc.sh-common"
    11 
    12 # Download glibc
    13 # eglibc is only available through subversion, there are no
    14 # snapshots available.
    15 do_libc_get() {
    16     local addon
    17     local -a extra_addons
    18     local svn_base
    19 
    20     if [ "${CT_EGLIBC_HTTP}" = "y" ]; then
    21         svn_base="http://www.eglibc.org/svn"
    22     else
    23         svn_base="svn://svn.eglibc.org"
    24     fi
    25 
    26     case "${CT_LIBC_VERSION}" in
    27         trunk)  svn_base+="/trunk";;
    28         *)      svn_base+="/branches/eglibc-${CT_LIBC_VERSION}";;
    29     esac
    30 
    31     CT_GetSVN "eglibc-${CT_LIBC_VERSION}"   \
    32               "${svn_base}/libc"            \
    33               "${CT_EGLIBC_REVISION:-HEAD}"
    34 
    35     if [ "${CT_LIBC_LOCALES}" = "y" ]; then
    36         extra_addons+=("localedef")
    37     fi
    38 
    39     for addon in $(do_libc_add_ons_list " ") "${extra_addons[@]}"; do
    40         # Never ever try to download these add-ons,
    41         # they've always been internal
    42         case "${addon}" in
    43             nptl)   continue;;
    44         esac
    45 
    46         if ! CT_GetSVN "eglibc-${addon}-${CT_LIBC_VERSION}" \
    47                        "${svn_base}/${addon}"               \
    48                        "${CT_EGLIBC_REVISION:-HEAD}"
    49         then
    50             # Some add-ons are bundled with the main sources
    51             # so failure to download them is expected
    52             CT_DoLog DEBUG "Addon '${addon}' could not be downloaded."
    53             CT_DoLog DEBUG "We'll see later if we can find it in the source tree"
    54         fi
    55     done
    56 }
    57 
    58 # Copy user provided eglibc configuration file if provided
    59 do_libc_check_config() {
    60     if [ "${CT_EGLIBC_CUSTOM_CONFIG}" != "y" ]; then
    61         return 0
    62     fi
    63 
    64     CT_DoStep INFO "Checking C library configuration"
    65 
    66     CT_TestOrAbort "You did not provide an eglibc config file!" \
    67         -n "${CT_EGLIBC_OPTION_GROUPS_FILE}" -a \
    68         -f "${CT_EGLIBC_OPTION_GROUPS_FILE}"
    69 
    70     CT_DoExecLog ALL cp "${CT_EGLIBC_OPTION_GROUPS_FILE}" "${CT_CONFIG_DIR}/eglibc.config"
    71 
    72     # NSS configuration
    73     if grep -E '^OPTION_EGLIBC_NSSWITCH[[:space:]]*=[[:space:]]*n' "${CT_EGLIBC_OPTION_GROUPS_FILE}" >/dev/null 2>&1; then
    74         CT_DoLog DEBUG "Using fixed-configuration nsswitch facility"
    75 
    76         if [ "${CT_EGLIBC_BUNDLED_NSS_CONFIG}" = "y" ]; then
    77             nss_config="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.conf"
    78         else
    79             nss_config="${CT_EGLIBC_NSS_CONFIG_FILE}"
    80         fi
    81         CT_TestOrAbort "NSS config file not found!" -n "${nss_config}" -a -f "${nss_config}"
    82 
    83         CT_DoExecLog ALL cp "${nss_config}" "${CT_CONFIG_DIR}/nsswitch.config"
    84         echo "OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG = ${CT_CONFIG_DIR}/nsswitch.config" \
    85             >> "${CT_CONFIG_DIR}/eglibc.config"
    86 
    87         if [ "${CT_EGLIBC_BUNDLED_NSS_FUNCTIONS}" = "y" ]; then
    88             nss_functions="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.functions"
    89         else
    90             nss_functions="${CT_EGLIBC_NSS_FUNCTIONS_FILE}"
    91         fi
    92         CT_TestOrAbort "NSS functions file not found!" -n "${nss_functions}" -a -f "${nss_functions}"
    93 
    94         CT_DoExecLog ALL cp "${nss_functions}" "${CT_CONFIG_DIR}/nsswitch.functions"
    95         echo "OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS = ${CT_CONFIG_DIR}/nsswitch.functions" \
    96             >> "${CT_CONFIG_DIR}/eglibc.config"
    97     else
    98         CT_DoLog DEBUG "Using full-blown nsswitch facility"
    99     fi
   100 
   101     CT_EndStep
   102 }
   103 
   104 # Extract the files required for the libc locales
   105 do_libc_locales_extract() {
   106     CT_Extract "eglibc-localedef-${CT_LIBC_VERSION}"
   107     CT_Patch "eglibc" "localedef-${CT_LIBC_VERSION}"
   108 }
   109 
   110 # Build and install the libc locales
   111 do_libc_locales() {
   112     local libc_src_dir="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}"
   113     local src_dir="${CT_SRC_DIR}/eglibc-localedef-${CT_LIBC_VERSION}"
   114     local -a extra_config
   115     local -a localedef_opts
   116 
   117     mkdir -p "${CT_BUILD_DIR}/build-localedef"
   118     cd "${CT_BUILD_DIR}/build-localedef"
   119 
   120     CT_DoLog EXTRA "Configuring C library localedef"
   121 
   122     if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   123         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   124         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   125     fi
   126 
   127     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
   128 
   129     # ./configure is misled by our tools override wrapper for bash
   130     # so just tell it where the real bash is _on_the_target_!
   131     # Notes:
   132     # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
   133     # - ${BASH_SHELL}            is only used to set BASH
   134     # - ${BASH}                  is only used to set the shebang
   135     #                            in two scripts to run on the target
   136     # So we can safely bypass bash detection at compile time.
   137     # Should this change in a future eglibc release, we'd better
   138     # directly mangle the generated scripts _after_ they get built,
   139     # or even after they get installed... eglibc is such a sucker...
   140     echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
   141 
   142     # Configure with --prefix the way we want it on the target...
   143 
   144     CT_DoExecLog CFG                                                \
   145     "${src_dir}/configure"                                          \
   146         --prefix=/usr                                               \
   147         --cache-file="$(pwd)/config.cache"                          \
   148         --with-glibc="${libc_src_dir}"                              \
   149         "${extra_config[@]}"
   150 
   151     CT_DoLog EXTRA "Building C library localedef"
   152     CT_DoExecLog ALL make ${JOBSFLAGS}
   153 
   154     # Set the localedef endianness option
   155     case "${CT_ARCH_BE},${CT_ARCH_LE}" in
   156         y,) localedef_opts+=(--big-endian);;
   157         ,y) localedef_opts+=(--little-endian);;
   158     esac
   159 
   160     # Set the localedef option for the target's uint32_t alignment in bytes.
   161     # This is target-specific, but for now, 32-bit alignment should work for all
   162     # supported targets, even 64-bit ones.
   163     localedef_opts+=(--uint32-align=4)
   164 
   165     CT_DoLog EXTRA "Installing C library locales"
   166     CT_DoExecLog ALL make ${JOBSFLAGS}                              \
   167                           "LOCALEDEF_OPTS=${localedef_opts[*]}"     \
   168                           install_root="${CT_SYSROOT_DIR}"          \
   169                           install-locales
   170 }