On Wed, 2013-10-16 at 12:49 +0200, Markus Armbruster wrote: > Ian Campbell <ian.campb...@citrix.com> writes: > > > On Wed, 2013-10-16 at 10:54 +0100, Jan Beulich wrote: > >> >>> On 16.10.13 at 08:30, "Gonglei (Arei)" <arei.gong...@huawei.com> wrote: > >> > --- hvmloader/acpi/Makefile 2013-10-16 11:51:53.000000000 +0800 > >> > +++ hvmloader_new//acpi/Makefile 2013-10-16 11:51:58.000000000 +0800 > >> > @@ -36,18 +36,34 @@ > >> > > >> > dsdt_anycpu_qemu_xen.asl: dsdt.asl mk_dsdt > >> > awk 'NR > 1 {print s} {s=$$0}' $< > $@ > >> > - ./mk_dsdt --dm-version qemu-xen >> $@ > >> > + sed -i 's/AmlCode/dsdt_anycpu_qemu_xen/g' $@ > >> > >> This must never be done - if someone hits Ctrl-C in the middle of > >> this, you'll have a modified but incomplete generated file. You > >> either need to use properly chained rules, or do all output to a > >> temporary file which you rename as the last step. > >> > >> I realize that the problem existed before your change, but you > >> making it worse requires doing it properly now. > > > > The correct way to do this is to generate to a temporary file and then > > use $(call move-if-changed,$@.tmp,$@). There are a bunch of examples in > > tools/libxl/Makefile and elsewhere. > > Quoting the GNU make manual[*]: > > So generally the right thing to do is to delete the target file if > the recipe fails after beginning to change the file. make will do > this if .DELETE_ON_ERROR appears as a target. This is almost always > what you want make to do, but it is not historical practice; so for > compatibility, you must explicitly request it. > > In my opinion, every Makefile should request it. > > [*] https://www.gnu.org/software/make/manual/html_node/Errors.html
I think this is somewhat orthogonal to the use of move-if-changed which is there to ensure that the timestamp doesn't change gratuitously and cause a load of knock on rebuilds even though the regenerated content is identical. Ian.