Hi! As discussed earlier on IRC, --enable-link-mutex has a big problem that it decreases number of available jobs by the number of link commands waiting for the lock, so e.g. when doing make -j32 build with 11 different big programs linked with $(LLINKER) we end up with just 22 effective jobs, and with e.g. make -j8 with those 11 different big programs we actually most likely serialize everything during linking onto a single job.
The following patch is an attempt to handle it using Make dependencies instead, let configure create a chain, e.g. c++.prev: c.serial fortran.prev: c++.serial lto.prev: fortran.serial in Make-hooks, which says that cc1plus can be only linked after cc1 is linked, then f951, then lto1 and then lto-dump. One thing I don't like very much on this implementation is that it uses recursive make, something we apparently don't use in gcc/ right now. One reason for that is that I wanted to make the case when I do: make -j32 cc1plus by hand to avoid uselessly building cc1, gnat1 etc. (whatever is in the CONFIG_LANGUAGES before), i.e. only serialize if done from a bootstrap. But perhaps there could be a way out of that, by moving the --enable-link-serialization to toplevel configure and arrange for it to just pass some variable to the gcc make in that case. Then the Make-hooks could look like: ifeq (DO_LINK_SERIALIZATION,true) ada.prev: c.serial brig.prev: ada.serial c++.prev: brig.serial d.prev: c++.serial fortran.prev: d.serial go.prev: fortran.serial lto.prev: go.serial objc.prev: lto.serial obj-c++.prev: objc.serial else ada.prev: brig.prev: c++.prev: d.prev: fortran.prev: go.prev: lto.prev: objc.prev: obj-c++.prev: endif and then just add c++.prev dependency to cc1obj$(exeext) dependencies unconditionally. Thoughts on that? 2020-09-03 Jakub Jelinek <ja...@redhat.com> gcc/ * configure.ac: Add --enable-link-serialization support, add into Make-hooks rules on which language is previous in the list of all selected languages. * Makefile.in (LANGUAGES): Add *.serial instead of * if --enable-link-serialization is on. * configure: Regenerated. gcc/c/ * Make-lang.in (c.serial): Depend on c. (.PHONY): Add c.serial. gcc/cp/ * Make-lang.in (.PHONY): Add c++.serial c++.prev. (CC1PLUS_DEPS): New variable. (cc1plus$(exeext)): Use it. (c++.serial): New goal. gcc/ada/ * Make-lang.in (.PHONY): Add ada.serial ada.prev. (GNAT1_DEPS): New variable. (gnat1$(exeext)): Use it. (ada.serial): New goal. gcc/brig/ * Make-lang.in (.PHONY): Add brig.serial brig.prev. (BRIG1_DEPS): New variable. (brig1$(exeext)): Use it. (brig.serial): New goal. gcc/go/ * Make-lang.in (.PHONY): Add go.serial go.prev. (GO1_DEPS): New variable. (go1$(exeext)): Use it. (go.serial): New goal. gcc/jit/ * Make-lang.in (.PHONY): Add jit.serial jit.prev jit.extra. (jit.extra): New goal. (jit): Use it. (LIBGCCJIT_FILENAME_DEPS): New variable. ($(LIBGCCJIT_FILENAME)): Use it. (jit.serial): New goal. gcc/objc/ * Make-lang.in (.PHONY): Add objc.serial objc.prev. (CC1OBJ_DEPS): New variable. (cc1obj$(exeext)): Use it. (objc.serial): New goal. gcc/objcp/ * Make-lang.in (.PHONY): Add obj-c++.serial obj-c++.prev. (CC1OBJPLUS_DEPS): New variable. (cc1objplus$(exeext)): Use it. (obj-c++.serial): New goal. gcc/fortran/ * Make-lang.in (.PHONY): Add fortran.serial fortran.prev. (F951_DEPS): New variable. (f951$(exeext)): Use it. (fortran.serial): New goal. gcc/lto/ * Make-lang.in (.PHONY): Add lto lto.serial lto.prev. (lto): Depend on $(LTO_EXE) $(LTO_DUMP_EXE). (lto.all-cross, lto.start.encap): Don't depend on anything. (LTO_EXE_DEPS): New variable. ($(LTO_EXE)): Use it. (LTO_DUMP_EXE_DEPS): New variable. ($(LTO_DUMP_EXE)): Use it. (lto.serial): New goal. --- gcc/configure.ac.jj 2020-08-26 17:09:45.829254709 +0200 +++ gcc/configure.ac 2020-09-03 14:41:02.884746491 +0200 @@ -6380,6 +6380,24 @@ else fi AC_SUBST(DO_LINK_MUTEX) +dnl Another way of doing that, purely using make dependencies + +AC_MSG_CHECKING([whether to serialize linking of multiple front-ends]) + AC_ARG_ENABLE(link-serialization, +[AS_HELP_STRING([--enable-link-serialization], + [avoid linking multiple front-ends at once to avoid thrashing + on the build machine through make dependencies])], + do_link_serialization=$enableval, + do_link_serialization=no) +AC_MSG_RESULT($do_link_serialization) + +if test "$do_link_serialization" = "yes"; then + DO_LINK_SERIALIZATION=true +else + DO_LINK_SERIALIZATION=false +fi +AC_SUBST(DO_LINK_SERIALIZATION) + # -------------- # Language hooks # -------------- @@ -6540,6 +6558,14 @@ do echo "lang.$t: $x" >> Make-hooks done +prev=c +for lang in $all_selected_languages +do + test $lang = c && continue + echo "$lang.prev: $prev.serial" >> Make-hooks + prev=$lang +done + # -------- # Option include files # -------- --- gcc/Makefile.in.jj 2020-08-18 07:50:18.440924074 +0200 +++ gcc/Makefile.in 2020-09-03 13:53:10.041872344 +0200 @@ -137,7 +137,11 @@ SUBDIRS =@subdirs@ build # Selection of languages to be made. CONFIG_LANGUAGES = @all_selected_languages@ +ifeq (@DO_LINK_SERIALIZATION@,true) +LANGUAGES = $(addsuffix .serial,c $(CONFIG_LANGUAGES)) +else LANGUAGES = c $(CONFIG_LANGUAGES) +endif ifeq (@enable_gcov@,yes) LANGUAGES += gcov$(exeext) gcov-dump$(exeext) gcov-tool$(exeext) endif --- gcc/c/Make-lang.in.jj 2020-07-28 15:39:09.669760889 +0200 +++ gcc/c/Make-lang.in 2020-09-03 14:24:41.861122758 +0200 @@ -37,9 +37,10 @@ # # Define the names for selecting c in LANGUAGES. c: cc1$(exeext) +c.serial: c # Tell GNU make to ignore these if they exist. -.PHONY: c gcc +.PHONY: c gcc c.serial # The C front end driver. This is different from the drivers for other # front ends, because there is no C language specific driver (i.e. nothing --- gcc/cp/Make-lang.in.jj 2020-07-28 15:39:09.770759500 +0200 +++ gcc/cp/Make-lang.in 2020-09-03 14:44:21.099842403 +0200 @@ -49,7 +49,7 @@ CP_PLUGIN_HEADERS := cp-tree.h cxx-prett c++: cc1plus$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: c++ +.PHONY: c++ c++.serial c++.prev CFLAGS-cp/g++spec.o += $(DRIVER_DEFINES) @@ -116,10 +116,14 @@ cc1plus-checksum.c : build/genchecksum$( $(srcdir)/../move-if-change cc1plus-checksum.c.tmp cc1plus-checksum.c; \ fi -cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) +CC1PLUS_DEPS = $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) +cc1plus$(exeext): $(CC1PLUS_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) +c++.serial: c++.prev $(CC1PLUS_DEPS) + $(MAKE) $(FLAGS_TO_PASS) c++ + ifeq ($(ENABLE_MAINTAINER_RULES), true) # Special build rule. This is a maintainer rule, that is only # available when GCC is configured with --enable-maintainer-mode. In --- gcc/ada/gcc-interface/Make-lang.in.jj 2020-07-28 15:39:09.470763625 +0200 +++ gcc/ada/gcc-interface/Make-lang.in 2020-09-03 14:54:45.672695769 +0200 @@ -148,7 +148,7 @@ endif ada: gnat1$(exeext) gnatbind$(exeext) # Tell GNU Make to ignore these, if they exist. -.PHONY: ada +.PHONY: ada ada.serial ada.prev # Compute the FLAGS to pass for gnattools, now linked with a C++ driver as # we're linking against at least libcommon which contains C++ compiled code. @@ -666,11 +666,15 @@ ada/libgnat/s-excmac.adb: $(srcdir)/ada/ # Needs to be built with CC=gcc # Since the RTL should be built with the latest compiler, remove the # stamp target in the parent directory whenever gnat1 is rebuilt -gnat1$(exeext): $(TARGET_ADA_SRCS) $(GNAT1_OBJS) $(ADA_BACKEND) libcommon-target.a $(LIBDEPS) +GNAT1_DEPS = $(TARGET_ADA_SRCS) $(GNAT1_OBJS) $(ADA_BACKEND) libcommon-target.a $(LIBDEPS) +gnat1$(exeext): $(GNAT1_DEPS) +$(GCC_LLINK) -o $@ $(GNAT1_OBJS) $(ADA_BACKEND) \ libcommon-target.a $(LIBS) $(SYSLIBS) $(BACKENDLIBS) $(CFLAGS) $(RM) stamp-gnatlib2-rts stamp-tools +ada.serial: gnatbind$(exeext) ada.prev $(GNAT1_DEPS) + $(MAKE) $(FLAGS_TO_PASS) ada + gnatbind$(exeext): ada/b_gnatb.o $(CONFIG_H) $(GNATBIND_OBJS) ggc-none.o libcommon-target.a $(LIBDEPS) +$(GCC_LINK) -o $@ ada/b_gnatb.o $(GNATBIND_OBJS) ggc-none.o libcommon-target.a $(LIBS) $(SYSLIBS) $(CFLAGS) --- gcc/brig/Make-lang.in.jj 2020-01-12 11:54:36.193416728 +0100 +++ gcc/brig/Make-lang.in 2020-09-03 14:56:26.067225541 +0200 @@ -30,7 +30,7 @@ GCCBRIG_TARGET_INSTALL_NAME := $(target_ # The name for selecting brig in LANGUAGES. brig: brig1$(exeext) -.PHONY: brig +.PHONY: brig brig.serial brig.prev CFLAGS-brig/brigspec.o += $(DRIVER_DEFINES) @@ -81,16 +81,15 @@ BRIG_OBJS = \ brig_OBJS = $(BRIG_OBJS) brig/brigspec.o -# brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS) -# +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ -# $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) - - -brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS) +BRIG1_DEPS = $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS) +brig1$(exeext): $(BRIG1_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) \ $(BACKENDLIBS) +brig.serial: brig.prev $(BRIG1_DEPS) + $(MAKE) $(FLAGS_TO_PASS) brig + # Documentation. BRIG_TEXI_FILES = \ --- gcc/go/Make-lang.in.jj 2020-01-12 11:54:36.630410135 +0100 +++ gcc/go/Make-lang.in 2020-09-03 14:57:04.455663361 +0200 @@ -28,7 +28,7 @@ GCCGO_TARGET_INSTALL_NAME := $(target_no # The name for selecting go in LANGUAGES. go: go1$(exeext) -.PHONY: go +.PHONY: go go.serial go.prev CFLAGS-go/gospec.o += $(DRIVER_DEFINES) @@ -78,10 +78,14 @@ GO_OBJS = \ go_OBJS = $(GO_OBJS) go/gospec.o -go1$(exeext): $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS) +GO1_DEPS = $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS) +go1$(exeext): $(GO1_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(GO_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) +go.serial: go.prev $(GO1_DEPS) + $(MAKE) $(FLAGS_TO_PASS) go + # Documentation. GO_TEXI_FILES = \ --- gcc/jit/Make-lang.in.jj 2020-07-28 15:39:09.956756942 +0200 +++ gcc/jit/Make-lang.in 2020-09-03 14:51:31.109545079 +0200 @@ -48,8 +48,7 @@ ifneq (,$(findstring mingw,$(target))) LIBGCCJIT_FILENAME = libgccjit-$(LIBGCCJIT_VERSION_NUM).dll LIBGCCJIT_IMPORT_LIB = libgccjit.dll.a -jit: $(LIBGCCJIT_FILENAME) \ - $(FULL_DRIVER_NAME) +jit.extra: $(FULL_DRIVER_NAME) else @@ -75,14 +74,16 @@ LIBGCCJIT_SONAME_OPTION = \ $(if $(LD_SONAME_OPTION), \ -Wl$(COMMA)$(LD_SONAME_OPTION)$(COMMA)$(LIBGCCJIT_SONAME)) -jit: $(LIBGCCJIT_FILENAME) \ - $(LIBGCCJIT_SYMLINK) \ +jit.extra: $(LIBGCCJIT_SYMLINK) \ $(LIBGCCJIT_LINKER_NAME_SYMLINK) \ $(FULL_DRIVER_NAME) + endif +jit: $(LIBGCCJIT_FILENAME) jit.extra + # Tell GNU make to ignore these if they exist. -.PHONY: jit +.PHONY: jit jit.serial jit.prev jit.extra jit_OBJS = attribs.o \ jit/dummy-frontend.o \ @@ -113,17 +114,21 @@ endif # We avoid using $(BACKEND) from Makefile.in in order to avoid pulling # in main.o -$(LIBGCCJIT_FILENAME): $(jit_OBJS) \ +LIBGCCJIT_FILENAME_DEPS = $(jit_OBJS) \ libbackend.a libcommon-target.a libcommon.a \ $(CPPLIB) $(LIBDECNUMBER) \ $(LIBDEPS) $(srcdir)/jit/libgccjit.map \ $(EXTRA_GCC_OBJS) +$(LIBGCCJIT_FILENAME): $(LIBGCCJIT_FILENAME_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ -shared \ $(jit_OBJS) libbackend.a libcommon-target.a libcommon.a \ $(CPPLIB) $(LIBDECNUMBER) $(EXTRA_GCC_LIBS) $(LIBS) $(BACKENDLIBS) \ $(EXTRA_GCC_OBJS) \ $(LIBGCCJIT_EXTRA_OPTS) +jit.serial: jit.prev $(LIBGCCJIT_FILENAME_DEPS) + $(MAKE) $(FLAGS_TO_PASS) jit + # Create symlinks when not building for Windows ifeq (,$(findstring mingw,$(target))) $(LIBGCCJIT_SONAME_SYMLINK): $(LIBGCCJIT_FILENAME) --- gcc/d/Make-lang.in.jj 2020-08-26 10:27:10.690552343 +0200 +++ gcc/d/Make-lang.in 2020-09-03 14:52:31.675658110 +0200 @@ -29,7 +29,7 @@ D_LIBPHOBOS = -DLIBPHOBOS=\"gphobos\" d: d21$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: d +.PHONY: d d.serial d.prev # Create the compiler driver for D. CFLAGS-d/d-spec.o += $(DRIVER_DEFINES) $(D_LIBPHOBOS) @@ -162,10 +162,14 @@ D_ALL_OBJS = $(D_FRONTEND_OBJS) $(D_GENE d_OBJS = $(D_ALL_OBJS) d/d-spec.o -d21$(exeext): $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) +D21_DEPS = $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBDEPS) +d21$(exeext): $(D21_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(D_ALL_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) +d.serial: d.prev $(D21_DEPS) + $(MAKE) $(FLAGS_TO_PASS) d + # Documentation. D_TEXI_FILES = \ --- gcc/objc/Make-lang.in.jj 2020-01-12 11:54:36.681409365 +0100 +++ gcc/objc/Make-lang.in 2020-09-03 14:57:54.789926228 +0200 @@ -40,7 +40,7 @@ objc: cc1obj$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: objc +.PHONY: objc objc.serial objc.prev # Use maximal warnings for this front end. objc-warn = $(STRICT_WARN) @@ -62,11 +62,15 @@ cc1obj-checksum.c : build/genchecksum$(b $(BACKEND) $(LIBDEPS) checksum-options > cc1obj-checksum.c.tmp && \ $(srcdir)/../move-if-change cc1obj-checksum.c.tmp cc1obj-checksum.c -cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(LIBDEPS) +CC1OBJ_DEPS = $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(LIBDEPS) +cc1obj$(exeext): $(CC1OBJ_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \ $(BACKEND) $(LIBS) $(BACKENDLIBS) +objc.serial: objc.prev $(CC1OBJ_DEPS) + $(MAKE) $(FLAGS_TO_PASS) objc + objc.srcextra: # --- gcc/objcp/Make-lang.in.jj 2020-01-12 11:54:36.685409305 +0100 +++ gcc/objcp/Make-lang.in 2020-09-03 14:58:44.181202905 +0200 @@ -41,7 +41,7 @@ obj-c++: cc1objplus$(exeext) # Tell GNU make to ignore these if they exist. -.PHONY: obj-c++ +.PHONY: obj-c++ obj-c++.serial obj-c++.prev # Use maximal warnings for this front end. Also, make ObjC and C++ # headers accessible. @@ -66,10 +66,14 @@ cc1objplus-checksum.c : build/genchecksu $(srcdir)/../move-if-change cc1objplus-checksum.c.tmp \ cc1objplus-checksum.c -cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBDEPS) +CC1OBJPLUS_DEPS = $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBDEPS) +cc1objplus$(exeext): $(CC1OBJPLUS_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) +obj-c++.serial: obj-c++.prev $(CC1OBJPLUS_DEPS) + $(MAKE) $(FLAGS_TO_PASS) obj-c++ + # Objective C++ language specific files. objcp/objc-runtime-shared-support.o: objc/objc-runtime-shared-support.c --- gcc/fortran/Make-lang.in.jj 2020-01-12 11:54:36.582410859 +0100 +++ gcc/fortran/Make-lang.in 2020-09-03 14:53:48.550532310 +0200 @@ -74,7 +74,7 @@ fortran_OBJS = $(F95_OBJS) fortran/gfort fortran: f951$(exeext) # Tell GNU make to ignore files by these names if they exist. -.PHONY: fortran +.PHONY: fortran fortran.serial fortran.prev CFLAGS-fortran/gfortranspec.o += $(DRIVER_DEFINES) @@ -92,12 +92,15 @@ gfortran-cross$(exeext): gfortran$(exeex cp gfortran$(exeext) gfortran-cross$(exeext) # The compiler itself is called f951. -f951$(exeext): $(F95_OBJS) \ - $(BACKEND) $(LIBDEPS) attribs.o +F951_DEPS = $(F95_OBJS) $(BACKEND) $(LIBDEPS) attribs.o +f951$(exeext): $(F951_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(F95_OBJS) $(BACKEND) $(ZLIB) $(LIBS) attribs.o \ $(BACKENDLIBS) +fortran.serial: fortran.prev $(F951_DEPS) + $(MAKE) $(FLAGS_TO_PASS) fortran + gt-fortran-trans.h : s-gtype; @true # # Build hooks: --- gcc/lto/Make-lang.in.jj 2020-01-12 11:54:36.677409426 +0100 +++ gcc/lto/Make-lang.in 2020-09-03 14:45:51.957511831 +0200 @@ -41,10 +41,14 @@ lto_dump_OBJS = $(LTO_DUMP_OBJS) # Rules +lto: $(LTO_EXE) $(LTO_DUMP_EXE) + +.PHONY: lto lto.serial lto.prev + # These hooks are used by the main GCC Makefile. Consult that # Makefile for documentation. -lto.all.cross: $(LTO_EXE) $(LTO_DUMP_EXE) -lto.start.encap: $(LTO_EXE) $(LTO_DUMP_EXE) +lto.all.cross: +lto.start.encap: lto.rest.encap: lto.tags: lto.install-common: installdirs @@ -84,14 +88,20 @@ lto.stagefeedback: # Use strict warnings for this front end. lto-warn = $(STRICT_WARN) -$(LTO_EXE): $(LTO_OBJS) $(BACKEND) $(LIBDEPS) +LTO_EXE_DEPS = $(LTO_OBJS) $(BACKEND) $(LIBDEPS) +$(LTO_EXE): $(LTO_EXE_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(LTO_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS) -$(LTO_DUMP_EXE): $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS) +LTO_DUMP_EXE_DEPS = $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS) +$(LTO_DUMP_EXE): $(LTO_DUMP_EXE_DEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(LTO_DUMP_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS) +lto.serial: lto.prev $(LTO_EXE_DEPS) $(LTO_DUMP_EXE_DEPS) + $(MAKE) $(FLAGS_TO_PASS) $(LTO_EXE) + $(MAKE) $(FLAGS_TO_PASS) $(LTO_DUMP_EXE) + lto/lto-dump.o: $(LTO_OBJS) lto1.fda: ../prev-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA) --- gcc/configure.jj 2020-08-26 17:09:45.828254723 +0200 +++ gcc/configure 2020-09-03 14:41:09.632647617 +0200 @@ -710,6 +710,7 @@ subdirs dollar gcc_tooldir enable_lto +DO_LINK_SERIALIZATION DO_LINK_MUTEX MAINT zlibinc @@ -1012,6 +1013,7 @@ with_gc with_system_zlib enable_maintainer_mode enable_link_mutex +enable_link_serialization enable_version_specific_runtime_libs enable_plugin enable_host_shared @@ -1767,6 +1769,10 @@ Optional Features: sometimes confusing) to the casual installer --enable-link-mutex avoid linking multiple front-ends at once to avoid thrashing on the build machine + --enable-link-serialization + avoid linking multiple front-ends at once to avoid + thrashing on the build machine through make + dependencies --enable-version-specific-runtime-libs specify that runtime libraries should be installed in a compiler-specific directory @@ -19013,7 +19019,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 19016 "configure" +#line 19022 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -19119,7 +19125,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 19122 "configure" +#line 19128 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -30049,6 +30055,26 @@ else fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to serialize linking of multiple front-ends" >&5 +$as_echo_n "checking whether to serialize linking of multiple front-ends... " >&6; } + # Check whether --enable-link-serialization was given. +if test "${enable_link_serialization+set}" = set; then : + enableval=$enable_link_serialization; do_link_serialization=$enableval +else + do_link_serialization=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $do_link_serialization" >&5 +$as_echo "$do_link_serialization" >&6; } + +if test "$do_link_serialization" = "yes"; then + DO_LINK_SERIALIZATION=true +else + DO_LINK_SERIALIZATION=false +fi + + # -------------- # Language hooks # -------------- @@ -30209,6 +30235,14 @@ do echo "lang.$t: $x" >> Make-hooks done +prev=c +for lang in $all_selected_languages +do + test $lang = c && continue + echo "$lang.prev: $prev.serial" >> Make-hooks + prev=$lang +done + # -------- # Option include files # -------- Jakub