summary refs log tree commit diff
path: root/scripts/build-many-glibcs.py
Commit message (Collapse)AuthorAgeFilesLines
* Fix armv7-a compiler option nameAdhemerval Zanella2017-10-171-2/+2
| | | | | This patch fixes the wrong -march name option used to define the ARMv7-A glibc variant pushed on commit 3d26560.
* Add build-many-glibcs.py arm-linux-gnueabihf-v7{-disable-multiarch}Adhemerval Zanella2017-10-171-1/+6
| | | | | | | | | | | | | | | This patch adds two extra configuration for arm-linux-gnueabihf to cover for multiarch support: 1. arm-linux-gnueabihf-v7a: enables multiarch support by using -march=armv7a. 2. Same as 1. but with --disable-multiarch. Check with build-many-glibcs.py for both options. * scripts/build-many-glibcs.py (Context.add_all_configs): Add arm-linux-gnueabihf multiarch extra_glibcs.
* Remove add-ons mechanism.Joseph Myers2017-10-051-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | glibc has an add-ons mechanism to allow additional software to be integrated into the glibc build. Such add-ons may be within the glibc source tree, or outside it at a path passed to the --enable-add-ons configure option. localedata and crypt were once add-ons, distributed in separate release tarballs, but long since stopped using that mechanism. Linuxthreads was always an add-on. Ports spent some time as an add-on with separate release tarballs, then was first moved into the glibc source tree, then had its sysdeps files moved into the main sysdeps hierarchy so the add-ons mechanism was no longer used. NPTL spent some time as an add-on in the main glibc tree before stopping using the add-on mechanism. libidn used to have separate release tarballs but no longer does so, but still uses the add-ons mechanism within the glibc source tree. Various other software has supported building with the add-ons mechanism at times in the past, but I don't think any is still widely used. Add-ons involve significant, little-used complexity in the glibc build system, and make it hard to understand what the space of possible glibc configurations is. This patch removes the add-ons mechanism. libidn is now built via the Subdirs mechanism to cause any configuration using sysdeps/unix/inet to build libidn; HAVE_LIBIDN (which effectively means shared libraries are available) is now defined via sysdeps/unix/inet/configure. Various references to add-ons around the source tree are removed (in the case of maint.texi, the example list of sysdeps directories is still very out of date). Externally maintained ports should now put their files in the normal sysdeps directory structure rather than being arranged as add-ons; they probably need to change e.g. elf.h anyway, rather than actually being able to work just as a drop-in subtree. Hurd libpthread should be arranged similarly to NPTL, so some files might go in a hurd-pthreads (or similar) top-level directory in glibc, while sysdeps files should go in the normal sysdeps directory structure (possibly in hurd or hurd-pthreads subdirectories, just as there are nptl subdirectories in the sysdeps tree). Tested for x86_64, and with build-many-glibcs.py. * configure.ac (--enable-add-ons): Remove option. (machine): Do not mention add-ons in comment. (LIBC_PRECONFIGURE): Likewise. (add_ons): Remove variable and sanity checks and logic to locate add-ons. (add_ons_automatic): Remove variable. (configured_add_ons): Likewise. (add_ons_sfx): Likewise. (add_ons_pfx): Likewise. (add_on_subdirs): Likewise. (sysnames_add_ons): Likewise. Remove loop over add-ons and consideration of add-ons in Implies handling. (sysdeps_add_ons): Likewise. * configure: Regenerated. * libidn/configure.ac: Remove. * libidn/configure: Likewise. * sysdeps/unix/inet/configure.ac: New file. * sysdeps/unix/inet/configure: New generated file. * sysdeps/unix/inet/Subdirs: Add libidn. * Makeconfig (sysdeps-srcdirs): Remove variable. (+sysdep_dirs): Do not include $(sysdeps-srcdirs). ($(common-objpfx)config.status): Do not depend on add-on files. ($(common-objpfx)shlib-versions.v.i): Do not mention add-ons in comment. (all-subdirs): Do not include $(add-on-subdirs). * Makefile (dist-prepare): Do not use $(sysdeps-add-ons). * config.make.in (add-ons): Remove variable. (add-on-subdirs): Likewise. (sysdeps-add-ons): Likewise. * manual/Makefile (add-chapters): Remove. ($(objpfx)texis): Do not depend on $(add-chapters). (nonexamples): Do not handle $(add-chapters). (examples): Do not handle $(add-ons). (chapters.% top-menu.%): Do not pass '$(add-chapters)' to libc-texinfo.sh. * manual/install.texi (Installation): Do not mention add-ons. (--enable-add-ons): Do not document configure option. * INSTALL: Regenerated. * manual/libc-texinfo.sh: Do not handle $2 add-ons argument. * manual/maint.texi (Hierarchy Conventions): Do not mention add-ons. * scripts/build-many-glibcs.py (Glibc.build_glibc): Do not use --enable-add-ons. * scripts/gen-sorted.awk: Do not handle Subdirs files from add-ons. * scripts/test-installation.pl: Do not handle glibc-compat add-on. * sysdeps/nptl/Makeconfig: Do not mention add-ons in comment.
* Use MPFR 3.1.6 in build-many-glibcs.py.Joseph Myers2017-09-071-1/+1
| | | | | * scripts/build-many-glibcs.py (Context.checkout): Default MPFR version to 3.1.6.
* Use Linux 4.13 in build-many-glibcs.py.Joseph Myers2017-09-041-1/+1
| | | | | * scripts/build-many-glibcs.py (Context.checkout): Default Linux kernel version to 4.13.
* build-many-glibcs.py: also build profiled objectsAndreas Schwab2017-07-081-0/+1
|
* Update versions in build-many-glibcs.py.Joseph Myers2017-07-041-3/+3
| | | | | | | | | This patch updates build-many-glibcs.py to use the current release branch of binutils and current releases of GMP and the Linux kernel. * scripts/build-many-glibcs.py (Context.checkout): Default binutils version to 2.29 branch, GMP version to 6.1.2 and Linux kernel version to 4.12.
* Default Linux kernel version in build-many-glibcs.py to 4.11.Joseph Myers2017-05-011-1/+1
| | | | | * scripts/build-many-glibcs.py (Context.checkout): Default Linux kernel version to 4.11.
* Default build-many-glibcs.py to GCC 7 branch.Joseph Myers2017-04-261-1/+1
| | | | | | | | | | | | | Now there is a GCC 7 release branch, this patch makes build-many-glibcs.py default to using it instead of GCC 6. Relative to GCC 6, this fixes the MicroBlaze build but introduces ICEs building glibc testcases for SH (GCC PRs 78459, 78460; the latter is an out-of-memory issue so you may want to set memory limits when running build-many-glibcs.py). * scripts/build-many-glibcs.py (Context.checkout): Default gcc version to 7 branch.
* build-many-glibcs: Remove no_isolate from SH configAdhemerval Zanella2017-03-131-19/+6
| | | | | | | | | | | | | Now with d40dbe7 SH build does not require more the no_isolate gcc options to correct build glibc (since SH build now does not generate a trap anymore). This patch removes the unrequired options from SH config. Checked with a build for sh3-linux-gnu, sh3eb-linux-gnu, sh4-linux-gnu, and sh4eb-linux-gnu. * scripts/build-many-glibcs.py (Context.add_all_configs): Remove no_isolate usage for SH.
* Use Linux 4.10 in build-many-glibcs.py.Joseph Myers2017-02-221-1/+1
| | | | | * scripts/build-many-glibcs.py (Context.checkout): Default Linux kernel version to 4.10.
* build-many-glibcs: don't crash if email is not configuredZack Weinberg2017-02-161-0/+10
| | | | | | | | | | | The 'bot-cycle' action for build-many-glibcs is a convenient way to not have to remember all the steps in keeping a many-glibcs tree up to date ... or it would be, if the script could send mail _optionally_. Make it so by skipping the mail step if mail isn't configured. * scripts/build-many-glibcs.py (bot_build_mail): If the bot_config does not contain all of the necessary email- related settings, just print a warning and continue.
* Avoid parallel GCC install in build-many-glibcs.py.Joseph Myers2017-01-181-1/+11
| | | | | | | | | | | | | | | | | | A recent build-many-glibcs.py build <https://sourceware.org/ml/libc-testresults/2017-q1/msg00067.html> ran into what proves to be an old known bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42980> with parallel install of GCC (one which as discussed there might require automake changes to fix). This patch makes build-many-glibcs.py avoid such intermittent failures from parallel install by using -j1 for GCC make install (the code in question also applies to binutils make install, but it doesn't seem worth trying to avoid -j1 there; the builds and installs of different toolchains are still fully parallel with each other, this is only about the case when there are few enough of those that multiple jobs can get used within a single make install). * scripts/build-many-glibcs.py (Config.build_cross_tool): Use -j1 for make install.
* Make build-many-glibcs.py work on python3.2Szabolcs Nagy2017-01-111-0/+37
| | | | | | | | | | | | | | | | | I used this patch to run the new build script with python3.2, it may be worth adding this hack if python3.5 is not widespread (might work with older python, i haven't tested that). This patch make build-many-glibcs.py work with python 3.2 by adding fallback implementation to python 3.5 facilities if they are not present. Checked building a x86_64-linux-gnu toolchain with python 3.2. 2016-11-22 Szabolcs Nagy <szabolcs.nagy@arm.com> * scripts/build-many-glibcs.py (os.cpu_count): Add compatibility definition. (re.fullmatch, subprocess.run): Likewise.
* Add build-many-glibcs.py powerpc-linux-gnu-power4 build.Joseph Myers2017-01-021-1/+4
| | | | | | | | | | | | The 32-bit powerpc configurations in build-many-glibcs.py were failing to cover the powerpc32 multiarch code at all, because that code is only built for power4 and above configurations. This patch adds a 32-bit power4 configuration so that at least some of that multiarch code gets build-tested. (This is preparation for reviewing the w_* file renaming, which affects such powerpc32 multiarch files.) * scripts/build-many-glibcs.py (Context.add_all_configs): Add power4 glibc for powerpc-linux-gnu.
* Make build-many-glibcs.py use binutils 2.28 branch by default.Joseph Myers2017-01-021-1/+1
| | | | | | | | Now that a release branch exists for binutils 2.28, this patch makes build-many-glibcs.py use that by default in place of 2.27. * scripts/build-many-glibcs.py (Context.checkout): Default binutils version to 2.28 branch.
* Update copyright dates with scripts/update-copyrights.Joseph Myers2017-01-011-1/+1
|
* Make build-many-glibcs.py flush stdout before execv.Joseph Myers2016-12-161-0/+1
| | | | | | | | | | | | When build-many-glibcs.py re-execs itself with execv, any buffered output on stdout may be lost (in particular, messages intended to go to a bot's log about the re-exec taking place). This patch makes it flush stdout before execv, similar to the flush before running a subprocess from the bot that is done to ensure output appears in the right order. * scripts/build-many-glibcs.py (Context.exec_self): Flush stdout before calling execv.
* Use Linux 4.9 (headers) in build-many-glibcs.py.Joseph Myers2016-12-141-1/+1
| | | | | | | | | | | | This patch updates build-many-glibcs.py to use Linux 4.9 for kernel headers unless another version is explicitly specified. Note that when a version changes like this you'll need to use --replace-sources when updating an existing checkout to tell build-many-glibcs.py it's OK to delete and replace the sources of a component for which the version used has changed. * scripts/build-many-glibcs.py (Context.checkout): Default Linux kernel version to 4.9.
* Add build-many-glibcs.py option to strip installed shared libraries.Joseph Myers2016-12-071-2/+11
| | | | | | | | | | | | | | | | | | | | | | | | | This patch adds a --strip option to build-many-glibcs.py, to make it strip the installed shared libraries after installation. This is for convenience if you want to compare installed stripped shared libraries before and after a patch that was not meant to result in any code changes: you can run with this option, copy the install/glibcs directory, run again with the patch and compare the */lib* subdirectory contents. (It might make sense for the option to strip libraries in other directories, including stripping debug information from static libraries, with a view to making it possible for a no-generated-code-changes patch to result in completely identical install/glibcs directories, so simplifying comparison, though that may need other build determinism changes, e.g. to build deterministic .a files.) * scripts/build-many-glibcs.py (Context.__init__): Take strip argument. (Glibc.build_glibc): Strip installed shared libraries if requested. (get_parser): Add --strip option. (main): Update Context call.
* Make build-many-glibcs.py support running as a bot.Joseph Myers2016-12-011-11/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch makes build-many-glibcs.py support a "bot" action, for repeatedly running a checkout and build cycle. Two new configuration variables are used in bot-config.json. "delay" indicates the time to sleep after each bot-cycle round (regardless of whether that round actually ran any builds); "run" is a boolean, which is false if the bot should just exit (the point of this is that you can edit bot-config.json to set this to false to cause a running bot to exit cleanly between builds) and true if the bot should run. The bot does not exit if the bot-cycle process exits with error status (that can occur when sourceware's load limiting means anonymous version control access fails, for example), just sleeps until it's time to try again. The script is changed to flush stdout before running a subprocess in bot-cycle, so that when output is redirected (as expected for a bot) the status messages from bot-cycle appear in their proper position in its redirected output relative to the output from the subprocesses run, and to copy the logs directory before running builds in bot-cycle so that the logs from at least one complete build are always available for looking at how something failed, even while the next build is running. * scripts/build-many-glibcs.py: Add bot to usage message. Import time module. (Context.__init__): Initialize self.logsdir_old. (Context.run_builds): Handle bot action. (Context.bot_cycle): Copy logs directory before running builds. (Context.bot_run_self): Take argument for whether to check subprocess result. Flush stdout before running subprocess. (Context.bot): New function. (get_parser): Allow bot action.
* Add build-many-glibcs.py bot-cycle action.Joseph Myers2016-11-301-9/+161
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch continues the process of setting up build-many-glibcs.py to run as a bot monitoring for and reporting on build issues by adding a bot-cycle action to the script. When this action is used, it will run the checkout action (re-execing itself if it was changed by that action), then rebuild whichever of host-libraries, compilers, glibcs should be rebuilt based on changed versions, time elapsed and state of previous builds. Email is sent with the results of the build (for each build action done). The rebuild logic is: if previous build time or versions aren't recorded, rebuild that component. If the script has changed, rebuild everything. If any relevant component version has changed, rebuild, except for not rebuilding compilers if the time indicated in the bot configuration has not passed since the last build of the compilers. If one piece is rebuilt then rebuild subsequent pieces as well. Using bot-cycle requires a configuration file bot-config.json in the toplevel directory used by build-many-glibcs.py. It might contain e.g. { "compilers-rebuild-delay": 604800, "email-from": "Example Name <user@example.org>", "email-server": "localhost", "email-subject": "GCC 6 %(action)s %(build-time)s build results", "email-to": "libc-testresults@sourceware.org" } My next intended step is adding a further action "bot" which loops running bot-cycle then sleeping for an amount of time given in bot-config.json. Then I'll set up a bot using that action (building with GCC 6 branch; a bot using GCC mainline may wait until the SH out-of-memory issues <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78460> are fixed; I expect the bot to mail to me until it seems ready to switch to mailing to gcc-testresults). * scripts/build-many-glibcs.py: Add bot-cycle to usage message. Import email.mime.text, email.utils and smtplib modules. (Context.__init__): Initialize self.bot_config_json. (Context.run_builds): Handle bot-cycle action. (Context.load_bot_config_json): New function. (Context.part_build_old): Likewise. (Context.bot_cycle): Likewise. (Context.bot_build_mail): Likewise. (Context.bot_run_self): Likewise. (get_parser): Allow bot-cycle action.
* Make build-many-glibcs.py store more information about builds.Joseph Myers2016-11-261-4/+111
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch makes build-many-glibcs.py store information about builds in JSON format. This is part of preparing it for use in a bot checking for regressions. The information stored is: time of last build (of host-libraries, compilers or glibcs); versions of components used in the last build (for compilers, host library versions are properly copied from those used for the previous host-libraries build, and for glibcs, component versions other than that of glibc are similarly copied from the last compilers build); PASS/FAIL/UNRESOLVED results of the individual build steps; a list of changed results; a list of tests (that are still run at all) that have ever been recorded to PASS. The first pieces of information are intended to be used by a bot to decide whether a rebuild is appropriate (based on some combination of elapsed time and changes to versions; a bot might want to rebuild glibcs if there had been any change but only rebuild compilers after enough time had elapsed, for example). All the information is intended to be used in generating mails with results information. This state is specifically for full builds (no individual configs for building compilers or glibcs specified). If individual configs are specified, build-time and build-versions information is cleared (since it will no longer accurately reflect the install directory contents), while the other information is left unchanged. This reflects the motivation of providing information for a bot checking for regressions; the contents of build-state.json in a tree used for manual builds that may be only for some configurations are not particularly important. * scripts/build-many-glibcs.py: Import datetime module. (Context.__init__): Load JSON build state. Initialize list of status logs. (Context.run_builds): Update saved build state. (Context.add_makefile_cmdlist): Update list of status logs. (Context.load_build_state_json): New function. (Context.store_build_state_json): Likewise. (Context.clear_last_build_state): Likewise. (Context.update_build_state): Likewise. (CommandList.status_logs): Likewise.
* Make build-many-glibcs.py re-exec itself if changed by checkout.Joseph Myers2016-11-251-0/+14
| | | | | | | | | | | | | | | | | | | Updating build-many-glibcs.py may result in changes to the default versions of components, or to the set of components (if e.g. Hurd support is added and that requires a new component). It's desirable for the checkout process to leave a source tree that is ready to use. If the checkout updated the script itself, that means it needs to be rerun to cause any new versions or components referenced by the new script version to be properly checked out. This patch makes the script check if it was modified by the checkout process, and re-exec itself (with the same arguments) if so. * scripts/build-many-glibcs.py (Context.__init__): Save text of script being executed. (Context.get_script_text): New function. (Context.exec_self): Likewise. (Context.checkout): Re-exec script if changed by checkout process.
* Make build-many-glibcs.py track component versions requested and used.Joseph Myers2016-11-241-10/+73
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch makes build-many-glibcs.py record the component versions checked out, and whether those versions were explicitly requested or defaults, in a file versions.json in the source directory. The preferred version of a component is the first of: one explicitly specified on the command line; one explicitly specified on the command line in a previous run of build-many-glibcs.py; a default version for that component. Thus, once you've run build-many-glibcs.py checkout once with the updated script (making sure to specify the right versions of any components previously checked out with a non-default version), in future you can just run it without version specifiers and it will know when a default-version component has changed its default version and so should be checked out again. Because you might have local changes and not want a default-version component checkout replaced, you need to pass the --replace-sources option to allow the script to delete and replace a component source directory automatically; otherwise, it will give an error if a version has changed. The script does not try to change branches of git or SVN checkouts without checking out from scratch; if the version number requested has changed and --replace-sources is used, the relevant source directory will be removed completely and a new one checked out from scratch. Apart from allowing automatic updates of components with default versions, this also facilitates bots reporting on the versions used in a given build. versions.json contains not just information on the version number and whether that was requested explicitly, but also git or SVN revision information intended to be used in email reports from bots. * scripts/build-many-glibcs.py: Import json module. (Context.__init__): Take replace_sources argument. Load versions.json. (Context.load_versions_json): New function. (Context.store_json): Likewise. (Context.store_versions_json): Likewise. (Context.set_component_version): Likewise. (Context.checkout): Update versions.json. Check for and handle changes of version. Prefer previously explicitly specified version to default version. (Context.checkout_vcs): Return a revision identifier. (Context.git_checkout): Likewise. (Context.gcc_checkout): Likewise. (get_parser): Add --replace-sources option. (main): Pass replace_sources argument to Context call.
* build-many-glibcs: Revert -fno-isolate-erroneous-paths options for tileproChris Metcalf2016-11-231-2/+1
| | | | TILEPro now has a __builtin_trap instruction in gcc tip and gcc 6.
* Make build-many-glibcs.py use -fno-isolate-erroneous-paths options for tilepro.Joseph Myers2016-11-221-5/+7
| | | | | | | | | | | | | | | | | | My most recent build-many-glibcs.py build with GCC mainline showed build failures for tilepro with the symptoms (multiple definitions of symbols building ld.so, see the build log referenced in the GCC bug referenced in the comment for an example) that correspond to the isolate-erroneous-paths optimization not being suitable for building glibc unless the GCC port provides a trap pattern (so __builtin_trap expands to an inline instruction rather than a call to abort). Since tilepro indeed lacks such as pattern in GCC, this patch duly arranges for this optimization to be disabled when building for tilepro, as it is for sh. Tested (compilation only) for tilepro. * scripts/build-many-glibcs.py (Context.add_all_configs): Also use -fno-isolate-erroneous-paths options for tilepro.
* Quote shell commands in logs from build-many-glibcs.py.Joseph Myers2016-11-181-1/+11
| | | | | | | | | | | | | | As requested in <https://sourceware.org/ml/libc-alpha/2016-11/msg00664.html>, this patch makes the commands recorded in build-many-glibcs.py quote words so they can be cut-and-pasted back into a shell. (Note that these logs are generated by the wrapper script generated to run commands with logs, hence the needs for quoting logic to be implemented in that shell script.) * scripts/build-many-glibcs.py (Context.write_files): Make wrapper script quote words in command output to log suitably for input to the shell.
* Actually use newly built host libraries in build-many-glibcs.py.Joseph Myers2016-11-171-0/+4
| | | | | | | | This patch adds the missing GCC configure options required to make use of the newly built host libraries in build-many-glibcs.py. * scripts/build-many-glibcs.py (Config.build_gcc): Configure with newly built gmp, mpfr and mpc.
* Fix build-many-glibcs.py style issues.Joseph Myers2016-11-141-17/+10
| | | | | | | | | | | * scripts/build-many-glibcs.py (os.path): Do not import. (Context): Inherit explicitly from object. Remove blank line between class and docstring. (Config): Likewise. (Glibc): Likewise. (Command): Likewise. (CommandList): Likewise. (Context.write_files): Store chmod mode in a variable.
* Add script to build many glibc configurations.Joseph Myers2016-11-111-0/+1142
This patch adds a Python (3.5 or later) script to build many different configurations of glibc, including building the required cross compilers first. It's not intended to change any patch testing requirements, although some people may wish to use it for high-risk patches such as adding warning options (and it can also be used to test building, including compiling tests, for an individual configuration, if e.g. you wish to do such a compilation test of a patch for an architecture it touches). The configurations include all the GNU/Linux ABI variants in <https://sourceware.org/glibc/wiki/ABIList> (although some do not yet build cleanly) and it would be desirable to cover enough other variants e.g. for CPUs using different sysdeps directories to test building each piece of code in glibc at least once. It would also be desirable to extend it to cover Hurd and NaCl, which might best be done by people familiar with those configurations. You call the script as build-many-glibcs.py /some/where thing-to-do <other-arguments> where /some/where is a working directory for the script. It will create and use subdirectories build, install, logs therein. You can use it with thing-to-do being "checkout" to create a subdirectory src therein, with subdirectories binutils, gcc, glibc, gmp, linux, mpc, mpfr with the sources of those components, or create those directories manually (all except glibc can be symlinks to sources elsewhere). In the checkout case, by default it checks out GCC 6 branch, binutils 2.27 branch, glibc mainline and releases of other components. You can specify <component>-<version> to choose a version to check out, where <version> is "vcs-mainline" or "vcs-<branch>" to check out from version control (only supported for gcc, binutils, glibc) and otherwise a release version number to download and use a tarball; components not specified on the command line have default versions checked out. If you rerun "checkout" (with the same version specifications) it will update checkouts from version control, but will not detect cases where the location something is expected to be checked out from has changed. Other than "checkout", thing-to-do is one of host-libraries, compilers, glibcs. So you run, in that order: build-many-glibcs.py /some/where host-libraries build-many-glibcs.py /some/where compilers build-many-glibcs.py /some/where glibcs host-libraries is run once and then those libraries are used for all the compilers. compilers can be run once and then used many times for testing different glibc versions (so a bot only needs to update glibc and rerun the glibcs task, if using stable GCC / binutils; if testing the latest versions of the whole toolchain together including mainline GCC, it would probably want to update everything and rerun both compilers and glibcs). You can also name particular variants after "compilers" or "glibcs" to build just those variants (the possible variants are hardcoded in the script). I may add support for allowing the set of configurations to depend on the GCC version (to get cleaner default results), and optionally looping over architecture-independent glibc variants of CFLAGS and configure options as well, for every glibc configuration listed (e.g. -Os). GCC versions before 4.9 are not expected to work (the code uses --with-glibc-version to get the bootstrap GCC appropriately configured). There are various problems for particular configurations as well. Command-line options to the script: -jN to run N jobs in parallel (default the number of CPU cores reported by the system); --keep=all or --keep=failed to control keeping around build directories (default --keep=none). * scripts/build-many-glibcs.py: New file.