Skip to content

Commit d737a25

Browse files
committed
builders
1 parent 72ec7a9 commit d737a25

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

src/builder.ts

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,43 @@ export type BuildMode = "release" | "debug";
1414

1515
export type ConfigFlags = string | string[];
1616

17-
export interface XcodeConfig {
18-
destinations?: string[]
17+
export interface SwiftPMBuilder {
18+
type?: "swiftpm"
19+
// flags passed directly to `swift build`
20+
settings?: ConfigFlags
21+
// --triple flag
22+
// warning: cross-compilation triples break macros as of Swift 5.9
23+
triple?: string
24+
}
25+
26+
export interface XcodeBuilder {
27+
type: "xcode"
28+
// flags passed directly to `xcodebuild`
1929
settings?: ConfigFlags
30+
// -destination parameters
31+
destinations?: string[]
2032
}
2133

34+
export type Builder = SwiftPMBuilder | XcodeBuilder;
35+
2236
export interface Config {
2337
buildPath?: string
2438
packagePath?: string
2539
product?: string
2640

27-
triple?: string
2841
napi?: number | "experimental"
2942

3043
static?: boolean
3144

32-
spmFlags?: ConfigFlags
3345
cFlags?: ConfigFlags
3446
swiftFlags?: ConfigFlags
3547
cxxFlags?: ConfigFlags
3648
linkerFlags?: ConfigFlags
3749

38-
// if truthy, build using xcodebuild instead of swift-build
39-
xcode?: boolean | XcodeConfig
50+
// flags passed to `swift package dump-package`
51+
dumpFlags?: ConfigFlags
52+
53+
builder?: Builder | Builder["type"]
4054
}
4155

4256
export async function clean(config: Config = {}) {
@@ -74,7 +88,7 @@ function getFlags<C>(config: C, name: keyof C & string): string[] {
7488
}
7589

7690
export async function build(mode: BuildMode, config: Config = {}): Promise<string> {
77-
let spmFlags = getFlags(config, "spmFlags");
91+
let dumpFlags = getFlags(config, "dumpFlags");
7892
let cFlags = getFlags(config, "cFlags");
7993
let swiftFlags = getFlags(config, "swiftFlags");
8094
let cxxFlags = getFlags(config, "cxxFlags");
@@ -102,12 +116,6 @@ export async function build(mode: BuildMode, config: Config = {}): Promise<strin
102116

103117
let napi = config.napi;
104118

105-
if (typeof config.triple === "string") {
106-
spmFlags.push("--triple", config.triple);
107-
} else if (typeof config.triple !== "undefined") {
108-
throw new Error("Invalid value for triple option.");
109-
}
110-
111119
if (typeof napi === "number") {
112120
cFlags.push(`-DNAPI_VERSION=${napi}`);
113121
swiftFlags.push("-DNAPI_VERSIONED");
@@ -136,7 +144,7 @@ export async function build(mode: BuildMode, config: Config = {}): Promise<strin
136144
"package",
137145
"dump-package",
138146
"--package-path", packagePath,
139-
...spmFlags.filter(f => f !== "-v"),
147+
...dumpFlags,
140148
...nonSPMFlags,
141149
],
142150
{ stdio: ["inherit", "pipe", "inherit"] }
@@ -217,8 +225,8 @@ export async function build(mode: BuildMode, config: Config = {}): Promise<strin
217225

218226
const realBinaryPath = path.join(buildDir, mode, `${product}.node`);
219227
const binaryPath = path.join(buildDir, `${product}.node`);
220-
if (config.xcode) {
221-
const xcode = typeof config.xcode === "object" ? config.xcode : {};
228+
if (config.builder === "xcode" || (typeof config.builder === "object" && config.builder.type === "xcode")) {
229+
const xcode = typeof config.builder === "object" ? config.builder : ({ type: "xcode" } as XcodeBuilder);
222230
const settings = getFlags(xcode, "settings");
223231
const destinations = xcode.destinations || ["generic/platform=macOS"];
224232
const derivedDataPath = path.join(buildDir, "DerivedData");
@@ -258,6 +266,11 @@ export async function build(mode: BuildMode, config: Config = {}): Promise<strin
258266
{ recursive: true, force: true }
259267
);
260268
} else {
269+
const swiftPM = typeof config.builder === "object" ? config.builder : {};
270+
const swiftPMFlags = getFlags(swiftPM, "settings");
271+
if (typeof swiftPM.triple === "string") {
272+
swiftPMFlags.push("--triple", swiftPM.triple);
273+
}
261274
const result = spawnSync(
262275
"swift",
263276
[
@@ -267,7 +280,7 @@ export async function build(mode: BuildMode, config: Config = {}): Promise<strin
267280
"--build-path", buildDir,
268281
"--package-path", packagePath,
269282
...ldflags,
270-
...spmFlags,
283+
...swiftPMFlags,
271284
...nonSPMFlags,
272285
],
273286
{

0 commit comments

Comments
 (0)