@@ -37,11 +37,19 @@ def main():
3737 if not args .skip_build :
3838 build_swift_toolchain (workspace , args )
3939
40+ additional_runner_args = []
41+ if args .clang_source_path or args .clang :
42+ clang = args .clang
43+ if args .clang_source_path :
44+ clang = build_clang (workspace , args )
45+ if clang :
46+ additional_runner_args = ['--clang' , clang ]
47+
4048 if not args .skip_runner :
4149 if args .test_incremental :
42- execute_build_incremental (workspace , args )
50+ execute_build_incremental (workspace , args , additional_runner_args )
4351 else :
44- execute_runner (workspace , args )
52+ execute_runner (workspace , args , additional_runner_args )
4553
4654 return 0
4755
@@ -57,10 +65,10 @@ def parse_args():
5765 parser .add_argument ("--verbose" ,
5866 action = 'store_true' )
5967 parser .add_argument ("--assertions" ,
60- help = 'Build Swift with asserts' ,
68+ help = 'Build Swift and/or Clang with asserts' ,
6169 action = 'store_true' )
6270 parser .add_argument ("--debug" ,
63- help = 'Build Swift in debug mode' ,
71+ help = 'Build Swift and/or Clang in debug mode' ,
6472 action = 'store_true' )
6573 parser .add_argument ("--filter-by-tag" ,
6674 metavar = 'TAG' ,
@@ -74,6 +82,17 @@ def parse_args():
7482 parser .add_argument ('--swiftc' ,
7583 metavar = 'PATH' ,
7684 help = 'swiftc executable' )
85+ clang_arguments = parser .add_mutually_exclusive_group ()
86+ clang_arguments .add_argument ('--clang-source-path' ,
87+ metavar = "PATH" ,
88+ help = 'Path to llvm-project source. Build a new clang '
89+ 'executable from the given path and uses it to '
90+ 'build Xcode projects' ,
91+ type = os .path .abspath )
92+ clang_arguments .add_argument ('--clang' ,
93+ metavar = "PATH" ,
94+ help = 'clang executable to build Xcode projects' ,
95+ type = os .path .abspath )
7796 parser .add_argument ('--skip-build' ,
7897 action = 'store_true' )
7998 parser .add_argument ('--skip-ci-steps' ,
@@ -161,7 +180,7 @@ def get_sandbox_profile_flags_test():
161180 return sandbox_flags
162181
163182
164- def execute_runner (workspace , args ):
183+ def execute_runner (workspace , args , additional_runner_args ):
165184 swiftc_path = get_swiftc_path (workspace , args .swiftc )
166185 if args .test :
167186 action_filter = 'action.startswith("TestSwiftPackage")'
@@ -193,10 +212,12 @@ def execute_runner(workspace, args):
193212 if args .build_config :
194213 runner_command += ['--build-config=%s' % args .build_config ]
195214
215+ runner_command += additional_runner_args
216+
196217 common .check_execute (runner_command , timeout = 9999999 )
197218
198219
199- def execute_build_incremental (workspace , args ):
220+ def execute_build_incremental (workspace , args , additional_runner_args ):
200221 swiftc_path = get_swiftc_path (workspace , args .swiftc )
201222 runner_command = [
202223 './build_incremental.py' ,
@@ -211,6 +232,7 @@ def execute_build_incremental(workspace, args):
211232 ]
212233 if args .sandbox :
213234 runner_command += get_sandbox_profile_flags ()
235+ runner_command += additional_runner_args
214236 common .check_execute (runner_command , timeout = 9999999 )
215237
216238def get_preset_name (args ):
@@ -270,6 +292,34 @@ def build_swift_toolchain(workspace, args):
270292 raise common .UnsupportedPlatform
271293 common .check_execute (build_command , timeout = 9999999 )
272294
295+ def build_clang (workspace , args ):
296+ build_path = os .path .join (workspace , 'build_clang_source_compat' )
297+ source_path = os .path .join (args .clang_source_path , 'llvm' )
298+ common .check_execute (['mkdir' , '-p' , build_path ])
299+
300+ with common .DirectoryContext (build_path ):
301+ # Get path to the ninja binary
302+ ninja_path = common .check_execute_output (['xcrun' , '--find' , 'ninja' ]).strip ().decode ("utf-8" )
303+
304+ build_type = "Debug" if args .debug else "Release"
305+ assert_on = "True" if args .assertions or args .debug else "False"
306+
307+ # Generate a Ninja project with CMake
308+ cmake_command = [
309+ 'xcrun' , 'cmake' , '-G' , 'Ninja' ,
310+ '-DCMAKE_MAKE_PROGRAM={}' .format (ninja_path ),
311+ '-DLLVM_ENABLE_PROJECTS=clang;llvm' ,
312+ '-DCMAKE_BUILD_TYPE={}' .format (build_type ),
313+ '-DLLVM_ENABLE_ASSERTIONS={}' .format (assert_on ),
314+ '-DCLANG_APPLE_BUILD_VERSION_STRING=13000000' ,
315+ '-DLLVM_TARGETS_TO_BUILD=X86;AArch64;ARM' ,
316+ source_path ]
317+ common .check_execute (cmake_command )
318+
319+ # Build the Ninja project to produce the clang executable
320+ common .check_execute (['xcrun' , 'ninja' ])
321+
322+ return os .path .join (build_path , 'bin' , 'clang' )
273323
274324if __name__ == '__main__' :
275325 sys .exit (main ())
0 commit comments