diff options
author | Yunhua Feng <yunhuax.feng@intel.com> | 2019-04-11 12:57:15 +0800 |
---|---|---|
committer | Liming Gao <liming.gao@intel.com> | 2019-04-22 10:05:52 +0800 |
commit | 0b836855fb4df66f7ca035a7b67a064c0088ed69 (patch) | |
tree | 2f43aa6520c130b2b959e73e1f1ed30f60b4c10b | |
parent | e72920ec617ba1fceb114b3bb2a587a8e836734b (diff) | |
download | edk2-0b836855fb4df66f7ca035a7b67a064c0088ed69.tar.gz edk2-0b836855fb4df66f7ca035a7b67a064c0088ed69.tar.bz2 edk2-0b836855fb4df66f7ca035a7b67a064c0088ed69.zip |
BaseTools: Sometime write file not immediate to disk
BZ: https://bugzilla.tianocore.org/process_bug.cgi
On Windows OS, sometime the generated file is not immediate saved to disk.
When run nmake, prompt AutoGen.h not found, and stop build.
Below blog shows Write-Replace to fix it. This patch uses this way to write
temp file, then rename the temp file to the real file.
https://blog.gocept.com/2013/07/15/reliable-file-updates-with-python/
Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
-rw-r--r-- | BaseTools/Source/Python/Common/Misc.py | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py index 5db9405ddc..3b3ab2d6df 100644 --- a/BaseTools/Source/Python/Common/Misc.py +++ b/BaseTools/Source/Python/Common/Misc.py @@ -22,6 +22,7 @@ from random import sample from struct import pack
import uuid
import subprocess
+import tempfile
from collections import OrderedDict
import Common.LongFilePathOs as os
@@ -476,15 +477,23 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True): if not os.access(DirName, os.W_OK):
EdkLogger.error(None, PERMISSION_FAILURE, "Do not have write permission on directory %s" % DirName)
+ OpenMode = "w"
if IsBinaryFile:
+ OpenMode = "wb"
+
+ if GlobalData.gIsWindows and not os.path.exists(File):
+ # write temp file, then rename the temp file to the real file
+ # to make sure the file be immediate saved to disk
+ with tempfile.NamedTemporaryFile(OpenMode, dir=os.path.dirname(File), delete=False) as tf:
+ tf.write(Content)
+ tempname = tf.name
try:
- with open(File, "wb") as Fd:
- Fd.write(Content)
- except IOError as X:
+ os.rename(tempname, File)
+ except:
EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)
else:
try:
- with open(File, 'w') as Fd:
+ with open(File, OpenMode) as Fd:
Fd.write(Content)
except IOError as X:
EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)
|