nsiswriter.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import re
  2. class NSISFileWriter(object):
  3. def __init__(self, template_file, definitions=None):
  4. self.template_file = template_file
  5. self.definitions = definitions or {}
  6. self.extra_files = []
  7. self.write_after_line = {
  8. ';EXTRA_FILES_INSTALL': self.write_extra_files_install,
  9. ';EXTRA_FILES_UNINSTALL': self.write_extra_files_uninstall,
  10. }
  11. def write_definitions(self, f):
  12. for name, value in self.definitions.items():
  13. f.write('!define {} "{}"\n'.format(name, value))
  14. def write_extra_files_install(self, f, indent):
  15. for file, is_dir in self.extra_files:
  16. if is_dir:
  17. f.write(indent+'SetOutPath "$INSTDIR\{}"\n'.format(file))
  18. f.write(indent+'File /r "{}\*.*"\n'.format(file))
  19. f.write(indent+'SetOutPath "$INSTDIR"\n')
  20. else:
  21. f.write(indent+'File "{}"\n'.format(file))
  22. def write_extra_files_uninstall(self, f, indent):
  23. for file, is_dir in self.extra_files:
  24. if is_dir:
  25. f.write(indent+'RMDir /r "$INSTDIR\{}"\n'.format(file))
  26. else:
  27. f.write(indent+'Delete "$INSTDIR\{}"\n'.format(file))
  28. def write(self, target):
  29. with open(target, 'w') as fout, open(self.template_file) as fin:
  30. self.write_definitions(fout)
  31. for line in fin:
  32. fout.write(line)
  33. l = line.strip()
  34. if l in self.write_after_line:
  35. indent = re.match('\s*', line).group(0)
  36. self.write_after_line[l](fout, indent)