Skip to content

Commit 19e4583

Browse files
[bootstrap] consolidate some build_... functions into build_dependency
This removes some repetition. Some functions such as `build_llbuild` and `build_swiftpm_with_cmake` are are not consolidated, because they're more different.
1 parent d1ad079 commit 19e4583

File tree

1 file changed

+64
-98
lines changed

1 file changed

+64
-98
lines changed

Utilities/bootstrap

Lines changed: 64 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,24 @@ def add_test_args(parser):
167167

168168
def parse_global_args(args):
169169
"""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")
170+
# Test if 'build_dirs' and 'source_dirs' exist, and initialise them only if not.
171+
# 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').
172+
try:
173+
args.build_dirs
174+
except AttributeError:
175+
args.build_dirs = {}
176+
try:
177+
args.source_dirs
178+
except AttributeError:
179+
args.source_dirs = {}
180+
args.build_dir = os.path.abspath(args.build_dir)
181+
args.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
182+
args.source_dirs["tsc"] = os.path.join(args.project_root, "..", "swift-tools-support-core")
183+
args.source_dirs["yams"] = os.path.join(args.project_root, "..", "yams")
184+
args.source_dirs["swift-argument-parser"] = os.path.join(args.project_root, "..", "swift-argument-parser")
185+
args.source_dirs["swift-driver"] = os.path.join(args.project_root, "..", "swift-driver")
186+
args.source_dirs["swift-crypto"] = os.path.join(args.project_root, "..", "swift-crypto")
187+
args.source_root = os.path.join(args.project_root, "Sources")
178188

179189
if platform.system() == 'Darwin':
180190
args.sysroot = call_output(["xcrun", "--sdk", "macosx", "--show-sdk-path"], verbose=args.verbose)
@@ -192,7 +202,7 @@ def parse_build_args(args):
192202
args.foundation_build_dir = os.path.abspath(args.foundation_build_dir)
193203

194204
if args.llbuild_build_dir:
195-
args.llbuild_build_dir = os.path.abspath(args.llbuild_build_dir)
205+
args.build_dirs["llbuild"] = os.path.abspath(args.llbuild_build_dir)
196206

197207
args.swiftc_path = get_swiftc_path(args)
198208
args.clang_path = get_clang_path(args)
@@ -313,15 +323,23 @@ def build(args):
313323
parse_build_args(args)
314324

315325
# Build llbuild if its build path is not passed in.
316-
if not args.llbuild_build_dir:
326+
if not "llbuild" in args.build_dirs:
317327
build_llbuild(args)
318328

319329
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)
330+
# tsc, swift-argument-parser, and yams are depended on by swift-driver, so they must be built first.
331+
build_dependency(args, "tsc")
332+
build_dependency(args, "swift-argument-parser", ["-DBUILD_TESTING=NO", "-DBUILD_EXAMPLES=NO"])
333+
build_dependency(args, "yams", [], [get_foundation_cmake_arg(args)] if args.foundation_build_dir else [])
334+
335+
swift_driver_cmake_flags = [
336+
get_llbuild_cmake_arg(args),
337+
"-DTSC_DIR=" + os.path.join(args.build_dirs["tsc"], "cmake/modules"),
338+
"-DYams_DIR=" + os.path.join(args.build_dirs["yams"], "cmake/modules"),
339+
"-DArgumentParser_DIR=" + os.path.join(args.build_dirs["swift-argument-parser"], "cmake/modules"),
340+
]
341+
build_dependency(args, "swift-driver", swift_driver_cmake_flags)
342+
build_dependency(args, "swift-crypto")
325343
build_swiftpm_with_cmake(args)
326344

327345
build_swiftpm_with_swiftpm(args,integrated_swift_driver=False)
@@ -486,9 +504,9 @@ def build_llbuild(args):
486504
note("Building llbuild")
487505

488506
# 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")
507+
args.build_dirs["llbuild"] = os.path.join(args.target_dir, "llbuild")
490508

491-
api_dir = os.path.join(args.llbuild_build_dir, ".cmake/api/v1/query")
509+
api_dir = os.path.join(args.build_dirs["llbuild"], ".cmake/api/v1/query")
492510
mkdir_p(api_dir)
493511
call(["touch", "codemodel-v2"], cwd=api_dir, verbose=args.verbose)
494512

@@ -505,73 +523,21 @@ def build_llbuild(args):
505523
if args.sysroot:
506524
flags.append("-DSQLite3_INCLUDE_DIR=%s/usr/include" % args.sysroot)
507525

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)
526+
args.source_dirs["llbuild"] = get_llbuild_source_path(args)
527+
build_with_cmake(args, flags, args.source_dirs["llbuild"], args.build_dirs["llbuild"])
534528

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

539-
cmake_flags = []
533+
cmake_flags = common_cmake_flags
540534
if platform.system() == 'Darwin':
541535
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
542536
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
543537
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)
538+
cmake_flags += non_darwin_cmake_flags
573539

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

576542
def add_rpath_for_cmake_build(args, rpath):
577543
"Adds the given rpath to the CMake-built swift-build"
@@ -586,11 +552,11 @@ def build_swiftpm_with_cmake(args):
586552

587553
cmake_flags = [
588554
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"),
555+
"-DTSC_DIR=" + os.path.join(args.build_dirs["tsc"], "cmake/modules"),
556+
"-DYams_DIR=" + os.path.join(args.build_dirs["yams"], "cmake/modules"),
557+
"-DArgumentParser_DIR=" + os.path.join(args.build_dirs["swift-argument-parser"], "cmake/modules"),
558+
"-DSwiftDriver_DIR=" + os.path.join(args.build_dirs["swift-driver"], "cmake/modules"),
559+
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules"),
594560
]
595561

596562
if platform.system() == 'Darwin':
@@ -600,13 +566,13 @@ def build_swiftpm_with_cmake(args):
600566
build_with_cmake(args, cmake_flags, args.project_root, args.bootstrap_dir)
601567

602568
if args.llbuild_link_framework:
603-
add_rpath_for_cmake_build(args, args.llbuild_build_dir)
569+
add_rpath_for_cmake_build(args, args.build_dirs["llbuild"])
604570

605571
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"))
572+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["yams"], "lib"))
573+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-argument-parser"], "lib"))
574+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-driver"], "lib"))
575+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-crypto"], "lib"))
610576

611577
def build_swiftpm_with_swiftpm(args, integrated_swift_driver):
612578
"""Builds SwiftPM using the version of SwiftPM built with CMake."""
@@ -671,9 +637,9 @@ def get_foundation_cmake_arg(args):
671637
def get_llbuild_cmake_arg(args):
672638
"""Returns the CMake argument to the LLBuild framework/binary to use for bulding SwiftPM."""
673639
if args.llbuild_link_framework:
674-
return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args.llbuild_build_dir
640+
return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args.build_dirs["llbuild"]
675641
else:
676-
llbuild_dir = os.path.join(args.llbuild_build_dir, "cmake/modules")
642+
llbuild_dir = os.path.join(args.build_dirs["llbuild"], "cmake/modules")
677643
return "-DLLBuild_DIR=" + llbuild_dir
678644

679645
def get_llbuild_source_path(args):
@@ -698,13 +664,13 @@ def get_swiftpm_env_cmd(args):
698664

699665
if args.bootstrap:
700666
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"),
667+
os.path.join(args.bootstrap_dir, "lib"),
668+
os.path.join(args.build_dirs["tsc"], "lib"),
669+
os.path.join(args.build_dirs["llbuild"], "lib"),
670+
os.path.join(args.build_dirs["yams"], "lib"),
671+
os.path.join(args.build_dirs["swift-argument-parser"], "lib"),
672+
os.path.join(args.build_dirs["swift-driver"], "lib"),
673+
os.path.join(args.build_dirs["swift-crypto"], "lib"),
708674
] + args.target_info["paths"]["runtimeLibraryPaths"])
709675

710676
if platform.system() == 'Darwin':
@@ -730,8 +696,8 @@ def get_swiftpm_flags(args):
730696

731697
if args.llbuild_link_framework:
732698
build_flags.extend([
733-
"-Xswiftc", "-F" + args.llbuild_build_dir,
734-
"-Xlinker", "-F" + args.llbuild_build_dir,
699+
"-Xswiftc", "-F" + args.build_dirs["llbuild"],
700+
"-Xlinker", "-F" + args.build_dirs["llbuild"],
735701

736702
# For LLBuild in Xcode.
737703
"-Xlinker", "-rpath",

0 commit comments

Comments
 (0)