Skip to content

Commit c6545d7

Browse files
authored
Deduplicate shared configuration between swiftpm plugins (#184)
1 parent 82b5e60 commit c6545d7

File tree

35 files changed

+222
-267
lines changed

35 files changed

+222
-267
lines changed

.github/workflows/pull_request.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
2929
env:
3030
JAVA_HOME: "/usr/lib/jvm/default-jdk"
31+
SWIFT_JAVA_VERBOSE: true
3132
steps:
3233
- uses: actions/checkout@v4
3334
- name: Prepare CI Environment
@@ -53,6 +54,7 @@ jobs:
5354
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
5455
env:
5556
JAVA_HOME: "/usr/lib/jvm/default-jdk"
57+
SWIFT_JAVA_VERBOSE: true
5658
steps:
5759
- uses: actions/checkout@v4
5860
- name: Prepare CI Environment

.licenseignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ gradlew.bat
4141
**/gradlew.bat
4242
**/ci-validate.sh
4343
**/DO_NOT_EDIT.txt
44+
Plugins/**/_PluginsShared
45+
Plugins/**/0_PLEASE_SYMLINK*

Package.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ let package = Package(
128128

129129
// ==== Plugin for wrapping Java classes in Swift
130130
.plugin(
131-
name: "JExtractSwiftPlugin",
131+
name: "SwiftJavaPlugin",
132132
targets: [
133-
"JExtractSwiftPlugin"
133+
"SwiftJavaPlugin"
134134
]
135135
),
136136
.plugin(
@@ -174,7 +174,7 @@ let package = Package(
174174
.target(
175175
name: "JavaKit",
176176
dependencies: ["JavaRuntime", "JavaKitMacros", "JavaTypes"],
177-
exclude: ["Java2Swift.config"],
177+
exclude: ["swift-java.config"],
178178
swiftSettings: [
179179
.swiftLanguageMode(.v5),
180180
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -201,7 +201,7 @@ let package = Package(
201201
.target(
202202
name: "JavaKitCollection",
203203
dependencies: ["JavaKit"],
204-
exclude: ["Java2Swift.config"],
204+
exclude: ["swift-java.config"],
205205
swiftSettings: [
206206
.swiftLanguageMode(.v5),
207207
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -210,7 +210,7 @@ let package = Package(
210210
.target(
211211
name: "JavaKitFunction",
212212
dependencies: ["JavaKit"],
213-
exclude: ["Java2Swift.config"],
213+
exclude: ["swift-java.config"],
214214
swiftSettings: [
215215
.swiftLanguageMode(.v5),
216216
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -219,7 +219,7 @@ let package = Package(
219219
.target(
220220
name: "JavaKitJar",
221221
dependencies: ["JavaKit", "JavaKitCollection"],
222-
exclude: ["Java2Swift.config"],
222+
exclude: ["swift-java.config"],
223223
swiftSettings: [
224224
.swiftLanguageMode(.v5),
225225
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -228,7 +228,7 @@ let package = Package(
228228
.target(
229229
name: "JavaKitNetwork",
230230
dependencies: ["JavaKit", "JavaKitCollection"],
231-
exclude: ["Java2Swift.config"],
231+
exclude: ["swift-java.config"],
232232
swiftSettings: [
233233
.swiftLanguageMode(.v5),
234234
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -237,7 +237,7 @@ let package = Package(
237237
.target(
238238
name: "JavaKitReflection",
239239
dependencies: ["JavaKit", "JavaKitCollection"],
240-
exclude: ["Java2Swift.config"],
240+
exclude: ["swift-java.config"],
241241
swiftSettings: [
242242
.swiftLanguageMode(.v5),
243243
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -347,7 +347,7 @@ let package = Package(
347347
),
348348

349349
.plugin(
350-
name: "JExtractSwiftPlugin",
350+
name: "SwiftJavaPlugin",
351351
capability: .buildTool(),
352352
dependencies: [
353353
"JExtractSwiftTool"

Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ import Foundation
1616
import PackagePlugin
1717

1818
@main
19-
final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin {
19+
final class JExtractSwiftCommandPlugin: SwiftJavaPluginProtocol, BuildToolPlugin, CommandPlugin {
2020

21-
var verbose: Bool = false
21+
var pluginName: String = "swift-java-command"
22+
var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE")
2223

2324
/// Build the target before attempting to extract from it.
2425
/// This avoids trying to extract from broken sources.
@@ -48,8 +49,8 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin {
4849
}
4950

5051
for target in context.package.targets {
51-
guard let configPath = getSwiftJavaConfig(target: target) else {
52-
log("Skipping target '\(target.name)', has no 'swift-java.config' file")
52+
guard getSwiftJavaConfigPath(target: target) != nil else {
53+
log("[swift-java-command] Skipping jextract step: Missing swift-java.config for target '\(target.name)'")
5354
continue
5455
}
5556

@@ -73,21 +74,15 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin {
7374
let sourceDir = target.directory.string
7475

7576
let configuration = try readConfiguration(sourceDir: "\(sourceDir)")
76-
77-
// We use the the usual maven-style structure of "src/[generated|main|test]/java/..."
78-
// that is common in JVM ecosystem
79-
let outputDirectoryJava = context.pluginWorkDirectoryURL
80-
.appending(path: "src")
81-
.appending(path: "generated")
82-
.appending(path: "java")
83-
let outputDirectorySwift = context.pluginWorkDirectoryURL
84-
.appending(path: "Sources")
77+
guard let javaPackage = configuration.javaPackage else {
78+
throw SwiftJavaPluginError.missingConfiguration(sourceDir: "\(sourceDir)", key: "javaPackage")
79+
}
8580

8681
var arguments: [String] = [
8782
"--swift-module", sourceModule.name,
88-
"--package-name", configuration.javaPackage,
89-
"--output-directory-java", outputDirectoryJava.path(percentEncoded: false),
90-
"--output-directory-swift", outputDirectorySwift.path(percentEncoded: false),
83+
"--package-name", javaPackage,
84+
"--output-directory-java", context.outputDirectoryJava.path(percentEncoded: false),
85+
"--output-directory-swift", context.outputDirectorySwift.path(percentEncoded: false),
9186
// TODO: "--build-cache-directory", ...
9287
// Since plugins cannot depend on libraries we cannot detect what the output files will be,
9388
// as it depends on the contents of the input files. Therefore we have to implement this as a prebuild plugin.
@@ -100,14 +95,17 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin {
10095

10196
/// Perform the command on a specific target.
10297
func performCommand(context: PluginContext, target: Target, extraArguments _: [String]) throws {
103-
// Make sure the target can builds properly
104-
try self.packageManager.build(.target(target.name), parameters: .init())
105-
10698
guard let sourceModule = target.sourceModule else { return }
10799

108100
if self.buildInputs {
101+
// Make sure the target can builds properly
109102
log("Pre-building target '\(target.name)' before extracting sources...")
110-
try self.packageManager.build(.target(target.name), parameters: .init())
103+
let targetBuildResult = try self.packageManager.build(.target(target.name), parameters: .init())
104+
105+
guard targetBuildResult.succeeded else {
106+
print("[swift-java-command] Build of '\(target.name)' failed: \(targetBuildResult.logText)")
107+
return
108+
}
111109
}
112110

113111
let arguments = try prepareJExtractArguments(context: context, target: target)
@@ -124,7 +122,13 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin {
124122
log("Post-extract building products with target '\(target.name)'...")
125123
for product in context.package.products where product.targets.contains(where: { $0.id == target.id }) {
126124
log("Post-extract building product '\(product.name)'...")
127-
try self.packageManager.build(.product(product.name), parameters: .init())
125+
let buildResult = try self.packageManager.build(.product(product.name), parameters: .init())
126+
127+
if buildResult.succeeded {
128+
log("Post-extract build: " + "done".green + ".")
129+
} else {
130+
log("Post-extract build: " + "done".red + "!")
131+
}
128132
}
129133
}
130134
}
@@ -146,16 +150,15 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin {
146150
}
147151
}
148152

149-
func log(_ message: @autoclosure () -> String, terminator: String = "\n") {
150-
if self.verbose {
151-
print("[swift-java-command] \(message())", terminator: terminator)
152-
}
153-
}
154153
}
155154

156155
// Mini coloring helper, since we cannot have dependencies we keep it minimal here
157156
extension String {
157+
var red: String {
158+
"\u{001B}[0;31m" + "\(self)" + "\u{001B}[0;0m"
159+
}
158160
var green: String {
159161
"\u{001B}[0;32m" + "\(self)" + "\u{001B}[0;0m"
160162
}
161-
}
163+
}
164+

Plugins/JExtractSwiftCommandPlugin/PluginsShared/Configuration.swift

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../PluginsShared

Plugins/JExtractSwiftPlugin/PluginsShared/Configuration.swift

Lines changed: 0 additions & 36 deletions
This file was deleted.

Plugins/JExtractSwiftPlugin/PluginsShared/PluginUtils.swift

Lines changed: 0 additions & 37 deletions
This file was deleted.

Plugins/Java2SwiftPlugin/Configuration.swift

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)