scripts/build/libc/eglibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 18 23:00:46 2011 +0200 (2011-05-18)
changeset 2467 200836977ce6
parent 2270 287e1e00dea4
child 2482 af25723a794f
permissions -rw-r--r--
config: rename variables that are arrays

Make it explicit that a variable is an array bu the name of the variable.
It will be used later when .config gets munged to allow both multiple
arguments and arguments with spaces at the same time to be passed from the
configuration down to the build scripts.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@850
     1
# eglibc build functions (initially by Thomas JOURDAN).
yann@850
     2
yann@2270
     3
# Add the definitions common to glibc and eglibc
yann@2270
     4
#   do_libc_start_files
yann@2270
     5
#   do_libc
yann@2270
     6
#   do_libc_finish
yann@2270
     7
#   do_libc_add_ons_list
yann@2270
     8
. "${CT_LIB_DIR}/scripts/build/libc/glibc-eglibc.sh-common"
yann@2270
     9
yann@850
    10
# Download eglibc repository
yann@850
    11
do_eglibc_get() {
yann@850
    12
    CT_HasOrAbort svn
yann@850
    13
yann@850
    14
    case "${CT_LIBC_VERSION}" in
yann@850
    15
        trunk)  svn_url="svn://svn.eglibc.org/trunk";;
yann@850
    16
        *)      svn_url="svn://svn.eglibc.org/branches/eglibc-${CT_LIBC_VERSION}";;
yann@850
    17
    esac
yann@850
    18
yann@850
    19
    case "${CT_EGLIBC_CHECKOUT}" in
yann@850
    20
        y)  svn_action="checkout";;
yann@850
    21
        *)  svn_action="export --force";;
yann@850
    22
    esac
yann@850
    23
bob@2178
    24
    CT_DoExecLog ALL svn ${svn_action} -r "${CT_EGLIBC_REVISION:-HEAD}" "${svn_url}" "$(pwd)"
yann@850
    25
yann@850
    26
    # Compress eglibc
yann@1123
    27
    CT_DoExecLog ALL mv libc "eglibc-${CT_LIBC_VERSION}"
yann@1123
    28
    CT_DoExecLog ALL tar cjf "eglibc-${CT_LIBC_VERSION}.tar.bz2" "eglibc-${CT_LIBC_VERSION}"
yann@850
    29
yann@850
    30
    # Compress linuxthreads, localedef and ports
yann@850
    31
    # Assign them the name the way ct-ng like it
yann@850
    32
    for addon in linuxthreads localedef ports; do
yann@1123
    33
        CT_DoExecLog ALL mv "${addon}" "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@1123
    34
        CT_DoExecLog ALL tar cjf "eglibc-${addon}-${CT_LIBC_VERSION}.tar.bz2" "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@850
    35
    done
yann@850
    36
}
yann@850
    37
yann@850
    38
# Download glibc
yann@850
    39
do_libc_get() {
yann@850
    40
    # eglibc is only available through subversion, there are no
yann@850
    41
    # snapshots available. Moreover, addons will be downloaded
yann@850
    42
    # simultaneously.
yann@850
    43
yann@850
    44
    # build filename
yann@1123
    45
    eglibc="eglibc-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    46
    eglibc_linuxthreads="${CT_LIBC}-linuxthreads-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    47
    eglibc_localedef="${CT_LIBC}-localedef-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    48
    eglibc_ports="${CT_LIBC}-ports-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    49
yann@850
    50
    # Check if every tarballs are already present
yann@1476
    51
    if [    -f "${CT_TARBALLS_DIR}/${eglibc}"                   \
yann@1476
    52
         -a -f "${CT_TARBALLS_DIR}/${eglibc_linuxthreads}"      \
yann@1476
    53
         -a -f "${CT_TARBALLS_DIR}/${eglibc_localedef}"         \
yann@1476
    54
         -a -f "${CT_TARBALLS_DIR}/${eglibc_ports}"             \
yann@1476
    55
       ]; then
yann@850
    56
        CT_DoLog DEBUG "Already have 'eglibc-${CT_LIBC_VERSION}'"
yann@850
    57
        return 0
yann@850
    58
    fi
yann@850
    59
yann@1476
    60
    if [    -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc}"                 \
yann@1476
    61
         -a -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc_linuxthreads}"    \
yann@1476
    62
         -a -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc_localedef}"       \
yann@1476
    63
         -a -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc_ports}"           \
yann@1528
    64
         -a "${CT_FORCE_DOWNLOAD}" != "y"                           \
yann@1476
    65
       ]; then
yann@850
    66
        CT_DoLog DEBUG "Got 'eglibc-${CT_LIBC_VERSION}' from local storage"
yann@850
    67
        for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
yann@850
    68
            CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}"
yann@850
    69
        done
yann@850
    70
        return 0
yann@850
    71
    fi
yann@850
    72
yann@850
    73
    # Not found locally, try from the network
yann@850
    74
    CT_DoLog EXTRA "Retrieving 'eglibc-${CT_LIBC_VERSION}'"
yann@867
    75
yann@867
    76
    CT_MktempDir tmp_dir
yann@867
    77
    CT_Pushd "${tmp_dir}"
yann@867
    78
yann@850
    79
    do_eglibc_get
yann@867
    80
    CT_DoLog DEBUG "Moving 'eglibc-${CT_LIBC_VERSION}' to tarball directory"
yann@867
    81
    for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
yann@867
    82
        CT_DoExecLog ALL mv -f "${file}" "${CT_TARBALLS_DIR}"
yann@867
    83
    done
yann@867
    84
yann@867
    85
    CT_Popd
yann@867
    86
yann@867
    87
    # Remove source files
yann@867
    88
    CT_DoExecLog ALL rm -rf "${tmp_dir}"
yann@850
    89
yann@850
    90
    if [ "${CT_SAVE_TARBALLS}" = "y" ]; then
yann@850
    91
        CT_DoLog EXTRA "Saving 'eglibc-${CT_LIBC_VERSION}' to local storage"
yann@850
    92
        for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
yann@850
    93
            CT_DoExecLog ALL mv -f "${CT_TARBALLS_DIR}/${file}" "${CT_LOCAL_TARBALLS_DIR}"
yann@850
    94
            CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}"
yann@850
    95
        done
yann@850
    96
    fi
yann@850
    97
yann@850
    98
    return 0
yann@850
    99
}
yann@850
   100
yann@850
   101
# Extract eglibc
yann@850
   102
do_libc_extract() {
yann@1126
   103
    CT_Extract "eglibc-${CT_LIBC_VERSION}"
yann@1901
   104
    CT_Patch "eglibc" "${CT_LIBC_VERSION}"
yann@850
   105
yann@850
   106
    # C library addons
yann@850
   107
    for addon in $(do_libc_add_ons_list " "); do
yann@850
   108
        # NPTL addon is not to be extracted, in any case
yann@850
   109
        [ "${addon}" = "nptl" ] && continue || true
yann@1123
   110
        CT_Pushd "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}"
yann@1761
   111
        CT_Extract nochdir "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@1126
   112
        # Some addons have the 'long' name, while others have the
yann@1126
   113
        # 'short' name, but patches are non-uniformly built with
yann@1126
   114
        # either the 'long' or 'short' name, whatever the addons name
yann@1126
   115
        # so we have to make symlinks from the existing to the missing
yann@1126
   116
        # Fortunately for us, [ -d foo ], when foo is a symlink to a
yann@1126
   117
        # directory, returns true!
yann@1126
   118
        [ -d "${addon}" ] || ln -s "eglibc-${addon}-${CT_LIBC_VERSION}" "${addon}"
yann@1126
   119
        [ -d "eglibc-${addon}-${CT_LIBC_VERSION}" ] || ln -s "${addon}" "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@1901
   120
        CT_Patch nochdir "eglibc" "${addon}-${CT_LIBC_VERSION}"
yann@1123
   121
        CT_Popd
yann@850
   122
    done
yann@850
   123
yann@884
   124
    # The configure files may be older than the configure.in files
yann@884
   125
    # if using a snapshot (or even some tarballs). Fake them being
yann@884
   126
    # up to date.
yann@1123
   127
    find "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}" -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
yann@884
   128
yann@850
   129
    return 0
yann@850
   130
}
yann@850
   131
avrac@1569
   132
# Copy user provided eglibc configuration file if provided
yann@850
   133
do_libc_check_config() {
avrac@1569
   134
    if [ "${CT_EGLIBC_CUSTOM_CONFIG}" != "y" ]; then
avrac@1569
   135
        return 0
avrac@1569
   136
    fi
avrac@1569
   137
avrac@1569
   138
    CT_DoStep INFO "Checking C library configuration"
avrac@1569
   139
avrac@1569
   140
    CT_TestOrAbort "You did not provide an eglibc config file!" \
avrac@1569
   141
        -n "${CT_EGLIBC_OPTION_GROUPS_FILE}" -a \
avrac@1569
   142
        -f "${CT_EGLIBC_OPTION_GROUPS_FILE}"
avrac@1569
   143
avrac@1569
   144
    CT_DoExecLog ALL cp "${CT_EGLIBC_OPTION_GROUPS_FILE}" "${CT_CONFIG_DIR}/eglibc.config"
avrac@1569
   145
avrac@1569
   146
    # NSS configuration
avrac@1569
   147
    if grep -E '^OPTION_EGLIBC_NSSWITCH[[:space:]]*=[[:space:]]*n' "${CT_EGLIBC_OPTION_GROUPS_FILE}" >/dev/null 2>&1; then
avrac@1569
   148
        CT_DoLog DEBUG "Using fixed-configuration nsswitch facility"
avrac@1569
   149
avrac@1569
   150
        if [ "${CT_EGLIBC_BUNDLED_NSS_CONFIG}" = "y" ]; then
avrac@1569
   151
            nss_config="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.conf"
avrac@1569
   152
        else
avrac@1569
   153
            nss_config="${CT_EGLIBC_NSS_CONFIG_FILE}"
avrac@1569
   154
        fi
avrac@1569
   155
        CT_TestOrAbort "NSS config file not found!" -n "${nss_config}" -a -f "${nss_config}"
avrac@1569
   156
avrac@1569
   157
        CT_DoExecLog ALL cp "${nss_config}" "${CT_CONFIG_DIR}/nsswitch.config"
avrac@1569
   158
        echo "OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG = ${CT_CONFIG_DIR}/nsswitch.config" \
avrac@1569
   159
            >> "${CT_CONFIG_DIR}/eglibc.config"
avrac@1569
   160
avrac@1569
   161
        if [ "${CT_EGLIBC_BUNDLED_NSS_FUNCTIONS}" = "y" ]; then
avrac@1569
   162
            nss_functions="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.functions"
avrac@1569
   163
        else
avrac@1569
   164
            nss_functions="${CT_EGLIBC_NSS_FUNCTIONS_FILE}"
avrac@1569
   165
        fi
avrac@1569
   166
        CT_TestOrAbort "NSS functions file not found!" -n "${nss_functions}" -a -f "${nss_functions}"
avrac@1569
   167
avrac@1569
   168
        CT_DoExecLog ALL cp "${nss_functions}" "${CT_CONFIG_DIR}/nsswitch.functions"
avrac@1569
   169
        echo "OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS = ${CT_CONFIG_DIR}/nsswitch.functions" \
avrac@1569
   170
            >> "${CT_CONFIG_DIR}/eglibc.config"
avrac@1569
   171
    else
avrac@1569
   172
        CT_DoLog DEBUG "Using full-blown nsswitch facility"
avrac@1569
   173
    fi
avrac@1569
   174
avrac@1569
   175
    CT_EndStep
yann@850
   176
}