From 046dd7e5aab929637bed2671a4408ba7b749be77 Mon Sep 17 00:00:00 2001 From: Dave Inglis Date: Wed, 12 Nov 2025 14:19:16 -0500 Subject: [PATCH 1/2] Set EXECUTABLE_PREFIX for shared libraries - use a build setting to set the missing "lib" prefix on platforms that should have one (all but windows) --- Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift b/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift index 60a2a177f73..59e6428021c 100644 --- a/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift +++ b/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift @@ -1032,6 +1032,11 @@ extension ProjectModel.BuildSettings { self[.PRODUCT_BUNDLE_IDENTIFIER] = "\(packageIdentity).\(productName)".spm_mangledToBundleIdentifier() self[.SWIFT_PACKAGE_NAME] = packageName ?? nil + //This should really be swift-build defaults set in the .xcspec files, but changing that requires some extensive testing to ensure xcode projects are not effected. + // So for now lets just force it here. + self[.EXECUTABLE_PREFIX] = "lib" + self[.EXECUTABLE_PREFIX, Platform.windows] = "" + if !createDylibForDynamicProducts { self[.GENERATE_INFOPLIST_FILE] = "YES" // If the built framework is named same as one of the target in the package, From e2d291f2b201959a800333a3979398ce2974d627 Mon Sep 17 00:00:00 2001 From: Bassam Khouri Date: Wed, 12 Nov 2025 16:12:30 -0500 Subject: [PATCH 2/2] Update build-using-self to pass global arguments to all SwiftPM commands --- Utilities/build-using-self | 91 ++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 18 deletions(-) diff --git a/Utilities/build-using-self b/Utilities/build-using-self index 0cf187e939f..afe748b2707 100755 --- a/Utilities/build-using-self +++ b/Utilities/build-using-self @@ -25,7 +25,6 @@ from datetime import datetime import typing as t from helpers import ( - Configuration, change_directory, call, call_output, @@ -71,10 +70,8 @@ def get_arguments() -> argparse.Namespace: parser.add_argument( "-c", "--configuration", - type=Configuration, + type=str, dest="config", - default=Configuration.DEBUG, - choices=[e for e in Configuration], help="The configuration to use.", ) parser.add_argument( @@ -89,6 +86,12 @@ def get_arguments() -> argparse.Namespace: type=str, dest="build_system", ) + parser.add_argument( + "--skip-clean", + action="store_false", + dest="should_clean", + help="When set, do not clean the build output" + ) parser.add_argument( "--additional-build-args", type=str, @@ -123,10 +126,12 @@ def log_environment() -> None: logging.info(" --> %s=%r", key, value) -def get_swiftpm_bin_dir(config: Configuration) -> pathlib.Path: +def get_swiftpm_bin_dir( + global_args: t.List[str], + ) -> pathlib.Path: logging.info("Retrieving Swift PM binary directory.") swiftpm_bin_dir = pathlib.Path( - call_output(["swift", "build", "--configuration", config, "--show-bin-path"]) + call_output(["swift", "build", *global_args, "--show-bin-path"]) ) logging.info("SwiftPM BIN DIR: %s", swiftpm_bin_dir) return swiftpm_bin_dir @@ -136,10 +141,7 @@ def is_on_darwin() -> bool: return platform.system() == "Darwin" -def set_environment( - *, - swiftpm_bin_dir: pathlib.Path, -) -> None: +def set_environment() -> None: os.environ["SWIFTCI_IS_SELF_HOSTED"] = "1" # Ensure SDKROOT is configure @@ -198,6 +200,7 @@ def main() -> None: globalArgsData = [ GlobalArgs(global_argument="--triple", value=args.triple), GlobalArgs(global_argument="--build-system", value=args.build_system), + GlobalArgs(global_argument="--configuration", value=args.config), ] global_args: t.Iterator[GlobalArgsValueType] = list( itertools.chain.from_iterable( @@ -207,8 +210,8 @@ def main() -> None: logging.debug("Global Args: %r", global_args) start_time = datetime.now() with change_directory(REPO_ROOT_PATH): - swiftpm_bin_dir = get_swiftpm_bin_dir(config=args.config) - set_environment(swiftpm_bin_dir=swiftpm_bin_dir) + swiftpm_bin_dir = get_swiftpm_bin_dir(global_args=global_args) + set_environment() call( filterIsTruthy( @@ -219,43 +222,95 @@ def main() -> None: ) ) + if args.should_clean: + call( + filterIsTruthy( + [ + "swift", + "package", + *global_args, + "clean", + ] + ) + ) + call( filterIsTruthy( [ "swift", "package", + *global_args, "update", ] ) ) + call( filterIsTruthy( [ "swift", "build", *global_args, - "--configuration", - args.config, *ignore_args, *args.additional_build_args.split(" ") ] ) ) + + manifest_pif_file = pathlib.Path(".build") / "manifest.pif" + logging.info("PIF manifest file %s contents are: ", manifest_pif_file) + logging.info("Contents are: \n %s", manifest_pif_file.read_text()) + + out_dir = call_output( + filterIsTruthy( + [ + "swift", + "build", + *global_args, + *ignore_args, + "--show-bin-path" + ] + ) + ) + logging.info("Build path directory : %s", out_dir) + logging.info("Listing files in directory: %s", out_dir) + for item in sorted(os.listdir(path=out_dir)): + logging.info(" -> %s", item) + + call( + filterIsTruthy( + [ + "swift", + "run", + *global_args, + *ignore_args, + "swift-build", + # swiftpm_bin_dir / "swift-build", + *global_args, + *ignore_args, + "--very-verbose", + "--force-resolved-versions", + "--scratch-path", + ".build-swb", + *args.additional_build_args.split(" ") + ] + ) + ) + call( filterIsTruthy( [ "swift", "run", + *global_args, *ignore_args, - *args.additional_run_args.split(" "), "swift-test", *global_args, - "--configuration", - args.config, + *ignore_args, + "--force-resolved-versions", "--parallel", "--scratch-path", ".test", - *ignore_args, *args.additional_test_args.split(" ") ] )