1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/scripts/build/libc/eglibc.sh Sun Sep 14 16:21:07 2008 +0000
1.3 @@ -0,0 +1,283 @@
1.4 +# eglibc build functions (initially by Thomas JOURDAN).
1.5 +
1.6 +do_print_filename() {
1.7 + [ "${CT_LIBC}" = "eglibc" ] || return 0
1.8 + echo "eglibc-${CT_LIBC_VERSION}"
1.9 + for addon in $(do_libc_add_ons_list " "); do
1.10 + # NPTL addon is not to be downloaded, in any case
1.11 + [ "${addon}" = "nptl" ] && continue || true
1.12 + echo "eglibc-${addon}-${CT_LIBC_VERSION}"
1.13 + done
1.14 +}
1.15 +
1.16 +# Download eglibc repository
1.17 +do_eglibc_get() {
1.18 + CT_HasOrAbort svn
1.19 +
1.20 + case "${CT_LIBC_VERSION}" in
1.21 + trunk) svn_url="svn://svn.eglibc.org/trunk";;
1.22 + *) svn_url="svn://svn.eglibc.org/branches/eglibc-${CT_LIBC_VERSION}";;
1.23 + esac
1.24 +
1.25 + CT_MktempDir tmp_dir
1.26 + CT_Pushd "${tmp_dir}"
1.27 +
1.28 + case "${CT_EGLIBC_CHECKOUT}" in
1.29 + y) svn_action="checkout";;
1.30 + *) svn_action="export --force";;
1.31 + esac
1.32 +
1.33 + CT_DoSetProxy ${CT_PROXY_TYPE}
1.34 + CT_DoExecLog ALL svn ${svn_action} -r "${CT_EGLIBC_REVISION:-HEAD}" "${svn_url}" . 2>&1
1.35 +
1.36 + # Compress eglibc
1.37 + CT_DoExecLog ALL mv libc "${CT_LIBC_FILE}"
1.38 + CT_DoExecLog ALL tar cjf "${CT_TARBALLS_DIR}/${CT_LIBC_FILE}.tar.bz2" "${CT_LIBC_FILE}"
1.39 +
1.40 + # Compress linuxthreads, localedef and ports
1.41 + # Assign them the name the way ct-ng like it
1.42 + for addon in linuxthreads localedef ports; do
1.43 + CT_DoExecLog ALL tar cjf "${CT_TARBALLS_DIR}/${CT_LIBC}-${addon}-${CT_LIBC_VERSION}.tar.bz2" "${addon}"
1.44 + done
1.45 +
1.46 + CT_Popd
1.47 +
1.48 + # Remove source files
1.49 + CT_DoExecLog ALL rm -rf "${tmp_dir}"
1.50 +}
1.51 +
1.52 +# Download glibc
1.53 +do_libc_get() {
1.54 + # eglibc is only available through subversion, there are no
1.55 + # snapshots available. Moreover, addons will be downloaded
1.56 + # simultaneously.
1.57 +
1.58 + # build filename
1.59 + eglibc="${CT_LIBC_FILE}.tar.bz2"
1.60 + eglibc_linuxthreads="${CT_LIBC}-linuxthreads-${CT_LIBC_VERSION}.tar.bz2"
1.61 + eglibc_localedef="${CT_LIBC}-localedef-${CT_LIBC_VERSION}.tar.bz2"
1.62 + eglibc_ports="${CT_LIBC}-ports-${CT_LIBC_VERSION}.tar.bz2"
1.63 +
1.64 + # Check if every tarballs are already present
1.65 + if [ -a "${CT_TARBALLS_DIR}/${eglibc}" ] && \
1.66 + [ -a "${CT_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \
1.67 + [ -a "${CT_TARBALLS_DIR}/${eglibc_localedef}" ] && \
1.68 + [ -a "${CT_TARBALLS_DIR}/${eglibc_ports}" ]; then
1.69 + CT_DoLog DEBUG "Already have 'eglibc-${CT_LIBC_VERSION}'"
1.70 + return 0
1.71 + fi
1.72 +
1.73 + if [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc}" ] && \
1.74 + [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_linuxthreads}" ] && \
1.75 + [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_localedef}" ] && \
1.76 + [ -a "${CT_LOCAL_TARBALLS_DIR}/${eglibc_ports}" ] && \
1.77 + [ "${CT_FORCE_DOWNLOAD}" != "y" ]; then
1.78 + CT_DoLog DEBUG "Got 'eglibc-${CT_LIBC_VERSION}' from local storage"
1.79 + for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
1.80 + CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}"
1.81 + done
1.82 + return 0
1.83 + fi
1.84 +
1.85 + # Not found locally, try from the network
1.86 + CT_DoLog EXTRA "Retrieving 'eglibc-${CT_LIBC_VERSION}'"
1.87 + do_eglibc_get
1.88 +
1.89 + if [ "${CT_SAVE_TARBALLS}" = "y" ]; then
1.90 + CT_DoLog EXTRA "Saving 'eglibc-${CT_LIBC_VERSION}' to local storage"
1.91 + for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do
1.92 + CT_DoExecLog ALL mv -f "${CT_TARBALLS_DIR}/${file}" "${CT_LOCAL_TARBALLS_DIR}"
1.93 + CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}"
1.94 + done
1.95 + fi
1.96 +
1.97 + return 0
1.98 +}
1.99 +
1.100 +# Extract eglibc
1.101 +do_libc_extract() {
1.102 + CT_ExtractAndPatch "${CT_LIBC_FILE}"
1.103 +
1.104 + # C library addons
1.105 + for addon in $(do_libc_add_ons_list " "); do
1.106 + # NPTL addon is not to be extracted, in any case
1.107 + [ "${addon}" = "nptl" ] && continue || true
1.108 + CT_ExtractAndPatch "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
1.109 + done
1.110 +
1.111 + return 0
1.112 +}
1.113 +
1.114 +# There is nothing to do for eglibc check config
1.115 +do_libc_check_config() {
1.116 + :
1.117 +}
1.118 +
1.119 +# This function installs the glibc headers needed to build the core compiler
1.120 +do_libc_headers() {
1.121 + # Instead of doing two time the same actions, headers will
1.122 + # be installed with start files
1.123 + :
1.124 +}
1.125 +
1.126 +# Build and install start files
1.127 +do_libc_start_files() {
1.128 + CT_DoStep INFO "Installing C library headers / start files"
1.129 +
1.130 + mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
1.131 + cd "${CT_BUILD_DIR}/build-libc-startfiles"
1.132 +
1.133 + CT_DoLog EXTRA "Configuring C library"
1.134 +
1.135 + cross_cc=$(CT_Which "${CT_TARGET}-gcc")
1.136 + cross_cxx=$(CT_Which "${CT_TARGET}-g++")
1.137 + cross_ar=$(CT_Which "${CT_TARGET}-ar")
1.138 + cross_ranlib=$(CT_Which "${CT_TARGET}-ranlib")
1.139 +
1.140 + CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
1.141 + CT_DoLog DEBUG "Using g++ for target: '${cross_cxx}'"
1.142 + CT_DoLog DEBUG "Using ar for target: '${cross_ar}'"
1.143 + CT_DoLog DEBUG "Using ranlib for target: '${cross_ranlib}'"
1.144 +
1.145 + BUILD_CC=${CT_CC_NATIVE} \
1.146 + CC=${cross_cc} \
1.147 + CXX=${cross_cxx} \
1.148 + AR=${cross_ar} \
1.149 + RANLIB=${cross_ranlib} \
1.150 + CT_DoExecLog ALL \
1.151 + "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
1.152 + --prefix=/usr \
1.153 + --with-headers="${CT_HEADERS_DIR}" \
1.154 + --build="${CT_UNIQ_BUILD}" \
1.155 + --host="${CT_TARGET}" \
1.156 + --disable-profile \
1.157 + --without-gd \
1.158 + --without-cvs \
1.159 + --enable-add-ons
1.160 +
1.161 + CT_DoLog EXTRA "Installing C library headers"
1.162 +
1.163 + # use the 'install-headers' makefile target to install the
1.164 + # headers
1.165 +
1.166 + CT_DoExecLog ALL \
1.167 + make install-headers \
1.168 + install_root=${CT_SYSROOT_DIR} \
1.169 + install-bootstrap-headers=yes
1.170 +
1.171 + CT_DoLog EXTRA "Installing C library start files"
1.172 +
1.173 + # there are a few object files needed to link shared libraries,
1.174 + # which we build and install by hand
1.175 +
1.176 + CT_DoExecLog ALL mkdir -p ${CT_SYSROOT_DIR}/usr/lib
1.177 + CT_DoExecLog ALL make csu/subdir_lib
1.178 + CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
1.179 + ${CT_SYSROOT_DIR}/usr/lib
1.180 +
1.181 + # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
1.182 + # However, since we will never actually execute its code,
1.183 + # it doesn't matter what it contains. So, treating '/dev/null'
1.184 + # as a C source file, we produce a dummy 'libc.so' in one step
1.185 +
1.186 + CT_DoExecLog ALL ${cross_cc} -nostdlib -nostartfiles -shared -x c /dev/null -o ${CT_SYSROOT_DIR}/usr/lib/libc.so
1.187 +
1.188 + CT_EndStep
1.189 +}
1.190 +
1.191 +# This function builds and install the full glibc
1.192 +do_libc() {
1.193 + CT_DoStep INFO "Installing C library"
1.194 +
1.195 + mkdir -p "${CT_BUILD_DIR}/build-libc"
1.196 + cd "${CT_BUILD_DIR}/build-libc"
1.197 +
1.198 + CT_DoLog EXTRA "Configuring C library"
1.199 +
1.200 + # Add some default glibc config options if not given by user.
1.201 + # We don't need to be conditional on wether the user did set different
1.202 + # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
1.203 +
1.204 + extra_config="--enable-kernel=$(echo ${CT_LIBC_GLIBC_MIN_KERNEL} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;')"
1.205 +
1.206 + case "${CT_THREADS}" in
1.207 + nptl) extra_config="${extra_config} --with-__thread --with-tls";;
1.208 + linuxthreads) extra_config="${extra_config} --with-__thread --without-tls --without-nptl";;
1.209 + none) extra_config="${extra_config} --without-__thread --without-nptl"
1.210 + case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
1.211 + *-tls*) ;;
1.212 + *) extra_config="${extra_config} --without-tls";;
1.213 + esac
1.214 + ;;
1.215 + esac
1.216 +
1.217 + case "${CT_SHARED_LIBS}" in
1.218 + y) extra_config="${extra_config} --enable-shared";;
1.219 + *) extra_config="${extra_config} --disable-shared";;
1.220 + esac
1.221 +
1.222 + case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
1.223 + y,) extra_config="${extra_config} --with-fp";;
1.224 + ,y) extra_config="${extra_config} --without-fp";;
1.225 + esac
1.226 +
1.227 + case "$(do_libc_add_ons_list ,)" in
1.228 + "") ;;
1.229 + *) extra_config="${extra_config} --enable-add-ons=$(do_libc_add_ons_list ,)";;
1.230 + esac
1.231 +
1.232 + extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
1.233 +
1.234 + cross_cc=$(CT_Which "${CT_TARGET}-gcc")
1.235 +
1.236 + CT_DoLog DEBUG "Using gcc for target: '${cross_cc}'"
1.237 + CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
1.238 + CT_DoLog DEBUG "Extra config args passed: '${extra_config}'"
1.239 + CT_DoLog DEBUG "Extra CC args passed : '${extra_cc_args}'"
1.240 +
1.241 + BUILD_CC=${CT_CC_NATIVE} \
1.242 + CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O" \
1.243 + CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
1.244 + AR=${CT_TARGET}-ar \
1.245 + RANLIB=${CT_TARGET}-ranlib \
1.246 + CT_DoExecLog ALL \
1.247 + "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
1.248 + --prefix=/usr \
1.249 + --with-headers="${CT_HEADERS_DIR}" \
1.250 + --build=${CT_UNIQ_BUILD} \
1.251 + --host=${CT_TARGET} \
1.252 + --disable-profile \
1.253 + --without-gd \
1.254 + --without-cvs \
1.255 + ${extra_config} \
1.256 + ${CT_LIBC_GLIBC_EXTRA_CONFIG}
1.257 +
1.258 + CT_DoLog EXTRA "Building C library"
1.259 +
1.260 + CT_DoExecLog ALL make
1.261 +
1.262 + CT_DoLog EXTRA "Installing C library"
1.263 +
1.264 + CT_DoExecLog ALL make install install_root="${CT_SYSROOT_DIR}"
1.265 +
1.266 + CT_EndStep
1.267 +}
1.268 +
1.269 +# This function finishes the glibc install
1.270 +do_libc_finish() {
1.271 + # Nothing to be done for eglibc
1.272 + :
1.273 +}
1.274 +
1.275 +# Build up the addons list, separated with $1
1.276 +do_libc_add_ons_list() {
1.277 + local sep="$1"
1.278 + local addons_list=$(echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,)
1.279 + case "${CT_THREADS}" in
1.280 + none) ;;
1.281 + *) addons_list="${addons_list}${sep}${CT_THREADS}";;
1.282 + esac
1.283 + [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
1.284 + addons_list="${addons_list%%${sep}}"
1.285 + echo "${addons_list##${sep}}"
1.286 +}