=item B<--write-llvmbuild>
Write out new I<LLVMBuild.txt> files based on the loaded components. This is
-useful for auto-upgrading the schema of the files.
+useful for auto-upgrading the schema of the files. B<llvm-build> will try to a
+limited extent to preserve the comments which were written in the original
+source file, although at this time it only preserves block comments that preceed
+the section names in the I<LLVMBuild> files.
=item B<--write-cmake-fragment>
self.parent_instance = None
self.children = []
+ # The original source path.
+ self._source_path = None
+
def set_parent_instance(self, parent):
assert parent.name == self.parent, "Unexpected parent!"
self.parent_instance = parent
fatal("unable to load component %r in %r: %s" % (
section, path, e.message))
+ info._source_path = path
yield info
+import StringIO
import os
import sys
if not os.path.exists(directory_path):
os.makedirs(directory_path)
- # Create the LLVMBuild file.
+ # In an effort to preserve comments (which aren't parsed), read in
+ # the original file and extract the comments. We only know how to
+ # associate comments that prefix a section name.
+ f = open(infos[0]._source_path)
+ comments_map = {}
+ comment_block = ""
+ for ln in f:
+ if ln.startswith(';'):
+ comment_block += ln
+ elif ln.startswith('[') and ln.endswith(']\n'):
+ comments_map[ln[:-1]] = comment_block
+ else:
+ comment_block = ""
+ f.close()
+
+ # Create the LLVMBuild fil[e.
file_path = os.path.join(directory_path, 'LLVMBuild.txt')
f = open(file_path, "w")
""" % header_string
for i,fragment in enumerate(fragments):
- print >>f, '[component_%d]' % i
+ name = '[component_%d]' % i
+ comment = comments_map.get(name)
+ if comment is not None:
+ f.write(comment)
+ print >>f, name
f.write(fragment)
if fragment is not fragments[-1]:
print >>f