@@ -169,14 +169,16 @@ def add_test_args(parser):
169169
170170def parse_global_args (args ):
171171 """Parses and cleans arguments necessary for all actions."""
172- args .build_dir = os .path .abspath (args .build_dir )
173- args .project_root = os .path .dirname (os .path .dirname (os .path .abspath (__file__ )))
174- args .tsc_source_dir = os .path .join (args .project_root , ".." , "swift-tools-support-core" )
175- args .yams_source_dir = os .path .join (args .project_root , ".." , "yams" )
176- args .swift_argument_parser_source_dir = os .path .join (args .project_root , ".." , "swift-argument-parser" )
177- args .swift_driver_source_dir = os .path .join (args .project_root , ".." , "swift-driver" )
178- args .swift_crypto_source_dir = os .path .join (args .project_root , ".." , "swift-crypto" )
179- args .source_root = os .path .join (args .project_root , "Sources" )
172+ args .build_dir = os .path .abspath (args .build_dir )
173+ args .build_dirs = {}
174+ args .project_root = os .path .dirname (os .path .dirname (os .path .abspath (__file__ )))
175+ args .source_dirs = {}
176+ args .source_dirs ["tsc" ] = os .path .join (args .project_root , ".." , "swift-tools-support-core" )
177+ args .source_dirs ["yams" ] = os .path .join (args .project_root , ".." , "yams" )
178+ args .source_dirs ["swift-argument-parser" ] = os .path .join (args .project_root , ".." , "swift-argument-parser" )
179+ args .source_dirs ["swift-driver" ] = os .path .join (args .project_root , ".." , "swift-driver" )
180+ args .source_dirs ["swift-crypto" ] = os .path .join (args .project_root , ".." , "swift-crypto" )
181+ args .source_root = os .path .join (args .project_root , "Sources" )
180182
181183 if platform .system () == 'Darwin' :
182184 args .sysroot = call_output (["xcrun" , "--sdk" , "macosx" , "--show-sdk-path" ], verbose = args .verbose )
@@ -193,8 +195,8 @@ def parse_build_args(args):
193195 if args .foundation_build_dir :
194196 args .foundation_build_dir = os .path .abspath (args .foundation_build_dir )
195197
196- if args .llbuild_build_dir :
197- args .llbuild_build_dir = os .path .abspath (args .llbuild_build_dir )
198+ if "llbuild" in args .build_dirs :
199+ args .build_dirs [ "llbuild" ] = os .path .abspath (args .build_dirs [ "llbuild" ] )
198200
199201 args .swiftc_path = get_swiftc_path (args )
200202 args .clang_path = get_clang_path (args )
@@ -315,15 +317,23 @@ def build(args):
315317 parse_build_args (args )
316318
317319 # Build llbuild if its build path is not passed in.
318- if not args .llbuild_build_dir :
320+ if not "llbuild" in args .build_dirs :
319321 build_llbuild (args )
320322
321323 if args .bootstrap :
322- build_tsc (args )
323- build_yams (args )
324- build_swift_argument_parser (args )
325- build_swift_driver (args )
326- build_swift_crypto (args )
324+ # tsc, swift-argument-parser, and yams are depended on by swift-driver, so they must be built first.
325+ build_dependency (args , "tsc" )
326+ build_dependency (args , "swift-argument-parser" , ["-DBUILD_TESTING=NO" , "-DBUILD_EXAMPLES=NO" ])
327+ build_dependency (args , "yams" , [], [get_foundation_cmake_arg (args )] if args .foundation_build_dir else [])
328+
329+ swift_driver_cmake_flags = [
330+ get_llbuild_cmake_arg (args ),
331+ "-DTSC_DIR=" + os .path .join (args .build_dirs ["tsc" ], "cmake/modules" ),
332+ "-DYams_DIR=" + os .path .join (args .build_dirs ["yams" ], "cmake/modules" ),
333+ "-DArgumentParser_DIR=" + os .path .join (args .build_dirs ["swift-argument-parser" ], "cmake/modules" ),
334+ ]
335+ build_dependency (args , "swift-driver" , swift_driver_cmake_flags )
336+ build_dependency (args , "swift-crypto" )
327337 build_swiftpm_with_cmake (args )
328338
329339 build_swiftpm_with_swiftpm (args ,integrated_swift_driver = False )
@@ -517,9 +527,9 @@ def build_llbuild(args):
517527 note ("Building llbuild" )
518528
519529 # Set where we are going to build llbuild for future steps to find it
520- args .llbuild_build_dir = os .path .join (args .target_dir , "llbuild" )
530+ args .build_dirs [ "llbuild" ] = os .path .join (args .target_dir , "llbuild" )
521531
522- api_dir = os .path .join (args .llbuild_build_dir , ".cmake/api/v1/query" )
532+ api_dir = os .path .join (args .build_dirs [ "llbuild" ] , ".cmake/api/v1/query" )
523533 mkdir_p (api_dir )
524534 call (["touch" , "codemodel-v2" ], cwd = api_dir , verbose = args .verbose )
525535
@@ -536,73 +546,21 @@ def build_llbuild(args):
536546 if args .sysroot :
537547 flags .append ("-DSQLite3_INCLUDE_DIR=%s/usr/include" % args .sysroot )
538548
539- llbuild_source_dir = get_llbuild_source_path (args )
540- build_with_cmake (args , flags , llbuild_source_dir , args .llbuild_build_dir )
541-
542- def build_tsc (args ):
543- note ("Building TSC" )
544- args .tsc_build_dir = os .path .join (args .target_dir , "tsc" )
545-
546- cmake_flags = []
547- if platform .system () == 'Darwin' :
548- cmake_flags .append ("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target (args ), g_macos_deployment_target ))
549- cmake_flags .append ("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target )
550-
551- build_with_cmake (args , cmake_flags , args .tsc_source_dir , args .tsc_build_dir )
549+ args .source_dirs ["llbuild" ] = get_llbuild_source_path (args )
550+ build_with_cmake (args , flags , args .source_dirs ["llbuild" ], args .build_dirs ["llbuild" ])
552551
553- def build_swift_argument_parser (args ):
554- note ("Building swift-argument-parser" )
555- args .swift_argument_parser_build_dir = os .path .join (args .target_dir , "swift-argument-parser" )
552+ def build_dependency (args , target_name , common_cmake_flags = [], non_darwin_cmake_flags = [] ):
553+ note ("Building " + target_name )
554+ args .build_dirs [ target_name ] = os .path .join (args .target_dir , target_name )
556555
557- cmake_flags = []
558- if platform .system () == 'Darwin' :
559- cmake_flags .append ("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target (args ), g_macos_deployment_target ))
560- cmake_flags .append ("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target )
561-
562- cmake_flags .append ("-DBUILD_TESTING=NO" )
563- cmake_flags .append ("-DBUILD_EXAMPLES=NO" )
564- build_with_cmake (args , cmake_flags , args .swift_argument_parser_source_dir , args .swift_argument_parser_build_dir )
565-
566- def build_yams (args ):
567- note ("Building Yams" )
568- args .yams_build_dir = os .path .join (args .target_dir , "yams" )
569-
570- cmake_flags = []
556+ cmake_flags = common_cmake_flags
571557 if platform .system () == 'Darwin' :
572558 cmake_flags .append ("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target (args ), g_macos_deployment_target ))
573559 cmake_flags .append ("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target )
574560 else :
575- if args .foundation_build_dir :
576- cmake_flags .append (get_foundation_cmake_arg (args ))
577-
578- build_with_cmake (args , cmake_flags , args .yams_source_dir , args .yams_build_dir )
579-
580- def build_swift_driver (args ):
581- note ("Building SwiftDriver" )
582- args .swift_driver_build_dir = os .path .join (args .target_dir , "swift-driver" )
583-
584- cmake_flags = [
585- get_llbuild_cmake_arg (args ),
586- "-DTSC_DIR=" + os .path .join (args .tsc_build_dir , "cmake/modules" ),
587- "-DYams_DIR=" + os .path .join (args .yams_build_dir , "cmake/modules" ),
588- "-DArgumentParser_DIR=" + os .path .join (args .swift_argument_parser_build_dir , "cmake/modules" ),
589- ]
590- if platform .system () == 'Darwin' :
591- cmake_flags .append ("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target (args ), g_macos_deployment_target ))
592- cmake_flags .append ("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target )
593-
594- build_with_cmake (args , cmake_flags , args .swift_driver_source_dir , args .swift_driver_build_dir )
595-
596- def build_swift_crypto (args ):
597- note ("Building SwiftCrypto" )
598- args .swift_crypto_build_dir = os .path .join (args .target_dir , "swift-crypto" )
599-
600- cmake_flags = []
601- if platform .system () == 'Darwin' :
602- cmake_flags .append ("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target (args ), g_macos_deployment_target ))
603- cmake_flags .append ("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target )
561+ cmake_flags += non_darwin_cmake_flags
604562
605- build_with_cmake (args , cmake_flags , args .swift_crypto_source_dir , args .swift_crypto_build_dir )
563+ build_with_cmake (args , cmake_flags , args .source_dirs [ target_name ] , args .build_dirs [ target_name ] )
606564
607565def add_rpath_for_cmake_build (args , rpath ):
608566 "Adds the given rpath to the CMake-built swift-build"
@@ -617,11 +575,11 @@ def build_swiftpm_with_cmake(args):
617575
618576 cmake_flags = [
619577 get_llbuild_cmake_arg (args ),
620- "-DTSC_DIR=" + os .path .join (args .tsc_build_dir , "cmake/modules" ),
621- "-DYams_DIR=" + os .path .join (args .yams_build_dir , "cmake/modules" ),
622- "-DArgumentParser_DIR=" + os .path .join (args .swift_argument_parser_build_dir , "cmake/modules" ),
623- "-DSwiftDriver_DIR=" + os .path .join (args .swift_driver_build_dir , "cmake/modules" ),
624- "-DSwiftCrypto_DIR=" + os .path .join (args .swift_crypto_build_dir , "cmake/modules" ),
578+ "-DTSC_DIR=" + os .path .join (args .build_dirs [ "tsc" ], "cmake/modules" ),
579+ "-DYams_DIR=" + os .path .join (args .build_dirs [ "yams" ], "cmake/modules" ),
580+ "-DArgumentParser_DIR=" + os .path .join (args .build_dirs [ "swift-argument-parser" ] , "cmake/modules" ),
581+ "-DSwiftDriver_DIR=" + os .path .join (args .build_dirs [ "swift-driver" ], "cmake/modules" ),
582+ "-DSwiftCrypto_DIR=" + os .path .join (args .build_dirs [ "swift-crypto" ], "cmake/modules" ),
625583 ]
626584
627585 if platform .system () == 'Darwin' :
@@ -631,13 +589,13 @@ def build_swiftpm_with_cmake(args):
631589 build_with_cmake (args , cmake_flags , args .project_root , args .bootstrap_dir )
632590
633591 if args .llbuild_link_framework :
634- add_rpath_for_cmake_build (args , args .llbuild_build_dir )
592+ add_rpath_for_cmake_build (args , args .build_dirs [ "llbuild" ] )
635593
636594 if platform .system () == "Darwin" :
637- add_rpath_for_cmake_build (args , os .path .join (args .yams_build_dir , "lib" ))
638- add_rpath_for_cmake_build (args , os .path .join (args .swift_argument_parser_build_dir , "lib" ))
639- add_rpath_for_cmake_build (args , os .path .join (args .swift_driver_build_dir , "lib" ))
640- add_rpath_for_cmake_build (args , os .path .join (args .swift_crypto_build_dir , "lib" ))
595+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "yams" ], "lib" ))
596+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "swift-argument-parser" ] , "lib" ))
597+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "swift-driver" ], "lib" ))
598+ add_rpath_for_cmake_build (args , os .path .join (args .build_dirs [ "swift-crypto" ], "lib" ))
641599
642600def build_swiftpm_with_swiftpm (args , integrated_swift_driver ):
643601 """Builds SwiftPM using the version of SwiftPM built with CMake."""
@@ -702,9 +660,9 @@ def get_foundation_cmake_arg(args):
702660def get_llbuild_cmake_arg (args ):
703661 """Returns the CMake argument to the LLBuild framework/binary to use for bulding SwiftPM."""
704662 if args .llbuild_link_framework :
705- return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args .llbuild_build_dir
663+ return "-DCMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS=%s" % args .build_dirs [ "llbuild" ]
706664 else :
707- llbuild_dir = os .path .join (args .llbuild_build_dir , "cmake/modules" )
665+ llbuild_dir = os .path .join (args .build_dirs [ "llbuild" ] , "cmake/modules" )
708666 return "-DLLBuild_DIR=" + llbuild_dir
709667
710668def get_llbuild_source_path (args ):
@@ -729,13 +687,13 @@ def get_swiftpm_env_cmd(args):
729687
730688 if args .bootstrap :
731689 libs_joined = ":" .join ([
732- os .path .join (args .bootstrap_dir , "lib" ),
733- os .path .join (args .tsc_build_dir , "lib" ),
734- os .path .join (args .llbuild_build_dir , "lib" ),
735- os .path .join (args .yams_build_dir , "lib" ),
736- os .path .join (args .swift_argument_parser_build_dir , "lib" ),
737- os .path .join (args .swift_driver_build_dir , "lib" ),
738- os .path .join (args .swift_crypto_build_dir , "lib" ),
690+ os .path .join (args .bootstrap_dir , "lib" ),
691+ os .path .join (args .build_dirs [ "tsc" ], "lib" ),
692+ os .path .join (args .build_dirs [ "llbuild" ], "lib" ),
693+ os .path .join (args .build_dirs [ "yams" ], "lib" ),
694+ os .path .join (args .build_dirs [ "swift-argument-parser" ] , "lib" ),
695+ os .path .join (args .build_dirs [ "swift-driver" ], "lib" ),
696+ os .path .join (args .build_dirs [ "swift-crypto" ], "lib" ),
739697 ] + args .target_info ["paths" ]["runtimeLibraryPaths" ])
740698
741699 if platform .system () == 'Darwin' :
@@ -761,8 +719,8 @@ def get_swiftpm_flags(args):
761719
762720 if args .llbuild_link_framework :
763721 build_flags .extend ([
764- "-Xswiftc" , "-F" + args .llbuild_build_dir ,
765- "-Xlinker" , "-F" + args .llbuild_build_dir ,
722+ "-Xswiftc" , "-F" + args .build_dirs [ "llbuild" ] ,
723+ "-Xlinker" , "-F" + args .build_dirs [ "llbuild" ] ,
766724
767725 # For LLBuild in Xcode.
768726 "-Xlinker" , "-rpath" ,
0 commit comments