scripts/build/libc_glibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue May 01 16:49:15 2007 +0000 (2007-05-01)
changeset 56 07a6a48962b7
child 63 89b41dbffe8d
permissions -rw-r--r--
Merge patches sent by Robert P. J. Day <rpjday@mindspring.com>.
Warning: the buildroot folks purposedly removed the skip-comment patch but didn't really said why. Keeping it for the sake of having it in svn just in case (removing it will be easier thant not having it at all).
yann@1
     1
# This file adds functions to build glibc
yann@1
     2
# Copyright 2007 Yann E. MORIN
yann@1
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@1
     4
yann@1
     5
# There is nothing to do for glibc check config
yann@1
     6
do_libc_check_config() {
yann@1
     7
    CT_DoStep INFO "Checking C library configuration"
yann@1
     8
    CT_DoLog EXTRA "glibc has nothing to check"
yann@1
     9
    CT_EndStep
yann@1
    10
}
yann@1
    11
yann@1
    12
# This function installs the glibc headers needed to build the core compiler
yann@1
    13
do_libc_headers() {
yann@1
    14
    # Only need to install bootstrap glibc headers for gcc-3.0 and above?  Or maybe just gcc-3.3 and above?
yann@1
    15
    # See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
yann@1
    16
    grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/ChangeLog" || return 0
yann@1
    17
yann@1
    18
    CT_DoStep INFO "Installing C library headers"
yann@1
    19
yann@1
    20
    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
yann@1
    21
    cd "${CT_BUILD_DIR}/build-libc-headers"
yann@1
    22
yann@1
    23
    CT_DoLog EXTRA "Configuring C library headers"
yann@1
    24
yann@1
    25
    # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions.
yann@1
    26
    # 1. override CC to keep glibc's configure from using $TARGET-gcc. 
yann@1
    27
    # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly
yann@1
    28
    # 3. build with gcc 3.2 or later
yann@1
    29
    # Compare these options with the ones used when building glibc for real below - they're different.
yann@1
    30
    # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode
yann@1
    31
    # so when configure checks to make sure gcc has access to the assembler you just built...
yann@1
    32
    # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path.
yann@1
    33
    # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet)
yann@1
    34
    # Note: the warning
yann@1
    35
    # "*** WARNING: Are you sure you do not want to use the `linuxthreads'"
yann@1
    36
    # *** add-on?"
yann@1
    37
    # is ok here, since all we want are the basic headers at this point.
yann@1
    38
    # Override libc_cv_ppc_machine so glibc-cvs doesn't complain
yann@1
    39
    # 'a version of binutils that supports .machine "altivec" is needed'.
yann@1
    40
    libc_cv_ppc_machine=yes                     \
yann@1
    41
    CC=${CT_CC_NATIVE}                          \
yann@1
    42
    "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure"   \
yann@1
    43
        --build="${CT_BUILD}"                   \
yann@1
    44
        --host="${CT_TARGET}"                   \
yann@1
    45
        --prefix=/usr                           \
yann@1
    46
        --with-headers="${CT_HEADERS_DIR}"      \
yann@1
    47
        --without-cvs --disable-sanity-checks   \
yann@1
    48
        --enable-hacker-mode                    \
yann@1
    49
        --enable-add-ons=""                     \
yann@1
    50
        --without-nptl                          2>&1 |CT_DoLog DEBUG
yann@1
    51
yann@1
    52
    CT_DoLog EXTRA "Installing C library headers"
yann@1
    53
yann@1
    54
    if grep -q GLIBC_2.3 "${CT_SRC_DIR}/${CT_LIBC_FILE}/ChangeLog"; then
yann@1
    55
        # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c,
yann@1
    56
        # which fails without a real cross-compiler.
yann@1
    57
        # Fortunately, we don't need errlist-compat.c, since we just need .h
yann@1
    58
        # files, so work around this by creating a fake errlist-compat.c and
yann@1
    59
        # satisfying its dependencies.
yann@1
    60
        # Another workaround might be to tell configure to not use any cross
yann@1
    61
        # options to $(CC).
yann@1
    62
        # The real fix would be to get install-headers to not generate
yann@1
    63
        # errlist-compat.c.
yann@1
    64
        # Note: BOOTSTRAP_GCC is used by:
yann@1
    65
        # patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
yann@1
    66
        libc_cv_ppc_machine=yes                             \
yann@1
    67
        make CFLAGS=-DBOOTSTRAP_GCC sysdeps/gnu/errlist.c   2>&1 |CT_DoLog DEBUG
yann@1
    68
        mkdir -p stdio-common
yann@1
    69
        # sleep for 2 seconds for benefit of filesystems with lousy time
yann@1
    70
        # resolution, like FAT, so make knows for sure errlist-compat.c doesn't
yann@1
    71
        # need generating
yann@1
    72
        sleep 2
yann@1
    73
        touch stdio-common/errlist-compat.c
yann@1
    74
    fi
yann@1
    75
    # Note: BOOTSTRAP_GCC (see above)
yann@1
    76
    libc_cv_ppc_machine=yes                                 \
yann@1
    77
    make cross-compiling=yes install_root=${CT_SYSROOT_DIR} \
yann@1
    78
        CFLAGS=-DBOOTSTRAP_GCC ${LIBC_SYSROOT_ARG}          \
yann@1
    79
        install-headers                                     2>&1 |CT_DoLog DEBUG
yann@1
    80
yann@1
    81
    # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
yann@1
    82
    # so do them by hand.  We can tolerate an empty stubs.h for the moment.
yann@1
    83
    # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
yann@1
    84
    mkdir -p "${CT_HEADERS_DIR}/gnu"
yann@1
    85
    touch "${CT_HEADERS_DIR}/gnu/stubs.h"
yann@1
    86
    cp "${CT_SRC_DIR}/${CT_LIBC_FILE}/include/features.h" "${CT_HEADERS_DIR}/features.h"
yann@1
    87
yann@1
    88
    # Building the bootstrap gcc requires either setting inhibit_libc, or
yann@1
    89
    # having a copy of stdio_lim.h... see
yann@1
    90
    # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
yann@1
    91
    cp bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
yann@1
    92
yann@1
    93
    # Following error building gcc-4.0.0's gcj:
yann@1
    94
    #  error: bits/syscall.h: No such file or directory
yann@1
    95
    # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
yann@1
    96
    # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
yann@1
    97
    [ "${CT_ARCH}" != "arm" ] && cp misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true
yann@1
    98
yann@1
    99
    CT_EndStep
yann@1
   100
}
yann@1
   101
yann@1
   102
# This function builds and install the full glibc
yann@1
   103
do_libc() {
yann@1
   104
    CT_DoStep INFO "Installing C library"
yann@1
   105
yann@1
   106
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@1
   107
    cd "${CT_BUILD_DIR}/build-libc"
yann@1
   108
yann@1
   109
    CT_DoLog EXTRA "Configuring C library"
yann@1
   110
yann@1
   111
    # Add some default glibc config options if not given by user.
yann@1
   112
    extra_config=""
yann@1
   113
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@1
   114
        *enable-kernel*) ;;
yann@1
   115
        *) extra_config="${extra_config} --enable-kernel=${CT_KERNEL_VERSION}"
yann@1
   116
    esac
yann@1
   117
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@1
   118
        *-tls*) ;;
yann@1
   119
        *) extra_config="${extra_config} --without-tls"
yann@1
   120
    esac
yann@1
   121
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@1
   122
        *-__thread*) ;;
yann@1
   123
        *) extra_config="${extra_config} --without-__thread"
yann@1
   124
    esac
yann@1
   125
    case "${CT_SHARED_LIBS}" in
yann@1
   126
        y) extra_config="${extra_config} --enable-shared";;
yann@1
   127
        *) extra_config="${extra_config} --disable-shared";;
yann@1
   128
    esac
yann@1
   129
    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
yann@1
   130
    	*--with-fp*) ;;
yann@1
   131
    	*--without-fp*) ;;
yann@1
   132
    	*)  case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@1
   133
                y,) extra_config="${extra_config} --with-fp";;
yann@1
   134
                ,y) extra_config="${extra_config} --without-fp";;
yann@1
   135
            esac;;
yann@1
   136
    esac
yann@1
   137
    case "${CT_LIBC_ADDONS},${CT_LIBC_ADDONS_LIST}" in
yann@1
   138
        y,) extra_config="${extra_config} --enable-add-ons";;
yann@1
   139
        y,*) extra_config="${extra_config} --enable-add-ons=${CT_LIBC_ADDONS_LIST}";;
yann@1
   140
    esac
yann@1
   141
yann@1
   142
    CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\""
yann@1
   143
yann@1
   144
    # Add some default CC args
yann@1
   145
    extra_cc_args=
yann@1
   146
    case "${CT_LIBC_EXTRA_CC_ARGS}" in
yann@1
   147
        *-mbig-endian*) ;;
yann@1
   148
        *-mlittle-endian*) ;;
yann@1
   149
        *)  case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@1
   150
                y,) extra_cc_args="${extra_cc_args} -mbig-endian";;
yann@1
   151
                ,y) extra_cc_args="${extra_cc_args} -mlittle-endian";;
yann@1
   152
            esac;;
yann@1
   153
    esac
yann@1
   154
yann@1
   155
    CT_DoLog DEBUG "Extra CC args passed: \"${extra_cc_args}\""
yann@1
   156
yann@1
   157
    # sh3 and sh4 really need to set configparms as of gcc-3.4/glibc-2.3.2
yann@1
   158
    # note: this is awkward, doesn't work well if you need more than one line in configparms
yann@1
   159
    echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms
yann@1
   160
yann@1
   161
    # For glibc 2.3.4 and later we need to set some autoconf cache
yann@1
   162
    # variables, because nptl/sysdeps/pthread/configure.in does not
yann@1
   163
    # work when cross-compiling.
yann@1
   164
    if test -d ${GLIBC_DIR}/nptl; then
yann@1
   165
        libc_cv_forced_unwind=yes
yann@1
   166
        libc_cv_c_cleanup=yes
yann@1
   167
        export libc_cv_forced_unwind libc_cv_c_cleanup
yann@1
   168
    fi
yann@1
   169
yann@1
   170
    # Configure with --prefix the way we want it on the target...
yann@1
   171
    # There are a whole lot of settings here.  You'll probably want
yann@1
   172
    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
yann@1
   173
    # Compare these options with the ones used when installing the glibc headers above - they're different.
yann@1
   174
    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
yann@1
   175
    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
yann@1
   176
    # Set BUILD_CC, or you won't be able to build datafiles
yann@1
   177
    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
yann@1
   178
yann@1
   179
    BUILD_CC=${CT_CC_NATIVE}                                        \
yann@1
   180
    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O"   \
yann@1
   181
    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
yann@1
   182
    AR=${CT_TARGET}-ar                                              \
yann@1
   183
    RANLIB=${CT_TARGET}-ranlib                                      \
yann@1
   184
    "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure"                       \
yann@1
   185
        --prefix=/usr                                               \
yann@1
   186
        --build=${CT_BUILD} --host=${CT_TARGET}                     \
yann@1
   187
        ${CT_LIBC_GLIBC_EXTRA_CONFIG}                               \
yann@1
   188
        ${extra_config}                                             \
yann@1
   189
        --without-cvs                                               \
yann@1
   190
        --disable-profile                                           \
yann@1
   191
        --disable-debug                                             \
yann@1
   192
        --without-gd                                                \
yann@1
   193
        --with-headers="${CT_HEADERS_DIR}"                          2>&1 |CT_DoLog DEBUG
yann@1
   194
yann@1
   195
    if grep -l '^install-lib-all:' "${CT_SRC_DIR}/${CT_LIBC_FILE}/Makerules" > /dev/null; then
yann@1
   196
        # nptl-era glibc.
yann@1
   197
        # If the install-lib-all target (which is added by our make-install-lib-all.patch)
yann@1
   198
        # is present, it means we're building glibc-2.3.3 or later, and we can't
yann@1
   199
        # build programs yet, as they require libeh, which won't be installed
yann@1
   200
        # until full build of gcc
yann@1
   201
        GLIBC_INITIAL_BUILD_RULE=lib
yann@1
   202
        GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
yann@1
   203
        GLIBC_INSTALL_APPS_LATER=yes
yann@1
   204
    else
yann@1
   205
        # classic glibc.  
yann@1
   206
        # We can build and install everything with the bootstrap compiler.
yann@1
   207
        GLIBC_INITIAL_BUILD_RULE=all
yann@1
   208
        GLIBC_INITIAL_INSTALL_RULE=install
yann@1
   209
        GLIBC_INSTALL_APPS_LATER=no
yann@1
   210
    fi
yann@1
   211
yann@1
   212
    # If this fails with an error like this:
yann@1
   213
    # ...  linux/autoconf.h: No such file or directory 
yann@1
   214
    # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
yann@1
   215
    # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
yann@1
   216
    # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
yann@1
   217
    # No need for PARALLELMFLAGS here, Makefile already reads this environment variable
yann@1
   218
    CT_DoLog EXTRA "Building C library"
yann@1
   219
    make LD=${CT_TARGET}-ld             \
yann@1
   220
         RANLIB=${CT_TARGET}-ranlib     \
yann@1
   221
         ${GLIBC_INITIAL_BUILD_RULE}    2>&1 |CT_DoLog DEBUG
yann@1
   222
yann@1
   223
    CT_DoLog EXTRA "Installing C library"
yann@1
   224
    make install_root="${CT_SYSROOT_DIR}"   \
yann@1
   225
         ${LIBC_SYSROOT_ARG}                \
yann@1
   226
         ${GLIBC_INITIAL_INSTALL_RULE}      2>&1 |CT_DoLog DEBUG
yann@1
   227
yann@1
   228
    # This doesn't seem to work when building a crosscompiler,
yann@1
   229
    # as it tries to execute localedef using the just-built ld.so!?
yann@1
   230
    #CT_DoLog EXTRA "Installing locales"
yann@1
   231
    #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog DEBUG
yann@1
   232
yann@1
   233
    # Fix problems in linker scripts.
yann@1
   234
    #
yann@1
   235
    # 1. Remove absolute paths
yann@1
   236
    # Any file in a list of known suspects that isn't a symlink is assumed to be a linker script.
yann@1
   237
    # FIXME: test -h is not portable
yann@1
   238
    # FIXME: probably need to check more files than just these three...
yann@1
   239
    # Need to use sed instead of just assuming we know what's in libc.so because otherwise alpha breaks
yann@1
   240
    #
yann@1
   241
    # 2. Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
yann@1
   242
    # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
yann@1
   243
    #
yann@1
   244
    # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
yann@1
   245
    CT_DoLog EXTRA "Fixing C library linker scripts"
yann@1
   246
    for file in libc.so libpthread.so libgcc_s.so; do
yann@1
   247
        for dir in lib lib64 usr/lib usr/lib64; do
yann@1
   248
            if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
yann@1
   249
                mv "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
yann@1
   250
                CT_DoLog DEBUG "Fixing \"${CT_SYS_ROOT_DIR}/${dir}/${file}\""
yann@1
   251
                sed -i -r -e 's,/usr/lib/,,g;
yann@1
   252
                              s,/usr/lib64/,,g;
yann@1
   253
                              s,/lib/,,g;
yann@1
   254
                              s,/lib64/,,g;
yann@1
   255
                              /BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
yann@1
   256
            fi
yann@1
   257
        done
yann@1
   258
    done
yann@1
   259
yann@1
   260
    CT_EndStep
yann@1
   261
}
yann@1
   262
yann@1
   263
# This function finishes the glibc install
yann@1
   264
do_libc_finish() {
yann@1
   265
    # Finally, build and install glibc programs, now that libeh (if any) is installed
yann@1
   266
    # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
yann@1
   267
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
yann@1
   268
    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
yann@1
   269
    [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
yann@1
   270
yann@1
   271
    CT_DoStep INFO "Finishing C library"
yann@1
   272
yann@1
   273
    cd "${CT_BUILD_DIR}/build-libc"
yann@1
   274
yann@1
   275
    CT_DoLog EXTRA "Re-building C library"
yann@1
   276
    make LD=${CT_TARGET}-ld RANLIB=${CT_TARGET}-ranlib 2>&1 |CT_DoLog DEBUG
yann@1
   277
yann@1
   278
    CT_DoLog EXTRA "Installing missing C library components"
yann@1
   279
    # note: should do full install and then fix linker scripts, but this is faster
yann@1
   280
    for t in bin rootsbin sbin data others; do
yann@1
   281
        make install_root="${CT_SYSROOT_DIR}"   \
yann@1
   282
             ${LIBC_SYSROOT_ARG}                \
yann@1
   283
             install-${t}                       2>&1 |CT_DoLog DEBUG
yann@1
   284
    done
yann@1
   285
}