Rebuilds will happen only if: 1. a source file is new or has changed 2. the corresponding object file is missing or has changed 3. the command that is used to compile the source has changed 4. a dependent header file has changed 5. the command to link the executable or build the library archive has changed 6. the executable or library has changed or is missing #### FEATURES AND ADVANTAGES 1. Everything is done with SHA1 signatures. No dates are used anywhere. 2. bld is REALLY simple to use. There are no arguments, no options(except -h), no environment variables and no rc files. The entire bld is controlled from the Bld(and Bld.gv file) file. Only a minimal knowledge of perl is needed - variable definitions and simple regular expressions. 3. bld is not hierarchical. A single Bld file controls the construction of a single target(a target is an executable or library(static or shared)). Complex multi-target projects use one Bld.gv(global values) file and many Bld files - one to a target. 4. Each source file will have three signatures associated with it - one for the source file, one for the corresponding object file and one for the cmds use to rebuild the source. A change in any of these will result in a rebuild. 5. If any files in the bld have the same signature this is warned about e.g. two header or source files of the same or different names. 6. Optionally, the signatures of dynamic libraries may be tracked. If a library signature changes the bld may warn or stop the rebuild. If dynamic libraries are added or deleted from the bld this can ignore/warn/fatal. 7. A change in the target signature will result in a rebuild. 8. Complex multi-target projects are built with a standard directory setup and a standard set of scripts - Directories: #### /tmp>mkdir empty /tmp>cd empty /tmp/empty>echo 'int main() { write(1,"Hello\n",6); }' > demo.c /tmp/empty>make demo cc demo.c -o demo /tmp/empty>./demo Hello /tmp/empty>ls demo demo.c /tmp/empty> #### 1. bld assumes that a source will build a derived file e.g. .o files in the same directory and have the same root name as the source. 2. bld assumes that all targets in multi-target bld's will be uniquely named - all targets go into the same project directory. 3. Some projects violate either or both of these target naming or object file naming/location requirements, but reconstructing these projects with bld should be relatively easy e.g. systemd. 4. bld executes cmd fields({}) in the bld directory and then moves all created files to the source directory.