@@ -167,14 +167,16 @@ def add_test_args(parser):
167167
168168def 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+ args .build_dir = os .path .abspath (args .build_dir )
171+ args .build_dirs = {}
172+ args .project_root = os .path .dirname (os .path .dirname (os .path .abspath (__file__ )))
173+ args .source_dirs = {}
174+ args .source_dirs ["tsc" ] = os .path .join (args .project_root , ".." , "swift-tools-support-core" )
175+ args .source_dirs ["yams" ] = os .path .join (args .project_root , ".." , "yams" )
176+ args .source_dirs ["swift-argument-parser" ] = os .path .join (args .project_root , ".." , "swift-argument-parser" )
177+ args .source_dirs ["swift-driver" ] = os .path .join (args .project_root , ".." , "swift-driver" )
178+ args .source_dirs ["swift-crypto" ] = os .path .join (args .project_root , ".." , "swift-crypto" )
179+ args .source_root = os .path .join (args .project_root , "Sources" )
178180
179181 if platform .system () == 'Darwin' :
180182 args .sysroot = call_output (["xcrun" , "--sdk" , "macosx" , "--show-sdk-path" ], verbose = args .verbose )
@@ -192,7 +194,7 @@ def parse_build_args(args):
192194 args .foundation_build_dir = os .path .abspath (args .foundation_build_dir )
193195
194196 if args .llbuild_build_dir :
195- args .llbuild_build_dir = os .path .abspath (args .llbuild_build_dir )
197+ args .build_dirs [ "llbuild" ] = os .path .abspath (args .llbuild_build_dir )
196198
197199 args .swiftc_path = get_swiftc_path (args )
198200 args .clang_path = get_clang_path (args )
@@ -313,15 +315,23 @@ def build(args):
313315 parse_build_args (args )
314316
315317 # Build llbuild if its build path is not passed in.
316- if not args .llbuild_build_dir :
318+ if not "llbuild" in args .build_dirs :
317319 build_llbuild (args )
318320
319321 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 )
322+ # tsc, swift-argument-parser, and yams are depended on by swift-driver, so they must be built first.
323+ build_dependency (args , "tsc" )
324+ build_dependency (args , "swift-argument-parser" , ["-DBUILD_TESTING=NO" , "-DBUILD_EXAMPLES=NO" ])
325+ build_dependency (args , "yams" , [], [get_foundation_cmake_arg (args )] if args .foundation_build_dir else [])
326+
327+ swift_driver_cmake_flags = [
328+ get_llbuild_cmake_arg (args ),
329+ "-DTSC_DIR=" + os .path .join (args .build_dirs ["tsc" ], "cmake/modules" ),
330+ "-DYams_DIR=" + os .path .join (args .build_dirs ["yams" ], "cmake/modules" ),
331+ "-DArgumentParser_DIR=" + os .path .join (args .build_dirs ["swift-argument-parser" ], "cmake/modules" ),
332+ ]
333+ build_dependency (args , "swift-driver" , swift_driver_cmake_flags )
334+ build_dependency (args , "swift-crypto" )
325335 build_swiftpm_with_cmake (args )
326336
327337 build_swiftpm_with_swiftpm (args ,integrated_swift_driver = False )
@@ -486,9 +496,9 @@ def build_llbuild(args):
486496 note ("Building llbuild" )
487497
488498 # 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" )
499+ args .build_dirs [ "llbuild" ] = os .path .join (args .target_dir , "llbuild" )
490500
491- api_dir = os .path .join (args .llbuild_build_dir , ".cmake/api/v1/query" )
501+ api_dir = os .path .join (args .build_dirs [ "llbuild" ] , ".cmake/api/v1/query" )
492502 mkdir_p (api_dir )
493503 call (["touch" , "codemodel-v2" ], cwd = api_dir , verbose = args .verbose )
494504
@@ -505,73 +515,21 @@ def build_llbuild(args):
505515 if args .sysroot :
506516 flags .append ("-DSQLite3_INCLUDE_DIR=%s/usr/include" % args .sysroot )
507517
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 )
518+ args .source_dirs ["llbuild" ] = get_llbuild_source_path (args )
519+ build_with_cmake (args , flags , args .source_dirs ["llbuild" ], args .build_dirs ["llbuild" ])
521520
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" )
521+ def build_dependency (args , target_name , common_cmake_flags = [], non_darwin_cmake_flags = [] ):
522+ note ("Building " + target_name )
523+ args .build_dirs [ target_name ] = os .path .join (args .target_dir , target_name )
525524
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 )
534-
535- def build_yams (args ):
536- note ("Building Yams" )
537- args .yams_build_dir = os .path .join (args .target_dir , "yams" )
538-
539- cmake_flags = []
525+ cmake_flags = common_cmake_flags
540526 if platform .system () == 'Darwin' :
541527 cmake_flags .append ("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target (args ), g_macos_deployment_target ))
542528 cmake_flags .append ("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target )
543529 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 )
530+ cmake_flags += non_darwin_cmake_flags
573531
574- build_with_cmake (args , cmake_flags , args .swift_crypto_source_dir , args .swift_crypto_build_dir )
532+ build_with_cmake (args , cmake_flags , args .source_dirs [ target_name ] , args .build_dirs [ target_name ] )
575533
576534def add_rpath_for_cmake_build (args , rpath ):
577535 "Adds the given rpath to the CMake-built swift-build"
@@ -586,11 +544,11 @@ def build_swiftpm_with_cmake(args):
586544
587545 cmake_flags = [
588546 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" ),
547+ "-DTSC_DIR=" + os .path .join (args .build_dirs [ "tsc" ], "cmake/modules" ),
548+ "-DYams_DIR=" + os .path .join (args .build_dirs [ "yams" ], "cmake/modules" ),
549+ "-DArgumentParser_DIR=" + os .path .join (args .build_dirs [ "swift-argument-parser" ] , "cmake/modules" ),
550+ "-DSwiftDriver_DIR=" + os .path .join (args .build_dirs [ "swift-driver" ], "cmake/modules" ),
551+ "-DSwiftCrypto_DIR=" + os .path .join (args .build_dirs [ "swift-crypto" ], "cmake/modules" ),
594552 ]
595553
596554 if platform .system () == 'Darwin' :
@@ -600,13 +558,13 @@ def build_swiftpm_with_cmake(args):
600558 build_with_cmake (args , cmake_flags , args .project_root , args .bootstrap_dir )
601559
602560 if args .llbuild_link_framework :
603- add_rpath_for_cmake_build (args , args .llbuild_build_dir )
561+ add_rpath_for_cmake_build (args , args .build_dirs [ "llbuild" ] )
604562
605563 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" ))
564+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "yams" ], "lib" ))
565+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "swift-argument-parser" ] , "lib" ))
566+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "swift-driver" ], "lib" ))
567+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "swift-crypto" ], "lib" ))
610568
611569def build_swiftpm_with_swiftpm (args , integrated_swift_driver ):
612570 """Builds SwiftPM using the version of SwiftPM built with CMake."""
@@ -671,9 +629,9 @@ def get_foundation_cmake_arg(args):
671629def get_llbuild_cmake_arg (args ):
672630 """Returns the CMake argument to the LLBuild framework/binary to use for bulding SwiftPM."""
673631 if args .llbuild_link_framework :
674- return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args .llbuild_build_dir
632+ return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args .build_dirs [ "llbuild" ]
675633 else :
676- llbuild_dir = os .path .join (args .llbuild_build_dir , "cmake/modules" )
634+ llbuild_dir = os .path .join (args .build_dirs [ "llbuild" ] , "cmake/modules" )
677635 return "-DLLBuild_DIR=" + llbuild_dir
678636
679637def get_llbuild_source_path (args ):
@@ -698,13 +656,13 @@ def get_swiftpm_env_cmd(args):
698656
699657 if args .bootstrap :
700658 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" ),
659+ os .path .join (args .bootstrap_dir , "lib" ),
660+ os .path .join (args .build_dirs [ "tsc" ], "lib" ),
661+ os .path .join (args .build_dirs [ "llbuild" ], "lib" ),
662+ os .path .join (args .build_dirs [ "yams" ], "lib" ),
663+ os .path .join (args .build_dirs [ "swift-argument-parser" ] , "lib" ),
664+ os .path .join (args .build_dirs [ "swift-driver" ], "lib" ),
665+ os .path .join (args .build_dirs [ "swift-crypto" ], "lib" ),
708666 ] + args .target_info ["paths" ]["runtimeLibraryPaths" ])
709667
710668 if platform .system () == 'Darwin' :
@@ -730,8 +688,8 @@ def get_swiftpm_flags(args):
730688
731689 if args .llbuild_link_framework :
732690 build_flags .extend ([
733- "-Xswiftc" , "-F" + args .llbuild_build_dir ,
734- "-Xlinker" , "-F" + args .llbuild_build_dir ,
691+ "-Xswiftc" , "-F" + args .build_dirs [ "llbuild" ] ,
692+ "-Xlinker" , "-F" + args .build_dirs [ "llbuild" ] ,
735693
736694 # For LLBuild in Xcode.
737695 "-Xlinker" , "-rpath" ,
0 commit comments