From 3545eeb6c1dac11725fc919ae4481e7f85d72b27 Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Mon, 29 Feb 2016 12:45:18 -0800 Subject: [PATCH] Remove destination before copying file If there's a symlink as the destination to one of these macros, currently we'll write to the destination of that symlink instead of overwriting the symlink. We've run into this a few times when a module is added to replace a symlink that used to exist via LOCAL_POST_INSTALL_CMD. These have required manual discovery, and additions to CleanSpec.mk files: http://android-review.googlesource.com/143334 Use `rm -f` for single-file targets to remove the destination before copying. On Linux, `cp --remove-destination` can work, but is not supported by Darwin or acp. There may still be problems with dependencies when symlinks are involved, since ninja will use the destination of the symlink to check whether it is up to date. But at least with this change, if any dependency gets regenerated, we'll properly reset the file. Change-Id: I6d3ac0bd9ced5e21a0ff9dad0eaff012a7bc9c75 --- core/definitions.mk | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index 5c76d7748..6960ff34e 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2404,19 +2404,22 @@ endef # Therefore copy-file-to-target is the same as copy-file-to-new-target. define copy-file-to-target @mkdir -p $(dir $@) -$(hide) $(ACP) -fp $< $@ +$(hide) rm -f $@ +$(hide) $(ACP) -p $< $@ endef # The same as copy-file-to-target, but use the local # cp command instead of acp. define copy-file-to-target-with-cp @mkdir -p $(dir $@) -$(hide) cp -fp $< $@ +$(hide) rm -f $@ +$(hide) cp -p $< $@ endef # The same as copy-file-to-target, but use the zipalign tool to do so. define copy-file-to-target-with-zipalign @mkdir -p $(dir $@) +$(hide) rm -f $@ $(hide) $(ZIPALIGN) -f 4 $< $@ endef @@ -2424,6 +2427,7 @@ endef # comments (for config files and such). define copy-file-to-target-strip-comments @mkdir -p $(dir $@) +$(hide) rm -f $@ $(hide) sed -e 's/#.*$$//' -e 's/[ \t]*$$//' -e '/^$$/d' < $< > $@ endef @@ -2431,14 +2435,16 @@ endef # the old modification time. define copy-file-to-new-target @mkdir -p $(dir $@) -$(hide) $(ACP) -fp $< $@ +$(hide) rm -f $@ +$(hide) $(ACP) -p $< $@ endef # The same as copy-file-to-new-target, but use the local # cp command instead of acp. define copy-file-to-new-target-with-cp @mkdir -p $(dir $@) -$(hide) cp -f $< $@ +$(hide) rm -f $@ +$(hide) cp $< $@ endef # Copy a prebuilt file to a target location.