scripts/build/libc/eglibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Aug 30 00:57:40 2009 +0200 (2009-08-30)
changeset 1495 2542421e3321
parent 1476 eded63022651
child 1528 f87b08efe892
permissions -rw-r--r--
tools wrapper: introduce the silent WRAPPER_NEEDED config option

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