Message ID | alpine.DEB.2.21.2406180156250.43454@angie.orcam.me.uk |
---|---|
State | New |
Headers | show |
Series | ada: Make the names of uninstalled cross-gnattools consistent across builds | expand |
On Tue, 18 Jun 2024, Maciej W. Rozycki wrote: > Fix the problem by moving the renaming of gnattools to a separate 'make' > recipe, pasted into a new 'gnattools-cross-mv' target and the existing > legacy 'cross-gnattools' target. Then invoke the new target explicitly > from the 'gnattools-cross' recipe in gnattools/. Ping for: <https://gcc.gnu.org/pipermail/gcc-patches/2024-June/654966.html>, <https://patchwork.sourceware.org/project/gcc/patch/alpine.DEB.2.21.2406180156250.43454@angie.orcam.me.uk/>. Maciej
The change is OK, thanks. > We suffer from an inconsistency in the names of uninstalled gnattools > executables in cross-compiler configurations. The cause is a recipe we > have: > > ada.all.cross: > for tool in $(ADA_TOOLS) ; do \ > if [ -f $$tool$(exeext) ] ; \ > then \ > $(MV) $$tool$(exeext) $$tool-cross$(exeext); \ > fi; \ > done > > the intent of which is to give the names of gnattools executables the > '-cross' suffix, consistently with the compiler drivers: 'gcc-cross', > 'g++-cross', etc. > > A problem with the recipe is that this 'make' target is called too early > in the build process, before gnattools have been made. Consequently no > renames happen and owing to that they are conditional on the presence of > the individual executables the recipe succeeds doing nothing. > > However if a target is requested later on such as 'make pdf' that does > not cause gnattools executables to be rebuilt, then 'ada.all.cross' does > succeed in renaming the executables already present in the build tree. > Then if the 'gnat' testsuite is run later on which expects non-suffixed > 'gnatmake' executable, it does not find the 'gnatmake-cross' executable > in the build tree and may either catastrophically fail or incorrectly > use a system-installed copy of 'gnatmake'. > > Of course if a target is requested such as `make all' that does cause > gnattools executables to be rebuilt, then both suffixed and non-suffixed > uninstalled executables result. > > Fix the problem by moving the renaming of gnattools to a separate 'make' > recipe, pasted into a new 'gnattools-cross-mv' target and the existing > legacy 'cross-gnattools' target. Then invoke the new target explicitly > from the 'gnattools-cross' recipe in gnattools/. > > Update the test harness accordingly, so that suffixed gnattools are used > in cross-compilation testsuite runs. > > gcc/ > * ada/gcc-interface/Make-lang.in (ada.all.cross): Move recipe > to... > (GNATTOOLS_CROSS_MV): ... this new variable. > (cross-gnattools): Paste it here. > (gnattools-cross-mv): New target. > > gnattools/ > * Makefile.in (gnattools-cross): Also build 'gnattools-cross-mv' > in GCC_DIR. > > gcc/testsuite/ > * lib/gnat.exp (local_find_gnatmake, find_gnatclean): Use > '-cross' suffix where testing a cross-compiler. > --- > gcc/ada/gcc-interface/Make-lang.in | 19 ++++++++++++------- > gcc/testsuite/lib/gnat.exp | 22 ++++++++++++++++++---- > gnattools/Makefile.in | 1 + > 3 files changed, 31 insertions(+), 11 deletions(-) > > gcc-ada-all-cross-gnattools.diff > Index: gcc/gcc/ada/gcc-interface/Make-lang.in > =================================================================== > --- gcc.orig/gcc/ada/gcc-interface/Make-lang.in > +++ gcc/gcc/ada/gcc-interface/Make-lang.in > @@ -780,6 +780,7 @@ gnattools: $(GCC_PARTS) $(CONFIG_H) pref > cross-gnattools: force > $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools1-re > $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools2 > + $(GNATTOOLS_CROSS_MV) > > canadian-gnattools: force > $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools1-re > @@ -795,19 +796,23 @@ gnatlib gnatlib-sjlj gnatlib-zcx gnatlib > FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ > $@ > > +gnattools-cross-mv: > + $(GNATTOOLS_CROSS_MV) > + > +GNATTOOLS_CROSS_MV=\ > + for tool in $(ADA_TOOLS) ; do \ > + if [ -f $$tool$(exeext) ] ; \ > + then \ > + $(MV) $$tool$(exeext) $$tool-cross$(exeext); \ > + fi; \ > + done > + > # use only for native compiler > gnatlib_and_tools: gnatlib gnattools > > # Build hooks: > > ada.all.cross: > - for tool in $(ADA_TOOLS) ; do \ > - if [ -f $$tool$(exeext) ] ; \ > - then \ > - $(MV) $$tool$(exeext) $$tool-cross$(exeext); \ > - fi; \ > - done > - > ada.start.encap: > ada.rest.encap: > ada.man: > Index: gcc/gcc/testsuite/lib/gnat.exp > =================================================================== > --- gcc.orig/gcc/testsuite/lib/gnat.exp > +++ gcc/gcc/testsuite/lib/gnat.exp > @@ -199,12 +199,19 @@ proc prune_gnat_output { text } { > # which prevent multilib from working, so define a new one. > > proc local_find_gnatmake {} { > + global target_triplet > global tool_root_dir > + global host_triplet > > if ![is_remote host] { > - set file [lookfor_file $tool_root_dir gnatmake] > + if { "$host_triplet" == "$target_triplet" } { > + set gnatmake gnatmake > + } else { > + set gnatmake gnatmake-cross > + } > + set file [lookfor_file $tool_root_dir $gnatmake] > if { $file == "" } { > - set file [lookfor_file $tool_root_dir gcc/gnatmake] > + set file [lookfor_file $tool_root_dir gcc/$gnatmake] > } > if { $file != "" } { > set root [file dirname $file] > @@ -225,12 +232,19 @@ proc local_find_gnatmake {} { > } > > proc find_gnatclean {} { > + global target_triplet > global tool_root_dir > + global host_triplet > > if ![is_remote host] { > - set file [lookfor_file $tool_root_dir gnatclean] > + if { "$host_triplet" == "$target_triplet" } { > + set gnatclean gnatclean > + } else { > + set gnatclean gnatclean-cross > + } > + set file [lookfor_file $tool_root_dir $gnatclean] > if { $file == "" } { > - set file [lookfor_file $tool_root_dir gcc/gnatclean] > + set file [lookfor_file $tool_root_dir gcc/$gnatclean] > } > if { $file != "" } { > set gnatclean $file; > Index: gcc/gnattools/Makefile.in > =================================================================== > --- gcc.orig/gnattools/Makefile.in > +++ gcc/gnattools/Makefile.in > @@ -223,6 +223,7 @@ gnattools-cross: $(GCC_DIR)/stamp-tools > # gnattools2 > $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ > $(TOOLS_FLAGS_TO_PASS_CROSS) common-tools > + $(MAKE) -C $(GCC_DIR) gnattools-cross-mv > > # Other > # -----
On Thu, 4 Jul 2024, Arnaud Charlet wrote:
> The change is OK, thanks.
I have committed it now, thank you for your review.
Maciej
Index: gcc/gcc/ada/gcc-interface/Make-lang.in =================================================================== --- gcc.orig/gcc/ada/gcc-interface/Make-lang.in +++ gcc/gcc/ada/gcc-interface/Make-lang.in @@ -780,6 +780,7 @@ gnattools: $(GCC_PARTS) $(CONFIG_H) pref cross-gnattools: force $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools1-re $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools2 + $(GNATTOOLS_CROSS_MV) canadian-gnattools: force $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools1-re @@ -795,19 +796,23 @@ gnatlib gnatlib-sjlj gnatlib-zcx gnatlib FORCE_DEBUG_ADAFLAGS="$(FORCE_DEBUG_ADAFLAGS)" \ $@ +gnattools-cross-mv: + $(GNATTOOLS_CROSS_MV) + +GNATTOOLS_CROSS_MV=\ + for tool in $(ADA_TOOLS) ; do \ + if [ -f $$tool$(exeext) ] ; \ + then \ + $(MV) $$tool$(exeext) $$tool-cross$(exeext); \ + fi; \ + done + # use only for native compiler gnatlib_and_tools: gnatlib gnattools # Build hooks: ada.all.cross: - for tool in $(ADA_TOOLS) ; do \ - if [ -f $$tool$(exeext) ] ; \ - then \ - $(MV) $$tool$(exeext) $$tool-cross$(exeext); \ - fi; \ - done - ada.start.encap: ada.rest.encap: ada.man: Index: gcc/gcc/testsuite/lib/gnat.exp =================================================================== --- gcc.orig/gcc/testsuite/lib/gnat.exp +++ gcc/gcc/testsuite/lib/gnat.exp @@ -199,12 +199,19 @@ proc prune_gnat_output { text } { # which prevent multilib from working, so define a new one. proc local_find_gnatmake {} { + global target_triplet global tool_root_dir + global host_triplet if ![is_remote host] { - set file [lookfor_file $tool_root_dir gnatmake] + if { "$host_triplet" == "$target_triplet" } { + set gnatmake gnatmake + } else { + set gnatmake gnatmake-cross + } + set file [lookfor_file $tool_root_dir $gnatmake] if { $file == "" } { - set file [lookfor_file $tool_root_dir gcc/gnatmake] + set file [lookfor_file $tool_root_dir gcc/$gnatmake] } if { $file != "" } { set root [file dirname $file] @@ -225,12 +232,19 @@ proc local_find_gnatmake {} { } proc find_gnatclean {} { + global target_triplet global tool_root_dir + global host_triplet if ![is_remote host] { - set file [lookfor_file $tool_root_dir gnatclean] + if { "$host_triplet" == "$target_triplet" } { + set gnatclean gnatclean + } else { + set gnatclean gnatclean-cross + } + set file [lookfor_file $tool_root_dir $gnatclean] if { $file == "" } { - set file [lookfor_file $tool_root_dir gcc/gnatclean] + set file [lookfor_file $tool_root_dir gcc/$gnatclean] } if { $file != "" } { set gnatclean $file; Index: gcc/gnattools/Makefile.in =================================================================== --- gcc.orig/gnattools/Makefile.in +++ gcc/gnattools/Makefile.in @@ -223,6 +223,7 @@ gnattools-cross: $(GCC_DIR)/stamp-tools # gnattools2 $(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \ $(TOOLS_FLAGS_TO_PASS_CROSS) common-tools + $(MAKE) -C $(GCC_DIR) gnattools-cross-mv # Other # -----