scripts/build/libc/eglibc.sh
author Bart vdr. Meulen <bartvdrmeulen@gmail.com>
Sun Aug 02 16:45:43 2009 +0200 (2009-08-02)
changeset 1434 7e7290acccc1
parent 1292 546d2ed3410b
child 1475 1626414b1662
permissions -rw-r--r--
fix wrapper script for symlinks

The wrapper script placed around the target binaries when
using the companion libraries does not work for symbolic links
The wrapper scripts needs to follow the links before calling the
actual binary

Signed-off-by: Bart vdr. Meulen <bartvdrmeulen@gmail.com>

---
yann@850
     1
# eglibc build functions (initially by Thomas JOURDAN).
yann@850
     2
yann@850
     3
# Download eglibc repository
yann@850
     4
do_eglibc_get() {
yann@850
     5
    CT_HasOrAbort svn
yann@850
     6
yann@850
     7
    case "${CT_LIBC_VERSION}" in
yann@850
     8
        trunk)  svn_url="svn://svn.eglibc.org/trunk";;
yann@850
     9
        *)      svn_url="svn://svn.eglibc.org/branches/eglibc-${CT_LIBC_VERSION}";;
yann@850
    10
    esac
yann@850
    11
yann@850
    12
    case "${CT_EGLIBC_CHECKOUT}" in
yann@850
    13
        y)  svn_action="checkout";;
yann@850
    14
        *)  svn_action="export --force";;
yann@850
    15
    esac
yann@850
    16
yann@850
    17
    CT_DoExecLog ALL svn ${svn_action} -r "${CT_EGLIBC_REVISION:-HEAD}" "${svn_url}" . 2>&1
yann@850
    18
yann@850
    19
    # Compress eglibc
yann@1123
    20
    CT_DoExecLog ALL mv libc "eglibc-${CT_LIBC_VERSION}"
yann@1123
    21
    CT_DoExecLog ALL tar cjf "eglibc-${CT_LIBC_VERSION}.tar.bz2" "eglibc-${CT_LIBC_VERSION}"
yann@850
    22
yann@850
    23
    # Compress linuxthreads, localedef and ports
yann@850
    24
    # Assign them the name the way ct-ng like it
yann@850
    25
    for addon in linuxthreads localedef ports; do
yann@1123
    26
        CT_DoExecLog ALL mv "${addon}" "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@1123
    27
        CT_DoExecLog ALL tar cjf "eglibc-${addon}-${CT_LIBC_VERSION}.tar.bz2" "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@850
    28
    done
yann@850
    29
}
yann@850
    30
yann@850
    31
# Download glibc
yann@850
    32
do_libc_get() {
yann@850
    33
    # eglibc is only available through subversion, there are no
yann@850
    34
    # snapshots available. Moreover, addons will be downloaded
yann@850
    35
    # simultaneously.
yann@850
    36
yann@850
    37
    # build filename
yann@1123
    38
    eglibc="eglibc-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    39
    eglibc_linuxthreads="${CT_LIBC}-linuxthreads-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    40
    eglibc_localedef="${CT_LIBC}-localedef-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    41
    eglibc_ports="${CT_LIBC}-ports-${CT_LIBC_VERSION}.tar.bz2"
yann@850
    42
yann@850
    43
    # Check if every tarballs are already present
yann@850
    44
    if [ -a "${CT_TARBALLS_DIR}/${eglibc}" ]              && \
yann@850
    45
       [ -a "${CT_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \
yann@850
    46
       [ -a "${CT_TARBALLS_DIR}/${eglibc_localedef}" ]    && \
yann@850
    47
       [ -a "${CT_TARBALLS_DIR}/${eglibc_ports}" ]; then
yann@850
    48
        CT_DoLog DEBUG "Already have 'eglibc-${CT_LIBC_VERSION}'"
yann@850
    49
        return 0
yann@850
    50
    fi
yann@850
    51
yann@850
    52
    if [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc}" ]              && \
yann@850
    53
       [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \
yann@850
    54
       [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_localedef}" ]    && \
yann@850
    55
       [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_ports}" ]        && \
yann@850
    56
       [ "${CT_FORCE_DOWNLOAD}" != "y" ]; then
yann@850
    57
        CT_DoLog DEBUG "Got 'eglibc-${CT_LIBC_VERSION}' from local storage"
yann@850
    58
        for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
yann@850
    59
            CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}"
yann@850
    60
        done
yann@850
    61
        return 0
yann@850
    62
    fi
yann@850
    63
yann@850
    64
    # Not found locally, try from the network
yann@850
    65
    CT_DoLog EXTRA "Retrieving 'eglibc-${CT_LIBC_VERSION}'"
yann@867
    66
yann@867
    67
    CT_MktempDir tmp_dir
yann@867
    68
    CT_Pushd "${tmp_dir}"
yann@867
    69
yann@850
    70
    do_eglibc_get
yann@867
    71
    CT_DoLog DEBUG "Moving 'eglibc-${CT_LIBC_VERSION}' to tarball directory"
yann@867
    72
    for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
yann@867
    73
        CT_DoExecLog ALL mv -f "${file}" "${CT_TARBALLS_DIR}"
yann@867
    74
    done
yann@867
    75
yann@867
    76
    CT_Popd
yann@867
    77
yann@867
    78
    # Remove source files
yann@867
    79
    CT_DoExecLog ALL rm -rf "${tmp_dir}"
yann@850
    80
yann@850
    81
    if [ "${CT_SAVE_TARBALLS}" = "y" ]; then
yann@850
    82
        CT_DoLog EXTRA "Saving 'eglibc-${CT_LIBC_VERSION}' to local storage"
yann@850
    83
        for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
yann@850
    84
            CT_DoExecLog ALL mv -f "${CT_TARBALLS_DIR}/${file}" "${CT_LOCAL_TARBALLS_DIR}"
yann@850
    85
            CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}"
yann@850
    86
        done
yann@850
    87
    fi
yann@850
    88
yann@850
    89
    return 0
yann@850
    90
}
yann@850
    91
yann@850
    92
# Extract eglibc
yann@850
    93
do_libc_extract() {
yann@1126
    94
    CT_Extract "eglibc-${CT_LIBC_VERSION}"
yann@1126
    95
    CT_Patch "eglibc-${CT_LIBC_VERSION}"
yann@850
    96
yann@850
    97
    # C library addons
yann@850
    98
    for addon in $(do_libc_add_ons_list " "); do
yann@850
    99
        # NPTL addon is not to be extracted, in any case
yann@850
   100
        [ "${addon}" = "nptl" ] && continue || true
yann@1123
   101
        CT_Pushd "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}"
yann@1126
   102
        CT_Extract "eglibc-${addon}-${CT_LIBC_VERSION}" nochdir
yann@1126
   103
        # Some addons have the 'long' name, while others have the
yann@1126
   104
        # 'short' name, but patches are non-uniformly built with
yann@1126
   105
        # either the 'long' or 'short' name, whatever the addons name
yann@1126
   106
        # so we have to make symlinks from the existing to the missing
yann@1126
   107
        # Fortunately for us, [ -d foo ], when foo is a symlink to a
yann@1126
   108
        # directory, returns true!
yann@1126
   109
        [ -d "${addon}" ] || ln -s "eglibc-${addon}-${CT_LIBC_VERSION}" "${addon}"
yann@1126
   110
        [ -d "eglibc-${addon}-${CT_LIBC_VERSION}" ] || ln -s "${addon}" "eglibc-${addon}-${CT_LIBC_VERSION}"
yann@1126
   111
        CT_Patch "eglibc-${addon}-${CT_LIBC_VERSION}" nochdir
yann@1123
   112
        CT_Popd
yann@850
   113
    done
yann@850
   114
yann@884
   115
    # The configure files may be older than the configure.in files
yann@884
   116
    # if using a snapshot (or even some tarballs). Fake them being
yann@884
   117
    # up to date.
yann@1123
   118
    find "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}" -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
yann@884
   119
yann@850
   120
    return 0
yann@850
   121
}
yann@850
   122
yann@850
   123
# There is nothing to do for eglibc check config
yann@850
   124
do_libc_check_config() {
yann@850
   125
    :
yann@850
   126
}
yann@850
   127
yann@884
   128
# This function installs the eglibc headers needed to build the core compiler
yann@850
   129
do_libc_headers() {
yann@850
   130
    # Instead of doing two time the same actions, headers will
yann@850
   131
    # be installed with start files
yann@850
   132
    :
yann@850
   133
}
yann@850
   134
yann@850
   135
# Build and install start files
yann@850
   136
do_libc_start_files() {
yann@850
   137
    CT_DoStep INFO "Installing C library headers / start files"
yann@850
   138
yann@850
   139
    mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
yann@850
   140
    cd "${CT_BUILD_DIR}/build-libc-startfiles"
yann@850
   141
yann@850
   142
    CT_DoLog EXTRA "Configuring C library"
yann@850
   143
yann@850
   144
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
yann@850
   145
    cross_cxx=$(CT_Which "${CT_TARGET}-g++")
yann@850
   146
    cross_ar=$(CT_Which "${CT_TARGET}-ar")
yann@850
   147
    cross_ranlib=$(CT_Which "${CT_TARGET}-ranlib")
yann@850
   148
    
yann@850
   149
    CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
yann@850
   150
    CT_DoLog DEBUG "Using g++ for target: '${cross_cxx}'"
yann@850
   151
    CT_DoLog DEBUG "Using ar for target: '${cross_ar}'"
yann@850
   152
    CT_DoLog DEBUG "Using ranlib for target: '${cross_ranlib}'"
yann@850
   153
yann@1123
   154
    BUILD_CC="${CT_BUILD}-gcc"                          \
yann@1123
   155
    CC=${cross_cc}                                      \
yann@1123
   156
    CXX=${cross_cxx}                                    \
yann@1123
   157
    AR=${cross_ar}                                      \
yann@1123
   158
    RANLIB=${cross_ranlib}                              \
yann@1123
   159
    CT_DoExecLog ALL                                    \
yann@1123
   160
    "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/configure" \
yann@1123
   161
        --prefix=/usr                                   \
yann@1123
   162
        --with-headers="${CT_HEADERS_DIR}"              \
yann@1123
   163
        --build="${CT_BUILD}"                           \
yann@1123
   164
        --host="${CT_TARGET}"                           \
yann@1123
   165
        --disable-profile                               \
yann@1123
   166
        --without-gd                                    \
yann@1123
   167
        --without-cvs                                   \
yann@850
   168
        --enable-add-ons
yann@850
   169
yann@850
   170
    CT_DoLog EXTRA "Installing C library headers"
yann@850
   171
yann@850
   172
    # use the 'install-headers' makefile target to install the
yann@850
   173
    # headers
yann@850
   174
yann@850
   175
    CT_DoExecLog ALL                    \
yann@850
   176
    make install-headers                \
yann@850
   177
         install_root=${CT_SYSROOT_DIR} \
yann@850
   178
         install-bootstrap-headers=yes
yann@850
   179
yann@850
   180
    CT_DoLog EXTRA "Installing C library start files"
yann@850
   181
yann@850
   182
    # there are a few object files needed to link shared libraries,
yann@850
   183
    # which we build and install by hand
yann@850
   184
yann@850
   185
    CT_DoExecLog ALL mkdir -p ${CT_SYSROOT_DIR}/usr/lib
yann@850
   186
    CT_DoExecLog ALL make csu/subdir_lib
yann@850
   187
    CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
yann@850
   188
        ${CT_SYSROOT_DIR}/usr/lib
yann@850
   189
yann@850
   190
    # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.  
yann@850
   191
    # However, since we will never actually execute its code, 
yann@850
   192
    # it doesn't matter what it contains.  So, treating '/dev/null' 
yann@850
   193
    # as a C source file, we produce a dummy 'libc.so' in one step
yann@850
   194
yann@850
   195
    CT_DoExecLog ALL ${cross_cc} -nostdlib -nostartfiles -shared -x c /dev/null -o ${CT_SYSROOT_DIR}/usr/lib/libc.so
yann@850
   196
yann@850
   197
    CT_EndStep
yann@850
   198
}
yann@850
   199
yann@850
   200
# This function builds and install the full glibc
yann@850
   201
do_libc() {
yann@850
   202
    CT_DoStep INFO "Installing C library"
yann@850
   203
yann@850
   204
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@850
   205
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   206
yann@850
   207
    CT_DoLog EXTRA "Configuring C library"
yann@850
   208
yann@850
   209
    # Add some default glibc config options if not given by user.
yann@850
   210
    # We don't need to be conditional on wether the user did set different
yann@850
   211
    # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
yann@850
   212
yann@850
   213
    extra_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
yann@850
   214
yann@850
   215
    case "${CT_THREADS}" in
yann@850
   216
        nptl)           extra_config="${extra_config} --with-__thread --with-tls";;
yann@850
   217
        linuxthreads)   extra_config="${extra_config} --with-__thread --without-tls --without-nptl";;
yann@850
   218
        none)           extra_config="${extra_config} --without-__thread --without-nptl"
yann@850
   219
                        case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@850
   220
                            *-tls*) ;;
yann@850
   221
                            *) extra_config="${extra_config} --without-tls";;
yann@850
   222
                        esac
yann@850
   223
                        ;;
yann@850
   224
    esac
yann@850
   225
yann@850
   226
    case "${CT_SHARED_LIBS}" in
yann@850
   227
        y) extra_config="${extra_config} --enable-shared";;
yann@850
   228
        *) extra_config="${extra_config} --disable-shared";;
yann@850
   229
    esac
yann@850
   230
yann@850
   231
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@850
   232
        y,) extra_config="${extra_config} --with-fp";;
yann@850
   233
        ,y) extra_config="${extra_config} --without-fp";;
yann@850
   234
    esac
yann@850
   235
yann@850
   236
    case "$(do_libc_add_ons_list ,)" in
yann@850
   237
        "") ;;
yann@850
   238
        *)  extra_config="${extra_config} --enable-add-ons=$(do_libc_add_ons_list ,)";;
yann@850
   239
    esac
yann@850
   240
yann@850
   241
    extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
yann@850
   242
yann@850
   243
    cross_cc=$(CT_Which "${CT_TARGET}-gcc")    
yann@850
   244
yann@850
   245
    CT_DoLog DEBUG "Using gcc for target:     '${cross_cc}'"
yann@850
   246
    CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
yann@850
   247
    CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
yann@850
   248
    CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
yann@850
   249
yann@1041
   250
    BUILD_CC="${CT_BUILD}-gcc"                                      \
yann@850
   251
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O"   \
yann@850
   252
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@850
   253
    AR=${CT_TARGET}-ar                                              \
yann@850
   254
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@850
   255
    CT_DoExecLog ALL                                                \
yann@1123
   256
    "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/configure"             \
yann@850
   257
        --prefix=/usr                                               \
yann@850
   258
        --with-headers="${CT_HEADERS_DIR}"                          \
yann@1041
   259
        --build=${CT_BUILD}                                         \
yann@850
   260
        --host=${CT_TARGET}                                         \
yann@850
   261
        --disable-profile                                           \
yann@850
   262
        --without-gd                                                \
yann@850
   263
        --without-cvs                                               \
yann@850
   264
        ${extra_config}                                             \
yann@850
   265
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}
yann@850
   266
    
yann@850
   267
    CT_DoLog EXTRA "Building C library"
yann@850
   268
yann@1328
   269
    # eglibc build hacks
yann@1328
   270
    # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
yann@1328
   271
    case "${CT_ARCH},${CT_ARCH_CPU}" in
yann@1328
   272
        powerpc,8??)
yann@1328
   273
            CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
yann@1328
   274
            EGLIBC_BUILD_ASFLAGS="-DBROKEN_PPC_8xx_CPU15";;
yann@1328
   275
    esac
yann@1328
   276
yann@1328
   277
    CT_DoExecLog ALL make ASFLAGS="${EGLIBC_BUILD_ASFLAGS}"
yann@850
   278
yann@850
   279
    CT_DoLog EXTRA "Installing C library"
yann@850
   280
yann@850
   281
    CT_DoExecLog ALL make install install_root="${CT_SYSROOT_DIR}"
yann@850
   282
yann@850
   283
    CT_EndStep
yann@850
   284
}
yann@850
   285
yann@850
   286
# This function finishes the glibc install
yann@850
   287
do_libc_finish() {
yann@850
   288
    # Nothing to be done for eglibc
yann@850
   289
    :
yann@850
   290
}
yann@850
   291
yann@850
   292
# Build up the addons list, separated with $1
yann@850
   293
do_libc_add_ons_list() {
yann@850
   294
    local sep="$1"
yann@850
   295
    local addons_list=$(echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,)
yann@850
   296
    case "${CT_THREADS}" in
yann@850
   297
        none)   ;;
yann@850
   298
        *)      addons_list="${addons_list}${sep}${CT_THREADS}";;
yann@850
   299
    esac
yann@850
   300
    [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
yann@850
   301
    addons_list="${addons_list%%${sep}}"
yann@850
   302
    echo "${addons_list##${sep}}"
yann@850
   303
}