Robert P. J. DAY says:
apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
1 # This file adds functions to build glibc
2 # Copyright 2007 Yann E. MORIN
3 # Licensed under the GPL v2. See COPYING in the root of this package
6 [ "${CT_LIBC}" = "glibc" ] || return 0
7 echo "glibc-${CT_LIBC_VERSION}"
8 for addon in `do_libc_add_ons_list " "`; do
9 # NPTL addon is not to be downloaded, in any case
10 [ "${addon}" = "nptl" ] && continue || true
11 echo "glibc-${addon}-${CT_LIBC_VERSION}"
17 # Ah! Not all GNU folks seem stupid. All glibc releases are in the same
18 # directory. Good. Alas, there is no snapshot there. I'll deal with them
20 CT_GetFile "${CT_LIBC_FILE}" ftp://ftp.gnu.org/gnu/glibc
23 for addon in `do_libc_add_ons_list " "`; do
24 # NPTL addon is not to be downloaded, in any case
25 [ "${addon}" = "nptl" ] && continue || true
26 CT_GetFile "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ftp://ftp.gnu.org/gnu/glibc
34 CT_ExtractAndPatch "${CT_LIBC_FILE}"
37 for addon in `do_libc_add_ons_list " "`; do
38 # NPTL addon is not to be extracted, in any case
39 [ "${addon}" = "nptl" ] && continue || true
40 CT_ExtractAndPatch "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
46 # There is nothing to do for glibc check config
47 do_libc_check_config() {
51 # This function installs the glibc headers needed to build the core compiler
53 # Only need to install bootstrap glibc headers for gcc-3.0 and above? Or maybe just gcc-3.3 and above?
54 # See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
55 grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_FILE}/ChangeLog" 2>/dev/null || return 0
57 CT_DoStep INFO "Installing C library headers"
59 mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
60 cd "${CT_BUILD_DIR}/build-libc-headers"
62 CT_DoLog EXTRA "Configuring C library"
64 # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions.
65 # 1. override CC to keep glibc's configure from using $TARGET-gcc.
66 # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly
67 # 3. build with gcc 3.2 or later
68 # Compare these options with the ones used when building glibc for real below - they're different.
69 # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode
70 # so when configure checks to make sure gcc has access to the assembler you just built...
71 # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path.
72 # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet)
74 # "*** WARNING: Are you sure you do not want to use the `linuxthreads'"
76 # is ok here, since all we want are the basic headers at this point.
77 # Override libc_cv_ppc_machine so glibc-cvs doesn't complain
78 # 'a version of binutils that supports .machine "altivec" is needed'.
80 addons_config="--enable-add-ons=`do_libc_add_ons_list ,`"
81 # We need to remove any threading addon when installing headers
82 addons_config="${addons_config//nptl/}"
83 addons_config="${addons_config//linuxthreads/}"
84 addons_config=`echo "${addons_config}" |sed -r -e 's/^,+//; s/,+$//; s/,+/,/g;'`
86 cross_cc=`CT_Which "${CT_TARGET}-gcc"`
87 CT_DoLog DEBUG "Using gcc for target: \"${cross_cc}\""
88 CT_DoLog DEBUG "Extra config passed : \"${addons_config}\""
90 libc_cv_ppc_machine=yes \
92 "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
93 --build="${CT_UNIQ_BUILD}" \
94 --host="${CT_TARGET}" \
96 --with-headers="${CT_HEADERS_DIR}" \
98 --disable-sanity-checks \
99 --enable-hacker-mode \
101 --without-nptl 2>&1 |CT_DoLog ALL
103 CT_DoLog EXTRA "Installing C library headers"
105 if grep -q GLIBC_2.3 "${CT_SRC_DIR}/${CT_LIBC_FILE}/ChangeLog"; then
106 # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c,
107 # which fails without a real cross-compiler.
108 # Fortunately, we don't need errlist-compat.c, since we just need .h
109 # files, so work around this by creating a fake errlist-compat.c and
110 # satisfying its dependencies.
111 # Another workaround might be to tell configure to not use any cross
113 # The real fix would be to get install-headers to not generate
115 # Note: BOOTSTRAP_GCC is used by:
116 # patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
118 libc_cv_ppc_machine=yes \
119 make CFLAGS="-O -DBOOTSTRAP_GCC" sysdeps/gnu/errlist.c 2>&1 |CT_DoLog ALL
120 mkdir -p stdio-common
122 # sleep for 2 seconds for benefit of filesystems with lousy time
123 # resolution, like FAT, so make knows for sure errlist-compat.c doesn't
126 touch stdio-common/errlist-compat.c
128 # Note: BOOTSTRAP_GCC (see above)
129 libc_cv_ppc_machine=yes \
130 make cross-compiling=yes install_root=${CT_SYSROOT_DIR} \
131 CFLAGS="-O -DBOOTSTRAP_GCC" ${LIBC_SYSROOT_ARG} \
132 install-headers 2>&1 |CT_DoLog ALL
134 # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
135 # so do them by hand. We can tolerate an empty stubs.h for the moment.
136 # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
137 mkdir -p "${CT_HEADERS_DIR}/gnu"
138 touch "${CT_HEADERS_DIR}/gnu/stubs.h"
139 cp "${CT_SRC_DIR}/${CT_LIBC_FILE}/include/features.h" "${CT_HEADERS_DIR}/features.h"
141 # Building the bootstrap gcc requires either setting inhibit_libc, or
142 # having a copy of stdio_lim.h... see
143 # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
144 cp bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
146 # Following error building gcc-4.0.0's gcj:
147 # error: bits/syscall.h: No such file or directory
148 # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
149 # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
150 [ "${CT_ARCH}" != "arm" ] && cp misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true
152 # Those headers are to be manually copied so gcc can build properly
153 pthread_h="${CT_SRC_DIR}/${CT_LIBC_FILE}/${CT_THREADS}/sysdeps/pthread/pthread.h"
155 case "${CT_THREADS}" in
157 # NOTE: for some archs, the pathes are different, but they are not
158 # supported by crosstool-NG right now. See original crosstool when they are.
159 pthread_h="${CT_SRC_DIR}/${CT_LIBC_FILE}/${CT_THREADS}/sysdeps/pthread/pthread.h"
160 pthreadtypes_h="${CT_SRC_DIR}/${CT_LIBC_FILE}/nptl/sysdeps/unix/sysv/linux/${CT_KERNEL_ARCH}/bits/pthreadtypes.h"
161 if [ ! -f "${pthreadtypes_h}" ]; then
162 pthreadtypes_h="${CT_SRC_DIR}/${CT_LIBC_FILE}/${CT_LIBC}-ports-${CT_LIBC_VERSION}/sysdeps/unix/sysv/linux/${CT_KERNEL_ARCH}/nptl/bits/pthreadtypes.h"
166 pthreadtypes_h="${CT_SRC_DIR}/${CT_LIBC_FILE}/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h"
173 if [ -n "${pthread_h}" ]; then
174 cp -v "${pthread_h}" "${CT_HEADERS_DIR}/pthread.h" 2>&1 |CT_DoLog ALL
176 if [ -n "${pthreadtypes_h}" ]; then
177 cp -v "${pthreadtypes_h}" "${CT_HEADERS_DIR}/bits/pthreadtypes.h" 2>&1 |CT_DoLog ALL
183 # Build and install start files
184 do_libc_start_files() {
185 # Needed only in the NPTL case. Otherwise, return.
186 [ "${CT_THREADS}" = "nptl" ] || return 0
188 CT_DoStep INFO "Installing C library start files"
190 mkdir -p "${CT_BUILD_DIR}/build-libc-startfiles"
191 cd "${CT_BUILD_DIR}/build-libc-startfiles"
193 CT_DoLog EXTRA "Configuring C library"
195 # Add some default glibc config options if not given by user.
197 case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
199 *) extra_config="${extra_config} --enable-kernel=`echo ${CT_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;'`"
201 case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
203 *) extra_config="${extra_config} --with-tls"
205 case "${CT_SHARED_LIBS}" in
206 y) extra_config="${extra_config} --enable-shared";;
207 *) extra_config="${extra_config} --disable-shared";;
209 case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
210 y,) extra_config="${extra_config} --with-fp";;
211 ,y) extra_config="${extra_config} --without-fp";;
213 # Obviously, we want threads, as we come here only for NPTL
214 extra_config="${extra_config} --with-__thread"
216 addons_config="--enable-add-ons=`do_libc_add_ons_list ,`"
217 extra_config="${extra_config} ${addons_config}"
219 # Add some default CC args
220 glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([^\.]+)\..*/\1/')
221 glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[^\.]+\.([^.]+).*/\1/')
222 if [ ${glibc_version_major} -ge 2 -a ${glibc_version_minor} -ge 6 ]; then
223 # Don't use -pipe: configure chokes on it for glibc >= 2.6.
224 CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
225 extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
227 extra_cc_args="${CT_CFLAGS_FOR_HOST}"
229 extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
231 cross_cc=`CT_Which "${CT_TARGET}-gcc"`
232 CT_DoLog DEBUG "Using gcc for target : \"${cross_cc}\""
233 CT_DoLog DEBUG "Configuring with addons : \"`do_libc_add_ons_list ,`\""
234 CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\""
235 CT_DoLog DEBUG "Extra CC args passed : \"${extra_cc_args}\""
237 # Super-H really needs to set configparms as of gcc-3.4/glibc-2.3.2
238 # note: this is awkward, doesn't work well if you need more than one
239 # line in configparms
240 echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms
242 echo "libc_cv_forced_unwind=yes" > config.cache
243 echo "libc_cv_c_cleanup=yes" >> config.cache
245 # Please see the comment for the configure step in do_libc().
247 BUILD_CC=${CT_CC_NATIVE} \
248 CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O " \
249 CC="${cross_cc} ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
251 RANLIB=${CT_TARGET}-ranlib \
252 "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
254 --build="${CT_UNIQ_BUILD}" \
255 --host=${CT_TARGET} \
260 --with-headers="${CT_HEADERS_DIR}" \
261 --cache-file=config.cache \
263 ${CT_LIBC_GLIBC_EXTRA_CONFIG} 2>&1 |CT_DoLog ALL
266 #TODO: should check whether slibdir has been set in configparms to */lib64
267 # and copy the startfiles into the appropriate libdir.
268 CT_DoLog EXTRA "Building C library start files"
269 make csu/subdir_lib 2>&1 |CT_DoLog ALL
271 CT_DoLog EXTRA "Installing C library start files"
272 if [ "${CT_USE_SYSROOT}" = "y" ]; then
273 cp -fp csu/crt[1in].o "${CT_SYSROOT_DIR}/usr/lib/"
275 cp -fp csu/crt[1in].o "${CT_SYSROOT_DIR}/lib/"
281 # This function builds and install the full glibc
283 CT_DoStep INFO "Installing C library"
285 mkdir -p "${CT_BUILD_DIR}/build-libc"
286 cd "${CT_BUILD_DIR}/build-libc"
288 CT_DoLog EXTRA "Configuring C library"
290 # Add some default glibc config options if not given by user.
291 # We don't need to be conditional on wether the user did set different
292 # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG is passed after extra_config
294 extra_config="--enable-kernel=`echo ${CT_KERNEL_VERSION} |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;'`"
296 case "${CT_THREADS}" in
297 nptl) extra_config="${extra_config} --with-__thread --with-tls";;
298 linuxthreads) extra_config="${extra_config} --with-__thread --without-tls --without-nptl";;
299 none) extra_config="${extra_config} --without-__thread --without-nptl"
300 case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
302 *) extra_config="${extra_config} --without-tls";;
307 case "${CT_SHARED_LIBS}" in
308 y) extra_config="${extra_config} --enable-shared";;
309 *) extra_config="${extra_config} --disable-shared";;
312 case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
313 y,) extra_config="${extra_config} --with-fp";;
314 ,y) extra_config="${extra_config} --without-fp";;
317 case "`do_libc_add_ons_list ,`" in
319 *) extra_config="${extra_config} --enable-add-ons=`do_libc_add_ons_list ,`";;
323 # Add some default CC args
324 glibc_version_major=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^([^\.]+)\..*/\1/')
325 glibc_version_minor=$(echo ${CT_LIBC_VERSION} |sed -r -e 's/^[^\.]+\.([^.]+).*/\1/')
326 if [ ${glibc_version_major} -ge 2 -a ${glibc_version_minor} -ge 6 ]; then
327 # Don't use -pipe: configure chokes on it for glibc >= 2.6.
328 CT_Test 'Removing "-pipe" for use with glibc>=2.6' "${CT_USE_PIPES}" = "y"
329 extra_cc_args="${CT_CFLAGS_FOR_HOST/-pipe}"
331 extra_cc_args="${CT_CFLAGS_FOR_HOST}"
333 extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
335 cross_cc=`CT_Which "${CT_TARGET}-gcc"`
336 CT_DoLog DEBUG "Using gcc for target : \"${cross_cc}\""
337 CT_DoLog DEBUG "Configuring with addons : \"`do_libc_add_ons_list ,`\""
338 CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\""
339 CT_DoLog DEBUG "Extra CC args passed : \"${extra_cc_args}\""
341 # sh3 and sh4 really need to set configparms as of gcc-3.4/glibc-2.3.2
342 # note: this is awkward, doesn't work well if you need more than one line in configparms
343 echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms
345 # For glibc 2.3.4 and later we need to set some autoconf cache
346 # variables, because nptl/sysdeps/pthread/configure.in does not
347 # work when cross-compiling.
348 if [ "${CT_THREADS}" = "nptl" ]; then
349 echo libc_cv_forced_unwind=yes
350 echo libc_cv_c_cleanup=yes
353 # Configure with --prefix the way we want it on the target...
354 # There are a whole lot of settings here. You'll probably want
355 # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
356 # Compare these options with the ones used when installing the glibc headers above - they're different.
357 # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
358 # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
359 # Set BUILD_CC, or you won't be able to build datafiles
360 # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
362 # OK. I'm fed up with those folks telling me what I should do.
363 # I don't configure nptl? Well, maybe that's purposedly because
364 # I don't want nptl! --disable-sanity-checks will shut up those
365 # silly messages. GNU folks again, he?
367 BUILD_CC=${CT_CC_NATIVE} \
368 CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O" \
369 CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
371 RANLIB=${CT_TARGET}-ranlib \
372 "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure" \
374 --build=${CT_UNIQ_BUILD} \
375 --host=${CT_TARGET} \
380 --disable-sanity-checks \
381 --cache-file=config.cache \
382 --with-headers="${CT_HEADERS_DIR}" \
384 ${CT_LIBC_GLIBC_EXTRA_CONFIG} 2>&1 |CT_DoLog ALL
386 if grep -l '^install-lib-all:' "${CT_SRC_DIR}/${CT_LIBC_FILE}/Makerules" > /dev/null; then
388 # If the install-lib-all target (which is added by our make-install-lib-all.patch)
389 # is present, it means we're building glibc-2.3.3 or later, and we can't
390 # build programs yet, as they require libeh, which won't be installed
391 # until full build of gcc
392 GLIBC_INITIAL_BUILD_RULE=lib
393 GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
394 GLIBC_INSTALL_APPS_LATER=yes
397 # We can build and install everything with the bootstrap compiler.
398 GLIBC_INITIAL_BUILD_RULE=all
399 GLIBC_INITIAL_INSTALL_RULE=install
400 GLIBC_INSTALL_APPS_LATER=no
403 # If this fails with an error like this:
404 # ... linux/autoconf.h: No such file or directory
405 # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
406 # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
407 # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
408 # No need for PARALLELMFLAGS here, Makefile already reads this environment variable
409 CT_DoLog EXTRA "Building C library"
410 make LD=${CT_TARGET}-ld \
411 RANLIB=${CT_TARGET}-ranlib \
412 ${GLIBC_INITIAL_BUILD_RULE} 2>&1 |CT_DoLog ALL
414 CT_DoLog EXTRA "Installing C library"
415 make install_root="${CT_SYSROOT_DIR}" \
416 ${LIBC_SYSROOT_ARG} \
417 ${GLIBC_INITIAL_INSTALL_RULE} 2>&1 |CT_DoLog ALL
419 # This doesn't seem to work when building a crosscompiler,
420 # as it tries to execute localedef using the just-built ld.so!?
421 #CT_DoLog EXTRA "Installing locales"
422 #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog ALL
424 # Fix problems in linker scripts.
426 # 1. Remove absolute paths
427 # Any file in a list of known suspects that isn't a symlink is assumed to be a linker script.
428 # FIXME: test -h is not portable
429 # FIXME: probably need to check more files than just these three...
430 # Need to use sed instead of just assuming we know what's in libc.so because otherwise alpha breaks
432 # 2. Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
433 # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
435 # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
436 CT_DoLog EXTRA "Fixing C library linker scripts"
437 for file in libc.so libpthread.so libgcc_s.so; do
438 for dir in lib lib64 usr/lib usr/lib64; do
439 if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
440 cp "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
441 CT_DoLog DEBUG "Fixing \"${CT_SYS_ROOT_DIR}/${dir}/${file}\""
442 sed -i -r -e 's,/usr/lib/,,g;
446 /BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}"
454 # This function finishes the glibc install
456 # Finally, build and install glibc programs, now that libeh (if any) is installed
457 # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
458 # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
459 # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
460 [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
462 CT_DoStep INFO "Finishing C library"
464 cd "${CT_BUILD_DIR}/build-libc"
466 CT_DoLog EXTRA "Re-building C library"
467 make LD=${CT_TARGET}-ld RANLIB=${CT_TARGET}-ranlib 2>&1 |CT_DoLog ALL
469 CT_DoLog EXTRA "Installing missing C library components"
470 # note: should do full install and then fix linker scripts, but this is faster
471 for t in bin rootsbin sbin data others; do
472 make install_root="${CT_SYSROOT_DIR}" \
473 ${LIBC_SYSROOT_ARG} \
474 install-${t} 2>&1 |CT_DoLog ALL
480 # Build up the addons list, separated with $1
481 do_libc_add_ons_list() {
483 local addons_list=`echo "${CT_LIBC_ADDONS_LIST//,/${sep}}" |tr -s ,`
484 case "${CT_THREADS}" in
486 *) addons_list="${addons_list}${sep}${CT_THREADS}";;
488 [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
489 addons_list="${addons_list%%${sep}}"
490 echo "${addons_list##${sep}}"