Skip to content

Commit e38f6df

Browse files
committed
Add option to verify gyb-generated files
1 parent 648e937 commit e38f6df

File tree

1 file changed

+49
-14
lines changed

1 file changed

+49
-14
lines changed

build-script.py

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,28 +92,30 @@ def check_rsync():
9292
fatal_error('Error: Could not find rsync.')
9393

9494

95-
def generate_gyb_files(verbose, add_source_locations):
95+
def generate_gyb_files(verbose, add_source_locations, destination=None):
9696
print('** Generating gyb Files **')
9797

9898
check_gyb_exec()
9999
check_rsync()
100100

101101
swiftsyntax_sources_dir = PACKAGE_DIR + '/Sources/SwiftSyntax'
102102
temp_files_dir = tempfile.gettempdir()
103-
generated_files_dir = swiftsyntax_sources_dir + '/gyb_generated'
103+
104+
if destination is None:
105+
destination = swiftsyntax_sources_dir + '/gyb_generated'
104106

105107
if not os.path.exists(temp_files_dir):
106108
os.makedirs(temp_files_dir)
107-
if not os.path.exists(generated_files_dir):
108-
os.makedirs(generated_files_dir)
109+
if not os.path.exists(destination):
110+
os.makedirs(destination)
109111

110112
# Clear any *.swift files that are relics from the previous run.
111-
for previous_gyb_gen_file in os.listdir(generated_files_dir):
113+
for previous_gyb_gen_file in os.listdir(destination):
112114
if previous_gyb_gen_file.endswith('.swift'):
113115
gyb_file = os.path.join(swiftsyntax_sources_dir,
114116
previous_gyb_gen_file + '.gyb')
115117
if not os.path.exists(gyb_file):
116-
check_call(['rm', previous_gyb_gen_file], cwd=generated_files_dir,
118+
check_call(['rm', previous_gyb_gen_file], cwd=destination,
117119
verbose=verbose)
118120

119121
# Generate the new .swift files in a temporary directory and only copy them
@@ -145,7 +147,7 @@ def generate_gyb_files(verbose, add_source_locations):
145147
check_call(['rsync'] +
146148
['--checksum'] +
147149
[temp_files_dir + '/' + output_file_name] +
148-
[generated_files_dir + '/' + output_file_name],
150+
[destination + '/' + output_file_name],
149151
verbose=verbose)
150152

151153
print('Done Generating gyb Files')
@@ -221,6 +223,24 @@ def build(self, product_name, module_group_path=''):
221223

222224

223225
## Testing
226+
def verify_generated_files(verbose):
227+
user_generated_dir = os.path.join(PACKAGE_DIR, 'Sources', 'SwiftSyntax',
228+
'gyb_generated')
229+
self_generated_dir = tempfile.mkdtemp()
230+
generate_gyb_files(verbose=verbose,
231+
add_source_locations=False,
232+
destination=self_generated_dir)
233+
234+
command = [
235+
'diff', '-r',
236+
'-x', '.*', # Exclude dot files like .DS_Store
237+
'--context=0',
238+
self_generated_dir,
239+
user_generated_dir,
240+
]
241+
check_call(command)
242+
243+
224244
def run_tests(swift_test_exec, build_dir, parser_header_dir, parser_lib_dir,
225245
release, swift_build_exec, filecheck_exec, swiftc_exec, verbose):
226246
print('** Running SwiftSyntax Tests **')
@@ -501,6 +521,11 @@ def main():
501521
Path to the FileCheck executable that was built as part of the LLVM
502522
repository. If not specified, it will be looked up from PATH.
503523
''')
524+
testing_group.add_argument('--verify-generated-files', action='store_true',
525+
help='''
526+
Instead of generating files using gyb, verify that the files which
527+
already exist match the ones that would be generated by this script.
528+
''')
504529

505530
args = parser.parse_args(sys.argv[1:])
506531

@@ -521,20 +546,30 @@ def main():
521546
sys.exit(0)
522547

523548
try:
524-
generate_gyb_files(verbose=args.verbose,
525-
add_source_locations=args.add_source_locations)
549+
if not args.verify_generated_files:
550+
generate_gyb_files(verbose=args.verbose,
551+
add_source_locations=args.add_source_locations)
526552
# Skip the rest of the build if we should perform degyb only
527553
if args.degyb_only:
528554
sys.exit(0)
529555
except subprocess.CalledProcessError as e:
530-
printerr('Error: Generating .gyb files failed')
556+
printerr('FAIL: Generating .gyb files failed')
531557
printerr('Executing: %s' % ' '.join(e.cmd))
532558
printerr(e.output)
533559
sys.exit(1)
534560

561+
if args.verify_generated_files:
562+
try:
563+
success = verify_generated_files(verbose=args.verbose)
564+
except subprocess.CalledProcessError as e:
565+
printerr('FAIL: Gyb-generated files committed to repository do '
566+
'not match generated ones. Please re-generate the '
567+
'gyb-files and recommit them.')
568+
sys.exit(1)
569+
535570
if args.generate_xcodeproj:
536-
xcode_gen(config=args.xcconfig_path)
537-
sys.exit(0)
571+
xcode_gen(config=args.xcconfig_path)
572+
sys.exit(0)
538573

539574
try:
540575
builder = Builder(swift_build_exec=args.swift_build_exec,
@@ -551,7 +586,7 @@ def main():
551586
if args.test:
552587
builder.build('lit-test-helper')
553588
except subprocess.CalledProcessError as e:
554-
printerr('Error: Building SwiftSyntax failed')
589+
printerr('FAIL: Building SwiftSyntax failed')
555590
printerr('Executing: %s' % ' '.join(e.cmd))
556591
printerr(e.output)
557592
sys.exit(1)
@@ -574,7 +609,7 @@ def main():
574609
else:
575610
print('** All tests passed **')
576611
except subprocess.CalledProcessError as e:
577-
printerr('Error: Running tests failed')
612+
printerr('FAIL: Running tests failed')
578613
printerr('Executing: %s' % ' '.join(e.cmd))
579614
printerr(e.output)
580615
sys.exit(1)

0 commit comments

Comments
 (0)