Skip to content

Commit b8f9309

Browse files
authored
Merge pull request #586 from apple/add-clangc-public
Add '--clang' flag to runner.py
2 parents 5ba7b40 + ce448af commit b8f9309

File tree

3 files changed

+63
-6
lines changed

3 files changed

+63
-6
lines changed

project_future.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,9 @@ def add_arguments(parser):
643643
parser.add_argument("--report-time-path",
644644
help='export time for building each xcode build target to the specified json file',
645645
type=os.path.abspath)
646+
parser.add_argument("--clang",
647+
help='clang executable to build Xcode projects',
648+
type=os.path.abspath)
646649
parser.add_argument("--job-type",
647650
help="The type of job to run. This influences which projects are XFailed, for example the stress tester tracks its XFails under a different job type. Defaults to 'source-compat'.",
648651
default='source-compat')

run

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

216238
def 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

274324
if __name__ == '__main__':
275325
sys.exit(main())

runner.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ def main():
4242
xcodebuild_flags = args.add_xcodebuild_flags
4343
xcodebuild_flags += (' ' if xcodebuild_flags else '') + 'DEBUG_INFORMATION_FORMAT=dwarf'
4444

45+
# Use clang for building xcode projects.
46+
if args.clang:
47+
xcodebuild_flags += ' CC=%s' % args.clang
48+
4549
swift_flags = args.add_swift_flags
4650

4751
time_reporter = None

0 commit comments

Comments
 (0)