libada: Remove racy duplicate gnatlib installation

Programming / Compilers / GCC - macro [138bc75d-0d04-0410-961f-82ee72b054a4] - 1 October 2019 18:38 EDT

For some reason, presumably historical, the `install-gnatlib' target for the default multilib is invoked twice, once via the `ada.install-common' target in `gcc/ada/gcc-interface/' invoked from gcc/ and again via the `install-libada' target in libada/.

Apart from doing the same twice this is actually harmful in sufficiently parallelized `make' invocation, as the removal of old files performed within the `install-gnatlib' recipe in the former case actually races with the installation of new files done in the latter case, causing the recipe to fail and abort, however non-fatally, having not completed the installation of all the built files needed for the newly-built compiler to work correctly.

This can be observed with a native `x86_64-linux-gnu' bootstrap:

make[4]: Entering directory '.../gcc/ada' rm -rf .../lib/gcc/x86_64-linux-gnu/10.0.0/adalib rm: cannot remove '.../lib/gcc/x86_64-linux-gnu/10.0.0/adalib': Directory not empty make[4]: *** [gcc-interface/Makefile:512: install-gnatlib] Error 1 make[4]: Leaving directory '.../gcc/ada' make[3]: *** [.../gcc/ada/gcc-interface/ install-gnatlib] Error 2 make[2]: [.../gcc/ada/gcc-interface/ ada.install-common] Error 2 (ignored)

which then causes missing files to be reported when an attempt is made to use the newly-installed non-functional compiler to build a `riscv-linux-gnu' cross-compiler:

(cd ada/bldtools/sinfo; gnatmake -q xsinfo ; ./xsinfo sinfo.h ) error: "ada.ali" not found, "" must be compiled error: "s-memory.ali" not found, "s-memory.adb" must be compiled gnatmake: *** bind failed. /bin/sh: ./xsinfo: No such file or directory make[2]: *** [.../gcc/ada/ ada/sinfo.h] Error 127 make[2]: Leaving directory '.../gcc' make[1]: *** [Makefile:4369: all-gcc] Error 2 make[1]: Leaving directory '...' make: *** [Makefile:965: all] Error 2

Depending on timing `.../lib/gcc/x86_64-linux-gnu/10.0.0/adainclude' may cause an installation failure instead and the resulting compiler may be non-functional in a different way.

Only invoke `install-gnatlib' from within gcc/ then if a legacy build process is being used with libada disabled and gnatlib built manually with `make -C gcc gnatlib'.

- (gnat_install_lib): New variable.
- Substitute it.
- configure: Regenerate.

- gcc-interface/ (ada.install-common): Split into... (gnat-install-tools, gnat-install-lib): ... these.

ac4a0fc03bc libada: Remove racy duplicate gnatlib installation
gcc/ChangeLog | 6 ++++++
gcc/ | 4 ++++
gcc/ada/ChangeLog | 5 +++++
gcc/ada/gcc-interface/ | 5 ++++-
gcc/configure | 15 +++++++++++++--
gcc/ | 10 ++++++++++
6 files changed, 42 insertions(+), 3 deletions(-)


  • Share