## Friday, June 09, 2006

### Double quote bug fix for signature

A while ago I wrote about Shoehorening Keep State into GNU Make. A reader has identified a bug in the code that I presented that causes the code to keep regenerating a target even though the commands have not changed.

This bug occurs if the commands for a target have a double-quote in them. For example, if you have something like:

foo.o:
@compiler -D_DEBUG="YES" foo.c

foo.o will be regenerated every time the Makefile is run. This is because the keep state code echoes the current state of the command to a file and echo strips the double-quotes around YES.

The fix is simple: escape ". Here's the updated code for signature with the fix in it:

include gmsl

last_target :=

dump_var = \$$(eval 1 := (1)) define new_rule @echo "(call map,dump_var,@ % < ? ^ + *)" > S @(if (wildcard F),,touch F) @echo @: F >> S endef define do (eval S := *.sig)(eval F := *.force)(eval C := (strip 1)) (if (call sne,@,(last_target)),(call new_rule),(eval last_target := @)) @echo "(subst ",\",(subst$$,\$$,$$(if $$(call sne,(strip 1),C),$$(shell touch $F))))" >>$S