Brendan wrote:If it wasn't a problem, I wouldn't have noticed a problem.... To be honest it's easier for me to work around the problem in the build utility than to do extensive research.
To be sure, but wouldn't it be even easier (than a custom utility over a random-name-generating Makefile) to use the ?version trick or configure your web server not to let browsers cache CSS? In any case, how often does your CSS change? There's a reason servers usually let stylesheets get cached for a long time.
Brendan wrote:For dependencies, for web page generation alone (not including building binaries, etc): ...
Makes sense. I can see why you wanted to write your own tool for generating documentation, but I also have a nagging feeling that you've over-complicated things. Make could calculate all of those dependencies for you, with the help of a simple utility to do the equivalent of "gcc -M" for doc files. That still has the problem of re-parsing headers though, so this is probably the best reason I've seen so far.
Brendan wrote:- allocators - not sure which "allocators". For allocating ranges of the physical address space (not RAM), physical memory pages and virtual memory pages use the kernel API/s. For allocating IO port ranges and IRQs it's all contained within a "device manager" module (nothing else ever allocates these things). For anything else, it either doesn't exist, is confined to a specific module or you create your own implementation to suit your specific case.
The Linux kernel has several special purpose memory allocators more akin to malloc than anything that manages pages, IRQs, or ports. They implement optimizations like fixed-size slab allocation, and are reusable with different arenas, sizes, memory regions, etc. The whole point - efficiency - would be missed if they were behind any level of indirection.
Brendan wrote:- data structures - no idea which ones. The only data structures that are used by more than one binary are those that are covered by IPC protocols (and the specifications and include/header files that define them) or the kernel's APIs (and the specifications and include/header files that define them).
The Linux kernel has common code for handling arbitrary-sized bitmaps, including optimized bit/region set/test/clear, scanning, printing for debugging purposes, cross-architecture portability, etc. It has common code for working with binary trees- searching, lookup, etc. while doing maintenance like keeping them balanced. It also has common code for linked lists, radix trees,
flex arrays, etc. as well as algorithms like binary search, sorting arrays and lists, etc.