yann@787: # eglibc build functions (initially by Thomas JOURDAN). yann@787: yann@787: do_print_filename() { yann@787: [ "${CT_LIBC}" = "eglibc" ] || return 0 yann@787: echo "eglibc-${CT_LIBC_VERSION}" yann@787: for addon in $(do_libc_add_ons_list " "); do yann@787: # NPTL addon is not to be downloaded, in any case yann@787: [ "${addon}" = "nptl" ] && continue || true yann@787: echo "eglibc-${addon}-${CT_LIBC_VERSION}" yann@787: done yann@787: } yann@787: yann@787: # Download eglibc repository yann@787: do_eglibc_get() { yann@787: CT_HasOrAbort svn yann@787: yann@787: case "${CT_LIBC_VERSION}" in yann@787: trunk) svn_url="svn://svn.eglibc.org/trunk";; yann@787: *) svn_url="svn://svn.eglibc.org/branches/eglibc-${CT_LIBC_VERSION}";; yann@787: esac yann@787: yann@787: CT_MktempDir tmp_dir yann@787: CT_Pushd "${tmp_dir}" yann@787: yann@787: case "${CT_EGLIBC_CHECKOUT}" in yann@787: y) svn_action="checkout";; yann@787: *) svn_action="export --force";; yann@787: esac yann@787: yann@787: CT_DoSetProxy ${CT_PROXY_TYPE} yann@787: CT_DoExecLog ALL svn ${svn_action} -r "${CT_EGLIBC_REVISION:-HEAD}" "${svn_url}" . 2>&1 yann@787: yann@787: # Compress eglibc yann@787: CT_DoExecLog ALL mv libc "${CT_LIBC_FILE}" yann@787: CT_DoExecLog ALL tar cjf "${CT_TARBALLS_DIR}/${CT_LIBC_FILE}.tar.bz2" "${CT_LIBC_FILE}" yann@787: yann@787: # Compress linuxthreads, localedef and ports yann@787: # Assign them the name the way ct-ng like it yann@787: for addon in linuxthreads localedef ports; do yann@787: CT_DoExecLog ALL tar cjf "${CT_TARBALLS_DIR}/${CT_LIBC}-${addon}-${CT_LIBC_VERSION}.tar.bz2" "${addon}" yann@787: done yann@787: yann@787: CT_Popd yann@787: yann@787: # Remove source files yann@787: CT_DoExecLog ALL rm -rf "${tmp_dir}" yann@787: } yann@787: yann@787: # Download glibc yann@787: do_libc_get() { yann@787: # eglibc is only available through subversion, there are no yann@787: # snapshots available. Moreover, addons will be downloaded yann@787: # simultaneously. yann@787: yann@787: # build filename yann@787: eglibc="${CT_LIBC_FILE}.tar.bz2" yann@787: eglibc_linuxthreads="${CT_LIBC}-linuxthreads-${CT_LIBC_VERSION}.tar.bz2" yann@787: eglibc_localedef="${CT_LIBC}-localedef-${CT_LIBC_VERSION}.tar.bz2" yann@787: eglibc_ports="${CT_LIBC}-ports-${CT_LIBC_VERSION}.tar.bz2" yann@787: yann@787: # Check if every tarballs are already present yann@787: if [ -a "${CT_TARBALLS_DIR}/${eglibc}" ] && \ yann@787: [ -a "${CT_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \ yann@787: [ -a "${CT_TARBALLS_DIR}/${eglibc_localedef}" ] && \ yann@787: [ -a "${CT_TARBALLS_DIR}/${eglibc_ports}" ]; then yann@787: CT_DoLog DEBUG "Already have 'eglibc-${CT_LIBC_VERSION}'" yann@787: return 0 yann@787: fi yann@787: yann@787: if [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc}" ] && \ yann@787: [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \ yann@787: [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_localedef}" ] && \ yann@787: [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_ports}" ] && \ yann@787: [ "${CT_FORCE_DOWNLOAD}" != "y" ]; then yann@799: CT_DoLog DEBUG "Got 'eglibc-${CT_LIBC_VERSION}' from local storage" yann@787: for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do yann@790: CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}" yann@787: done yann@787: return 0 yann@787: fi yann@787: yann@787: # Not found locally, try from the network yann@790: CT_DoLog EXTRA "Retrieving 'eglibc-${CT_LIBC_VERSION}'" yann@787: do_eglibc_get yann@787: yann@787: if [ "${CT_SAVE_TARBALLS}" = "y" ]; then yann@790: CT_DoLog EXTRA "Saving 'eglibc-${CT_LIBC_VERSION}' to local storage" yann@787: for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do yann@790: CT_DoExecLog ALL mv -f "${CT_TARBALLS_DIR}/${file}" "${CT_LOCAL_TARBALLS_DIR}" yann@790: CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}" yann@787: done yann@787: fi yann@787: yann@787: return 0 yann@787: } yann@787: yann@787: # Extract eglibc yann@787: do_libc_extract() { yann@787: CT_ExtractAndPatch "${CT_LIBC_FILE}" yann@787: yann@787: # C library addons yann@787: for addon in $(do_libc_add_ons_list " "); do yann@787: # NPTL addon is not to be extracted, in any case yann@787: [ "${addon}" = "nptl" ] && continue || true yann@787: CT_ExtractAndPatch "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" yann@787: done yann@787: yann@787: return 0 yann@787: } yann@787: yann@787: # There is nothing to do for eglibc check config yann@787: do_libc_check_config() { yann@787: : yann@787: } yann@787: yann@787: # This function installs the glibc headers needed to build the core compiler yann@787: do_libc_headers() { yann@787: # Instead of doing two time the same actions, headers will yann@787: # be installed with start files yann@787: : yann@787: } yann@787: yann@787: # Build and install start files yann@787: do_libc_start_files() { yann@787: CT_DoStep INFO "Installing C library headers / start files" yann@787: yann@787: mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles" yann@787: cd "${CT_BUILD_DIR}/build-libc-startfiles" yann@787: yann@787: CT_DoLog EXTRA "Configuring C library" yann@787: yann@787: cross_cc=$(CT_Which "${CT_TARGET}-gcc") yann@787: cross_cxx=$(CT_Which "${CT_TARGET}-g++") yann@787: cross_ar=$(CT_Which "${CT_TARGET}-ar") yann@787: cross_ranlib=$(CT_Which "${CT_TARGET}-ranlib") yann@787: yann@787: CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'" yann@787: CT_DoLog DEBUG "Using g++ for target: '${cross_cxx}'" yann@787: CT_DoLog DEBUG "Using ar for target: '${cross_ar}'" yann@787: CT_DoLog DEBUG "Using ranlib for target: '${cross_ranlib}'" yann@787: yann@787: BUILD_CC=${CT_CC_NATIVE} \ yann@787: CC=${cross_cc} \ yann@787: CXX=${cross_cxx} \ yann@787: AR=${cross_ar} \ yann@787: RANLIB=${cross_ranlib} \ yann@787: CT_DoExecLog ALL \ yann@787: "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \ yann@787: --prefix=/usr \ yann@787: --with-headers="${CT_HEADERS_DIR}" \ yann@787: --build="${CT_UNIQ_BUILD}" \ yann@787: --host="${CT_TARGET}" \ yann@787: --disable-profile \ yann@787: --without-gd \ yann@787: --without-cvs \ yann@787: --enable-add-ons yann@787: yann@787: CT_DoLog EXTRA "Installing C library headers" yann@787: yann@787: # use the 'install-headers' makefile target to install the yann@787: # headers yann@787: yann@787: CT_DoExecLog ALL \ yann@787: make install-headers \ yann@787: install_root=${CT_SYSROOT_DIR} \ yann@787: install-bootstrap-headers=yes yann@787: yann@787: CT_DoLog EXTRA "Installing C library start files" yann@787: yann@787: # there are a few object files needed to link shared libraries, yann@787: # which we build and install by hand yann@787: yann@787: CT_DoExecLog ALL mkdir -p ${CT_SYSROOT_DIR}/usr/lib yann@787: CT_DoExecLog ALL make csu/subdir_lib yann@787: CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \ yann@787: ${CT_SYSROOT_DIR}/usr/lib yann@787: yann@787: # Finally, 'libgcc_s.so' requires a 'libc.so' to link against. yann@787: # However, since we will never actually execute its code, yann@787: # it doesn't matter what it contains. So, treating '/dev/null' yann@787: # as a C source file, we produce a dummy 'libc.so' in one step yann@787: yann@787: CT_DoExecLog ALL ${cross_cc} -nostdlib -nostartfiles -shared -x c /dev/null -o ${CT_SYSROOT_DIR}/usr/lib/libc.so yann@787: yann@787: CT_EndStep yann@787: } yann@787: yann@787: # This function builds and install the full glibc yann@787: do_libc() { yann@787: CT_DoStep INFO "Installing C library" yann@787: yann@787: mkdir -p "${CT_BUILD_DIR}/build-libc" yann@787: cd "${CT_BUILD_DIR}/build-libc" yann@787: yann@787: CT_DoLog EXTRA "Configuring C library" yann@787: yann@787: # Add some default glibc config options if not given by user. yann@787: # We don't need to be conditional on wether the user did set different yann@787: # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config yann@787: yann@787: extra_config="--enable-kernel=$(echo ${CT_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')" yann@787: yann@787: case "${CT_THREADS}" in yann@787: nptl) extra_config="${extra_config} --with-__thread --with-tls";; yann@787: linuxthreads) extra_config="${extra_config} --with-__thread --without-tls --without-nptl";; yann@787: none) extra_config="${extra_config} --without-__thread --without-nptl" yann@787: case "${CT_LIBC_EGLIBC_EXTRA_CONFIG}" in yann@787: *-tls*) ;; yann@787: *) extra_config="${extra_config} --without-tls";; yann@787: esac yann@787: ;; yann@787: esac yann@787: yann@787: case "${CT_SHARED_LIBS}" in yann@787: y) extra_config="${extra_config} --enable-shared";; yann@787: *) extra_config="${extra_config} --disable-shared";; yann@787: esac yann@787: yann@787: case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in yann@787: y,) extra_config="${extra_config} --with-fp";; yann@787: ,y) extra_config="${extra_config} --without-fp";; yann@787: esac yann@787: yann@787: case "$(do_libc_add_ons_list ,)" in yann@787: "") ;; yann@787: *) extra_config="${extra_config} --enable-add-ons=$(do_libc_add_ons_list ,)";; yann@787: esac yann@787: yann@787: extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}" yann@787: yann@787: cross_cc=$(CT_Which "${CT_TARGET}-gcc") yann@787: yann@787: CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'" yann@787: CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" yann@787: CT_DoLog DEBUG "Extra config args passed: '${extra_config}'" yann@787: CT_DoLog DEBUG "Extra CC args passed : '${extra_cc_args}'" yann@787: yann@787: BUILD_CC=${CT_CC_NATIVE} \ yann@787: CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_EGLIBC_EXTRA_CFLAGS} -O" \ yann@787: CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \ yann@787: AR=${CT_TARGET}-ar \ yann@787: RANLIB=${CT_TARGET}-ranlib \ yann@787: CT_DoExecLog ALL \ yann@787: "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \ yann@787: --prefix=/usr \ yann@787: --with-headers="${CT_HEADERS_DIR}" \ yann@787: --build=${CT_UNIQ_BUILD} \ yann@787: --host=${CT_TARGET} \ yann@787: --disable-profile \ yann@787: --without-gd \ yann@787: --without-cvs \ yann@787: ${extra_config} \ yann@787: ${CT_LIBC_EGLIBC_EXTRA_CONFIG} yann@787: yann@787: CT_DoLog EXTRA "Building C library" yann@787: yann@787: CT_DoExecLog ALL make yann@787: yann@787: CT_DoLog EXTRA "Installing C library" yann@787: yann@787: CT_DoExecLog ALL make install install_root="${CT_SYSROOT_DIR}" yann@787: yann@787: CT_EndStep yann@787: } yann@787: yann@787: # This function finishes the glibc install yann@787: do_libc_finish() { yann@787: # Nothing to be done for eglibc yann@787: : yann@787: } yann@787: yann@787: # Build up the addons list, separated with $1 yann@787: do_libc_add_ons_list() { yann@787: local sep="$1" yann@787: local addons_list=$(echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,) yann@787: case "${CT_THREADS}" in yann@787: none) ;; yann@787: *) addons_list="${addons_list}${sep}${CT_THREADS}";; yann@787: esac yann@787: [ "${CT_LIBC_EGLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports" yann@787: addons_list="${addons_list%%${sep}}" yann@787: echo "${addons_list##${sep}}" yann@787: }