Hi all, I just posted a patch (#5108) that allows one to select targets that can't be built in parallel. Here's the description:
============== This patch introduces a .SERIAL special target which causes all its dependencies to be built as if make was called with '-j1'. This solves the "ar" problem described in the section "Dangers When Using Archives" section of the manual. This is also very useful for linking libraries and executables, as those tasks are I/O bound and can lock the machine if done in parallel. I think SCO make has a similar thing using a .MUTEX special target. I don't care about either name, and would use .NOTPARALLEL but that can break existing makefiles where .NOTPARALLEL has bogus dependencies. =============== The reaon that prompted me to write this was this: In our company, the makefile system is built so that there are no recursive makes, and you can build from any subdirectory. The infrastructure is cross-platform, compiling in Windows, Solaris, Linux, Mac, and FreeBSD. Recently we started using 'icecream' (the successor of distcc) to speed up compilation times. While that works, there are problems with paralellization. Only compilation jobs are distributed, linking remains local. Thus, if we type (as we do) make -j we have very fast compilation but the local machine ends up heavily overloaded when, for example, make decides that 10 libraries and executables are to be linked in parallel. Right now we have a kludge in the makefile that serializes those things, but that is not ideal for many reasons. One of them is that in calling make recursively we waste parsing time. Another one is that once the recursive call is made, targets that would otherwise be run in parallel (while in that call) are not. We tried other solutions but all have some pretty serious drawbacks too. My solution, implemented in the patch, is this: introduce a special ".SERIAL" target, which makes all its dependencies be serialized, that is, they can only be built when nothing else is being built. If no dependencies are specified, then it is equivalent to ".NOTPARALLEL". The reason I didn't use the existent ".NOTPARALLEL" is that it would break compatibility with people who used the target with bogus dependencies. As far as I know there is something similar in SCO make, under the ".MUTEX" special target. Code review (that was my first look at make code) and suggestions welcome. - Cesar _______________________________________________ Help-make mailing list Help-make@gnu.org http://lists.gnu.org/mailman/listinfo/help-make