On 2024-08-10 22:37, Philip Guenther wrote: > I think the correctness concern is that this provides mutual exclusion > for ar only. Other programs may be reading the .a, including make > itself. If your system's ar does atomic updates (write new temp file, > rename over existing .a) then the readers should have a > self-consistent view and this should work Just Fine. If not, then > depending on exactly how it does update then make may get confused > about the .a contents. > > > The performance concern is two-fold: > > 1) ar's normal operation includes rebuilding the symbol table after > each change. Adding objects to a .a with separate ar invocations > results in O(N^2) symbol operations. > > 2) make's parallel operation isn't aware of the "these operations will > be serialized" behavior, so make may schedule multiple 'invoke rule > using $(AR)' recipes concurrently despite them being serialized, > resulting in reduced parallelism vs the "build all of the out-of-date > objects then insert them all at once" rule setup.
Idea: fix the code generator so that for each rule that updates an archive, it uses a unique name for the archive specific to that rule. Perhaps by using numbers: libfoo.001.a, libfoo.002.a, ... Then, the generator must also emit a new rule like this libfoo.a: libfoo.001.a libfoo.002.a ... ... whose recipe lines combines the smaller archives into the one big one that is then used elsewhere as a dependency.