Skip to content

Commit 1a146f4

Browse files
[bootstrap] consolidate some build_... functions into build_dependency (#3582)
This removes some repetition. Some functions such as `build_llbuild` and `build_swiftpm_with_cmake` are not consolidated, because they're more different.
1 parent 9aab44d commit 1a146f4

File tree

1 file changed

+65
-98
lines changed

1 file changed

+65
-98
lines changed

Utilities/bootstrap

Lines changed: 65 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python
2+
# encoding: utf-8
23

34
"""
45
This source file is part of the Swift.org open source project
@@ -167,14 +168,24 @@ def add_test_args(parser):
167168

168169
def parse_global_args(args):
169170
"""Parses and cleans arguments necessary for all actions."""
170-
args.build_dir = os.path.abspath(args.build_dir)
171-
args.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
172-
args.tsc_source_dir = os.path.join(args.project_root, "..", "swift-tools-support-core")
173-
args.yams_source_dir = os.path.join(args.project_root, "..", "yams")
174-
args.swift_argument_parser_source_dir = os.path.join(args.project_root, "..", "swift-argument-parser")
175-
args.swift_driver_source_dir = os.path.join(args.project_root, "..", "swift-driver")
176-
args.swift_crypto_source_dir = os.path.join(args.project_root, "..", "swift-crypto")
177-
args.source_root = os.path.join(args.project_root, "Sources")
171+
# Test if 'build_dirs' and 'source_dirs' exist, and initialise them only if not.
172+
# Otherwise, both are reset to empty dictionaries every time 'parse_global_args' is called, which crashes 'test', because 'test' calls it (via 'parse_test_args' → 'parse_build_args') after 'build' has called it (via 'parse_build_args').
173+
try:
174+
args.build_dirs
175+
except AttributeError:
176+
args.build_dirs = {}
177+
try:
178+
args.source_dirs
179+
except AttributeError:
180+
args.source_dirs = {}
181+
args.build_dir = os.path.abspath(args.build_dir)
182+
args.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
183+
args.source_dirs["tsc"] = os.path.join(args.project_root, "..", "swift-tools-support-core")
184+
args.source_dirs["yams"] = os.path.join(args.project_root, "..", "yams")
185+
args.source_dirs["swift-argument-parser"] = os.path.join(args.project_root, "..", "swift-argument-parser")
186+
args.source_dirs["swift-driver"] = os.path.join(args.project_root, "..", "swift-driver")
187+
args.source_dirs["swift-crypto"] = os.path.join(args.project_root, "..", "swift-crypto")
188+
args.source_root = os.path.join(args.project_root, "Sources")
178189

179190
if platform.system() == 'Darwin':
180191
args.sysroot = call_output(["xcrun", "--sdk", "macosx", "--show-sdk-path"], verbose=args.verbose)
@@ -192,7 +203,7 @@ def parse_build_args(args):
192203
args.foundation_build_dir = os.path.abspath(args.foundation_build_dir)
193204

194205
if args.llbuild_build_dir:
195-
args.llbuild_build_dir = os.path.abspath(args.llbuild_build_dir)
206+
args.build_dirs["llbuild"] = os.path.abspath(args.llbuild_build_dir)
196207

197208
args.swiftc_path = get_swiftc_path(args)
198209
args.clang_path = get_clang_path(args)
@@ -313,15 +324,23 @@ def build(args):
313324
parse_build_args(args)
314325

315326
# Build llbuild if its build path is not passed in.
316-
if not args.llbuild_build_dir:
327+
if not "llbuild" in args.build_dirs:
317328
build_llbuild(args)
318329

319330
if args.bootstrap:
320-
build_tsc(args)
321-
build_yams(args)
322-
build_swift_argument_parser(args)
323-
build_swift_driver(args)
324-
build_swift_crypto(args)
331+
# tsc, swift-argument-parser, and yams are depended on by swift-driver, so they must be built first.
332+
build_dependency(args, "tsc")
333+
build_dependency(args, "swift-argument-parser", ["-DBUILD_TESTING=NO", "-DBUILD_EXAMPLES=NO"])
334+
build_dependency(args, "yams", [], [get_foundation_cmake_arg(args)] if args.foundation_build_dir else [])
335+
336+
swift_driver_cmake_flags = [
337+
get_llbuild_cmake_arg(args),
338+
"-DTSC_DIR=" + os.path.join(args.build_dirs["tsc"], "cmake/modules"),
339+
"-DYams_DIR=" + os.path.join(args.build_dirs["yams"], "cmake/modules"),
340+
"-DArgumentParser_DIR=" + os.path.join(args.build_dirs["swift-argument-parser"], "cmake/modules"),
341+
]
342+
build_dependency(args, "swift-driver", swift_driver_cmake_flags)
343+
build_dependency(args, "swift-crypto")
325344
build_swiftpm_with_cmake(args)
326345

327346
build_swiftpm_with_swiftpm(args,integrated_swift_driver=False)
@@ -486,9 +505,9 @@ def build_llbuild(args):
486505
note("Building llbuild")
487506

488507
# Set where we are going to build llbuild for future steps to find it
489-
args.llbuild_build_dir = os.path.join(args.target_dir, "llbuild")
508+
args.build_dirs["llbuild"] = os.path.join(args.target_dir, "llbuild")
490509

491-
api_dir = os.path.join(args.llbuild_build_dir, ".cmake/api/v1/query")
510+
api_dir = os.path.join(args.build_dirs["llbuild"], ".cmake/api/v1/query")
492511
mkdir_p(api_dir)
493512
call(["touch", "codemodel-v2"], cwd=api_dir, verbose=args.verbose)
494513

@@ -505,73 +524,21 @@ def build_llbuild(args):
505524
if args.sysroot:
506525
flags.append("-DSQLite3_INCLUDE_DIR=%s/usr/include" % args.sysroot)
507526

508-
llbuild_source_dir = get_llbuild_source_path(args)
509-
build_with_cmake(args, flags, llbuild_source_dir, args.llbuild_build_dir)
510-
511-
def build_tsc(args):
512-
note("Building TSC")
513-
args.tsc_build_dir = os.path.join(args.target_dir, "tsc")
514-
515-
cmake_flags = []
516-
if platform.system() == 'Darwin':
517-
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
518-
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
519-
520-
build_with_cmake(args, cmake_flags, args.tsc_source_dir, args.tsc_build_dir)
521-
522-
def build_swift_argument_parser(args):
523-
note("Building swift-argument-parser")
524-
args.swift_argument_parser_build_dir = os.path.join(args.target_dir, "swift-argument-parser")
525-
526-
cmake_flags = []
527-
if platform.system() == 'Darwin':
528-
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
529-
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
530-
531-
cmake_flags.append("-DBUILD_TESTING=NO")
532-
cmake_flags.append("-DBUILD_EXAMPLES=NO")
533-
build_with_cmake(args, cmake_flags, args.swift_argument_parser_source_dir, args.swift_argument_parser_build_dir)
527+
args.source_dirs["llbuild"] = get_llbuild_source_path(args)
528+
build_with_cmake(args, flags, args.source_dirs["llbuild"], args.build_dirs["llbuild"])
534529

535-
def build_yams(args):
536-
note("Building Yams")
537-
args.yams_build_dir = os.path.join(args.target_dir, "yams")
530+
def build_dependency(args, target_name, common_cmake_flags = [], non_darwin_cmake_flags = []):
531+
note("Building " + target_name)
532+
args.build_dirs[target_name] = os.path.join(args.target_dir, target_name)
538533

539-
cmake_flags = []
534+
cmake_flags = common_cmake_flags
540535
if platform.system() == 'Darwin':
541536
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
542537
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
543538
else:
544-
if args.foundation_build_dir:
545-
cmake_flags.append(get_foundation_cmake_arg(args))
546-
547-
build_with_cmake(args, cmake_flags, args.yams_source_dir, args.yams_build_dir)
548-
549-
def build_swift_driver(args):
550-
note("Building SwiftDriver")
551-
args.swift_driver_build_dir = os.path.join(args.target_dir, "swift-driver")
552-
553-
cmake_flags = [
554-
get_llbuild_cmake_arg(args),
555-
"-DTSC_DIR=" + os.path.join(args.tsc_build_dir, "cmake/modules"),
556-
"-DYams_DIR=" + os.path.join(args.yams_build_dir, "cmake/modules"),
557-
"-DArgumentParser_DIR=" + os.path.join(args.swift_argument_parser_build_dir, "cmake/modules"),
558-
]
559-
if platform.system() == 'Darwin':
560-
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
561-
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
562-
563-
build_with_cmake(args, cmake_flags, args.swift_driver_source_dir, args.swift_driver_build_dir)
564-
565-
def build_swift_crypto(args):
566-
note("Building SwiftCrypto")
567-
args.swift_crypto_build_dir = os.path.join(args.target_dir, "swift-crypto")
568-
569-
cmake_flags = []
570-
if platform.system() == 'Darwin':
571-
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
572-
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
539+
cmake_flags += non_darwin_cmake_flags
573540

574-
build_with_cmake(args, cmake_flags, args.swift_crypto_source_dir, args.swift_crypto_build_dir)
541+
build_with_cmake(args, cmake_flags, args.source_dirs[target_name], args.build_dirs[target_name])
575542

576543
def add_rpath_for_cmake_build(args, rpath):
577544
"Adds the given rpath to the CMake-built swift-build"
@@ -586,11 +553,11 @@ def build_swiftpm_with_cmake(args):
586553

587554
cmake_flags = [
588555
get_llbuild_cmake_arg(args),
589-
"-DTSC_DIR=" + os.path.join(args.tsc_build_dir, "cmake/modules"),
590-
"-DYams_DIR=" + os.path.join(args.yams_build_dir, "cmake/modules"),
591-
"-DArgumentParser_DIR=" + os.path.join(args.swift_argument_parser_build_dir, "cmake/modules"),
592-
"-DSwiftDriver_DIR=" + os.path.join(args.swift_driver_build_dir, "cmake/modules"),
593-
"-DSwiftCrypto_DIR=" + os.path.join(args.swift_crypto_build_dir, "cmake/modules"),
556+
"-DTSC_DIR=" + os.path.join(args.build_dirs["tsc"], "cmake/modules"),
557+
"-DYams_DIR=" + os.path.join(args.build_dirs["yams"], "cmake/modules"),
558+
"-DArgumentParser_DIR=" + os.path.join(args.build_dirs["swift-argument-parser"], "cmake/modules"),
559+
"-DSwiftDriver_DIR=" + os.path.join(args.build_dirs["swift-driver"], "cmake/modules"),
560+
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules"),
594561
]
595562

596563
if platform.system() == 'Darwin':
@@ -600,13 +567,13 @@ def build_swiftpm_with_cmake(args):
600567
build_with_cmake(args, cmake_flags, args.project_root, args.bootstrap_dir)
601568

602569
if args.llbuild_link_framework:
603-
add_rpath_for_cmake_build(args, args.llbuild_build_dir)
570+
add_rpath_for_cmake_build(args, args.build_dirs["llbuild"])
604571

605572
if platform.system() == "Darwin":
606-
add_rpath_for_cmake_build(args, os.path.join(args.yams_build_dir, "lib"))
607-
add_rpath_for_cmake_build(args, os.path.join(args.swift_argument_parser_build_dir, "lib"))
608-
add_rpath_for_cmake_build(args, os.path.join(args.swift_driver_build_dir, "lib"))
609-
add_rpath_for_cmake_build(args, os.path.join(args.swift_crypto_build_dir, "lib"))
573+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["yams"], "lib"))
574+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-argument-parser"], "lib"))
575+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-driver"], "lib"))
576+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-crypto"], "lib"))
610577

611578
def build_swiftpm_with_swiftpm(args, integrated_swift_driver):
612579
"""Builds SwiftPM using the version of SwiftPM built with CMake."""
@@ -671,9 +638,9 @@ def get_foundation_cmake_arg(args):
671638
def get_llbuild_cmake_arg(args):
672639
"""Returns the CMake argument to the LLBuild framework/binary to use for bulding SwiftPM."""
673640
if args.llbuild_link_framework:
674-
return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args.llbuild_build_dir
641+
return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args.build_dirs["llbuild"]
675642
else:
676-
llbuild_dir = os.path.join(args.llbuild_build_dir, "cmake/modules")
643+
llbuild_dir = os.path.join(args.build_dirs["llbuild"], "cmake/modules")
677644
return "-DLLBuild_DIR=" + llbuild_dir
678645

679646
def get_llbuild_source_path(args):
@@ -698,13 +665,13 @@ def get_swiftpm_env_cmd(args):
698665

699666
if args.bootstrap:
700667
libs_joined = ":".join([
701-
os.path.join(args.bootstrap_dir, "lib"),
702-
os.path.join(args.tsc_build_dir, "lib"),
703-
os.path.join(args.llbuild_build_dir, "lib"),
704-
os.path.join(args.yams_build_dir, "lib"),
705-
os.path.join(args.swift_argument_parser_build_dir, "lib"),
706-
os.path.join(args.swift_driver_build_dir, "lib"),
707-
os.path.join(args.swift_crypto_build_dir, "lib"),
668+
os.path.join(args.bootstrap_dir, "lib"),
669+
os.path.join(args.build_dirs["tsc"], "lib"),
670+
os.path.join(args.build_dirs["llbuild"], "lib"),
671+
os.path.join(args.build_dirs["yams"], "lib"),
672+
os.path.join(args.build_dirs["swift-argument-parser"], "lib"),
673+
os.path.join(args.build_dirs["swift-driver"], "lib"),
674+
os.path.join(args.build_dirs["swift-crypto"], "lib"),
708675
] + args.target_info["paths"]["runtimeLibraryPaths"])
709676

710677
if platform.system() == 'Darwin':
@@ -730,8 +697,8 @@ def get_swiftpm_flags(args):
730697

731698
if args.llbuild_link_framework:
732699
build_flags.extend([
733-
"-Xswiftc", "-F" + args.llbuild_build_dir,
734-
"-Xlinker", "-F" + args.llbuild_build_dir,
700+
"-Xswiftc", "-F" + args.build_dirs["llbuild"],
701+
"-Xlinker", "-F" + args.build_dirs["llbuild"],
735702

736703
# For LLBuild in Xcode.
737704
"-Xlinker", "-rpath",

0 commit comments

Comments
 (0)