From 76179dd4bfaf19c78d8606de9fb1b7b7579fc81f Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Tue, 19 Nov 2024 17:13:01 +0900 Subject: [PATCH 1/6] Deduplicate shared configuration between swiftpm plugins wip --- .licenseignore | 1 + Package.swift | 6 +- .../JExtractSwiftCommandPlugin.swift | 57 ++++++++++--------- .../PluginsShared/Configuration.swift | 36 ------------ .../JExtractSwiftCommandPlugin/_PluginsShared | 1 + .../PluginsShared/Configuration.swift | 36 ------------ .../PluginsShared/PluginUtils.swift | 37 ------------ Plugins/Java2SwiftPlugin/Configuration.swift | 36 ------------ .../Java2SwiftPlugin/Java2SwiftPlugin.swift | 42 ++++++-------- Plugins/Java2SwiftPlugin/_PluginsShared | 1 + .../JavaCompilerPlugin.swift | 22 ------- Plugins/JavaCompilerPlugin/_PluginsShared | 1 + Plugins/PluginsShared/0_PLEASE_SYMLINK.txt | 3 + .../Configuration.swift | 42 ++++++++++++-- .../PluginsShared/PluginUtils.swift | 38 +++++++++++-- .../SwiftJavaPlugin+Errors.swift | 17 ++++++ .../SwiftJavaPluginProtocol.swift | 28 +++++++++ .../JExtractSwiftPlugin.swift | 47 ++++++++------- Plugins/SwiftJavaPlugin/_PluginsShared | 1 + Samples/JavaKitSampleApp/Package.swift | 2 +- .../{Java2Swift.config => swift-java.config} | 0 .../SwiftAndJavaJarSampleLib/Package.swift | 2 +- Samples/SwiftKitSampleApp/Package.swift | 2 +- swift-java-plugin/build.gradle.kts | 38 +++++++++++++ .../swiftjava/gradle/SwiftJavaPlugin.kts | 13 +++++ 25 files changed, 252 insertions(+), 257 deletions(-) delete mode 100644 Plugins/JExtractSwiftCommandPlugin/PluginsShared/Configuration.swift create mode 120000 Plugins/JExtractSwiftCommandPlugin/_PluginsShared delete mode 100644 Plugins/JExtractSwiftPlugin/PluginsShared/Configuration.swift delete mode 100644 Plugins/JExtractSwiftPlugin/PluginsShared/PluginUtils.swift delete mode 100644 Plugins/Java2SwiftPlugin/Configuration.swift create mode 120000 Plugins/Java2SwiftPlugin/_PluginsShared create mode 120000 Plugins/JavaCompilerPlugin/_PluginsShared create mode 100644 Plugins/PluginsShared/0_PLEASE_SYMLINK.txt rename Plugins/{JavaCompilerPlugin => PluginsShared}/Configuration.swift (56%) rename Plugins/{JExtractSwiftCommandPlugin => }/PluginsShared/PluginUtils.swift (70%) create mode 100644 Plugins/PluginsShared/SwiftJavaPlugin+Errors.swift create mode 100644 Plugins/PluginsShared/SwiftJavaPluginProtocol.swift rename Plugins/{JExtractSwiftPlugin => SwiftJavaPlugin}/JExtractSwiftPlugin.swift (69%) create mode 120000 Plugins/SwiftJavaPlugin/_PluginsShared rename Samples/JavaKitSampleApp/Sources/JavaKitExample/{Java2Swift.config => swift-java.config} (100%) create mode 100644 swift-java-plugin/build.gradle.kts create mode 100644 swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts diff --git a/.licenseignore b/.licenseignore index 04a64766..e6ec5676 100644 --- a/.licenseignore +++ b/.licenseignore @@ -41,3 +41,4 @@ gradlew.bat **/gradlew.bat **/ci-validate.sh **/DO_NOT_EDIT.txt +Plugins/**/_PluginsShared \ No newline at end of file diff --git a/Package.swift b/Package.swift index 0d5a5dab..89df5a41 100644 --- a/Package.swift +++ b/Package.swift @@ -128,9 +128,9 @@ let package = Package( // ==== Plugin for wrapping Java classes in Swift .plugin( - name: "JExtractSwiftPlugin", + name: "SwiftJavaPlugin", targets: [ - "JExtractSwiftPlugin" + "SwiftJavaPlugin" ] ), .plugin( @@ -347,7 +347,7 @@ let package = Package( ), .plugin( - name: "JExtractSwiftPlugin", + name: "SwiftJavaPlugin", capability: .buildTool(), dependencies: [ "JExtractSwiftTool" diff --git a/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift b/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift index 008bc7d7..65ce8971 100644 --- a/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift +++ b/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift @@ -16,9 +16,10 @@ import Foundation import PackagePlugin @main -final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin { +final class JExtractSwiftCommandPlugin: SwiftJavaPluginProtocol, BuildToolPlugin, CommandPlugin { - var verbose: Bool = false + var pluginName: String = "swift-java-command" + var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") /// Build the target before attempting to extract from it. /// This avoids trying to extract from broken sources. @@ -48,8 +49,8 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin { } for target in context.package.targets { - guard let configPath = getSwiftJavaConfig(target: target) else { - log("Skipping target '\(target.name)', has no 'swift-java.config' file") + guard getSwiftJavaConfigPath(target: target) != nil else { + log("[swift-java-command] Skipping jextract step: Missing swift-java.config for target '\(target.name)'") continue } @@ -73,21 +74,15 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin { let sourceDir = target.directory.string let configuration = try readConfiguration(sourceDir: "\(sourceDir)") - - // We use the the usual maven-style structure of "src/[generated|main|test]/java/..." - // that is common in JVM ecosystem - let outputDirectoryJava = context.pluginWorkDirectoryURL - .appending(path: "src") - .appending(path: "generated") - .appending(path: "java") - let outputDirectorySwift = context.pluginWorkDirectoryURL - .appending(path: "Sources") + guard let javaPackage = configuration.javaPackage else { + throw SwiftJavaPluginError.missingConfiguration(sourceDir: "\(sourceDir)", key: "javaPackage") + } var arguments: [String] = [ "--swift-module", sourceModule.name, - "--package-name", configuration.javaPackage, - "--output-directory-java", outputDirectoryJava.path(percentEncoded: false), - "--output-directory-swift", outputDirectorySwift.path(percentEncoded: false), + "--package-name", javaPackage, + "--output-directory-java", context.outputDirectoryJava.path(percentEncoded: false), + "--output-directory-swift", context.outputDirectorySwift.path(percentEncoded: false), // TODO: "--build-cache-directory", ... // Since plugins cannot depend on libraries we cannot detect what the output files will be, // 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 { /// Perform the command on a specific target. func performCommand(context: PluginContext, target: Target, extraArguments _: [String]) throws { - // Make sure the target can builds properly - try self.packageManager.build(.target(target.name), parameters: .init()) - guard let sourceModule = target.sourceModule else { return } if self.buildInputs { + // Make sure the target can builds properly log("Pre-building target '\(target.name)' before extracting sources...") - try self.packageManager.build(.target(target.name), parameters: .init()) + let targetBuildResult = try self.packageManager.build(.target(target.name), parameters: .init()) + + guard targetBuildResult.succeeded else { + print("[swift-java-command] Build of '\(target.name)' failed: \(targetBuildResult.logText)") + return + } } let arguments = try prepareJExtractArguments(context: context, target: target) @@ -124,7 +122,13 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin { log("Post-extract building products with target '\(target.name)'...") for product in context.package.products where product.targets.contains(where: { $0.id == target.id }) { log("Post-extract building product '\(product.name)'...") - try self.packageManager.build(.product(product.name), parameters: .init()) + let buildResult = try self.packageManager.build(.product(product.name), parameters: .init()) + + if buildResult.succeeded { + log("Post-extract build: " + "done".green + ".") + } else { + log("Post-extract build: " + "done".red + "!") + } } } } @@ -146,16 +150,15 @@ final class JExtractSwiftCommandPlugin: BuildToolPlugin, CommandPlugin { } } - func log(_ message: @autoclosure () -> String, terminator: String = "\n") { - if self.verbose { - print("[swift-java-command] \(message())", terminator: terminator) - } - } } // Mini coloring helper, since we cannot have dependencies we keep it minimal here extension String { + var red: String { + "\u{001B}[0;31m" + "\(self)" + "\u{001B}[0;0m" + } var green: String { "\u{001B}[0;32m" + "\(self)" + "\u{001B}[0;0m" } -} \ No newline at end of file +} + diff --git a/Plugins/JExtractSwiftCommandPlugin/PluginsShared/Configuration.swift b/Plugins/JExtractSwiftCommandPlugin/PluginsShared/Configuration.swift deleted file mode 100644 index f917290c..00000000 --- a/Plugins/JExtractSwiftCommandPlugin/PluginsShared/Configuration.swift +++ /dev/null @@ -1,36 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift.org project authors -// Licensed under Apache License v2.0 -// -// See LICENSE.txt for license information -// See CONTRIBUTORS.txt for the list of Swift.org project authors -// -// SPDX-License-Identifier: Apache-2.0 -// -//===----------------------------------------------------------------------===// - -import Foundation - -/// Configuration for the JExtractSwift translation tool, provided on a per-target -/// basis. -struct Configuration: Codable { - var javaPackage: String -} - -func readConfiguration(sourceDir: String) throws -> Configuration { - let configFile = URL(filePath: sourceDir).appending(path: "swift-java.config") - do { - let configData = try Data(contentsOf: configFile) - return try JSONDecoder().decode(Configuration.self, from: configData) - } catch { - throw ConfigurationError(message: "Failed to parse JExtractSwift configuration at '\(configFile)!'", error: error) - } -} - -struct ConfigurationError: Error { - let message: String - let error: any Error -} diff --git a/Plugins/JExtractSwiftCommandPlugin/_PluginsShared b/Plugins/JExtractSwiftCommandPlugin/_PluginsShared new file mode 120000 index 00000000..de623a5e --- /dev/null +++ b/Plugins/JExtractSwiftCommandPlugin/_PluginsShared @@ -0,0 +1 @@ +../PluginsShared \ No newline at end of file diff --git a/Plugins/JExtractSwiftPlugin/PluginsShared/Configuration.swift b/Plugins/JExtractSwiftPlugin/PluginsShared/Configuration.swift deleted file mode 100644 index f917290c..00000000 --- a/Plugins/JExtractSwiftPlugin/PluginsShared/Configuration.swift +++ /dev/null @@ -1,36 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift.org project authors -// Licensed under Apache License v2.0 -// -// See LICENSE.txt for license information -// See CONTRIBUTORS.txt for the list of Swift.org project authors -// -// SPDX-License-Identifier: Apache-2.0 -// -//===----------------------------------------------------------------------===// - -import Foundation - -/// Configuration for the JExtractSwift translation tool, provided on a per-target -/// basis. -struct Configuration: Codable { - var javaPackage: String -} - -func readConfiguration(sourceDir: String) throws -> Configuration { - let configFile = URL(filePath: sourceDir).appending(path: "swift-java.config") - do { - let configData = try Data(contentsOf: configFile) - return try JSONDecoder().decode(Configuration.self, from: configData) - } catch { - throw ConfigurationError(message: "Failed to parse JExtractSwift configuration at '\(configFile)!'", error: error) - } -} - -struct ConfigurationError: Error { - let message: String - let error: any Error -} diff --git a/Plugins/JExtractSwiftPlugin/PluginsShared/PluginUtils.swift b/Plugins/JExtractSwiftPlugin/PluginsShared/PluginUtils.swift deleted file mode 100644 index 6ec58147..00000000 --- a/Plugins/JExtractSwiftPlugin/PluginsShared/PluginUtils.swift +++ /dev/null @@ -1,37 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift.org project authors -// Licensed under Apache License v2.0 -// -// See LICENSE.txt for license information -// See CONTRIBUTORS.txt for the list of Swift.org project authors -// -// SPDX-License-Identifier: Apache-2.0 -// -//===----------------------------------------------------------------------===// - -import Foundation - -// Note: the JAVA_HOME environment variable must be set to point to where -// Java is installed, e.g., -// Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home. -func findJavaHome() -> String { - if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] { - return home - } - - // This is a workaround for envs (some IDEs) which have trouble with - // picking up env variables during the build process - let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home" - if let home = try? String(contentsOfFile: path, encoding: .utf8) { - if let lastChar = home.last, lastChar.isNewline { - return String(home.dropLast()) - } - - return home - } - - fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.") -} diff --git a/Plugins/Java2SwiftPlugin/Configuration.swift b/Plugins/Java2SwiftPlugin/Configuration.swift deleted file mode 100644 index c9b17d06..00000000 --- a/Plugins/Java2SwiftPlugin/Configuration.swift +++ /dev/null @@ -1,36 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2024 Apple Inc. and the Swift.org project authors -// Licensed under Apache License v2.0 -// -// See LICENSE.txt for license information -// See CONTRIBUTORS.txt for the list of Swift.org project authors -// -// SPDX-License-Identifier: Apache-2.0 -// -//===----------------------------------------------------------------------===// - -typealias JavaVersion = Int - -/// Configuration for the Java2Swift translation tool, provided on a per-target -/// basis. -/// -/// Note: there is a copy of this struct in the Java2Swift library. They -/// must be kept in sync. -struct Configuration: Codable { - /// The Java class path that should be passed along to the Java2Swift tool. - var classPath: String? = nil - - /// The Java classes that should be translated to Swift. The keys are - /// canonical Java class names (e.g., java.util.Vector) and the values are - /// the corresponding Swift names (e.g., JavaVector). - var classes: [String: String] = [:] - - // Compile for the specified Java SE release. - var sourceCompatibility: JavaVersion? - - // Generate class files suitable for the specified Java SE release. - var targetCompatibility: JavaVersion? -} diff --git a/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift b/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift index 452ec8b3..82ae2be3 100644 --- a/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift +++ b/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift @@ -18,7 +18,11 @@ import PackagePlugin fileprivate let Java2SwiftConfigFileName = "Java2Swift.config" @main -struct Java2SwiftBuildToolPlugin: BuildToolPlugin { +struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { + + var pluginName: String = "swift-java-javac" + var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") + func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { guard let sourceModule = target.sourceModule else { return [] } @@ -87,9 +91,14 @@ struct Java2SwiftBuildToolPlugin: BuildToolPlugin { } arguments.append(configFile.path(percentEncoded: false)) + guard let classes = config.classes else { + log("Config at \(configFile) did not have 'classes' configured, skipping java2swift step.") + return [] + } + /// Determine the set of Swift files that will be emitted by the Java2Swift /// tool. - let outputSwiftFiles = config.classes.map { (javaClassName, swiftName) in + let outputSwiftFiles = classes.map { (javaClassName, swiftName) in let swiftNestedName = swiftName.replacingOccurrences(of: ".", with: "+") return outputDirectory.appending(path: "\(swiftNestedName).swift") } @@ -125,10 +134,15 @@ struct Java2SwiftBuildToolPlugin: BuildToolPlugin { arguments += [ "--swift-native-implementation", className] } } + + guard let classes = config.classes else { + log("Skipping java2swift step: Missing 'classes' key in swift-java.config at '\(configFile.path)'") + return [] + } return [ .buildCommand( - displayName: "Wrapping \(config.classes.count) Java classes target \(sourceModule.name) in Swift", + displayName: "Wrapping \(classes.count) Java classes target \(sourceModule.name) in Swift", executable: try context.tool(named: "Java2Swift").url, arguments: arguments, inputFiles: [ configFile ] + compiledClassFiles, @@ -137,25 +151,3 @@ struct Java2SwiftBuildToolPlugin: BuildToolPlugin { ] } } - -// Note: the JAVA_HOME environment variable must be set to point to where -// Java is installed, e.g., -// Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home. -func findJavaHome() -> String { - if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] { - return home - } - - // This is a workaround for envs (some IDEs) which have trouble with - // picking up env variables during the build process - let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home" - if let home = try? String(contentsOfFile: path, encoding: .utf8) { - if let lastChar = home.last, lastChar.isNewline { - return String(home.dropLast()) - } - - return home - } - - fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.") -} diff --git a/Plugins/Java2SwiftPlugin/_PluginsShared b/Plugins/Java2SwiftPlugin/_PluginsShared new file mode 120000 index 00000000..de623a5e --- /dev/null +++ b/Plugins/Java2SwiftPlugin/_PluginsShared @@ -0,0 +1 @@ +../PluginsShared \ No newline at end of file diff --git a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift index 518073a2..b93fe403 100644 --- a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift +++ b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift @@ -78,25 +78,3 @@ struct JavaCompilerBuildToolPlugin: BuildToolPlugin { ] } } - -// Note: the JAVA_HOME environment variable must be set to point to where -// Java is installed, e.g., -// Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home. -func findJavaHome() -> String { - if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] { - return home - } - - // This is a workaround for envs (some IDEs) which have trouble with - // picking up env variables during the build process - let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home" - if let home = try? String(contentsOfFile: path, encoding: .utf8) { - if let lastChar = home.last, lastChar.isNewline { - return String(home.dropLast()) - } - - return home - } - - fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.") -} diff --git a/Plugins/JavaCompilerPlugin/_PluginsShared b/Plugins/JavaCompilerPlugin/_PluginsShared new file mode 120000 index 00000000..de623a5e --- /dev/null +++ b/Plugins/JavaCompilerPlugin/_PluginsShared @@ -0,0 +1 @@ +../PluginsShared \ No newline at end of file diff --git a/Plugins/PluginsShared/0_PLEASE_SYMLINK.txt b/Plugins/PluginsShared/0_PLEASE_SYMLINK.txt new file mode 100644 index 00000000..40f0c528 --- /dev/null +++ b/Plugins/PluginsShared/0_PLEASE_SYMLINK.txt @@ -0,0 +1,3 @@ +This directory should be symlinked from all plugins so that we can avoid copy-pasting the contents. + +Package plugins cannot have dependencies, so this is a way to share sources common between all the plugins. \ No newline at end of file diff --git a/Plugins/JavaCompilerPlugin/Configuration.swift b/Plugins/PluginsShared/Configuration.swift similarity index 56% rename from Plugins/JavaCompilerPlugin/Configuration.swift rename to Plugins/PluginsShared/Configuration.swift index 96180760..769eef70 100644 --- a/Plugins/JavaCompilerPlugin/Configuration.swift +++ b/Plugins/PluginsShared/Configuration.swift @@ -12,21 +12,25 @@ // //===----------------------------------------------------------------------===// +import Foundation + typealias JavaVersion = Int -/// Configuration for the Java2Swift translation tool, provided on a per-target -/// basis. -/// -/// Note: there is a copy of this struct in the Java2Swift library. They -/// must be kept in sync. +/// Configuration for the SwiftJava plugins, provided on a per-target basis. struct Configuration: Codable { + // ==== swift 2 java --------------------------------------------------------- + + var javaPackage: String? + + // ==== java 2 swift --------------------------------------------------------- + /// The Java class path that should be passed along to the Java2Swift tool. var classPath: String? = nil /// The Java classes that should be translated to Swift. The keys are /// canonical Java class names (e.g., java.util.Vector) and the values are /// the corresponding Swift names (e.g., JavaVector). - var classes: [String: String] = [:] + var classes: [String: String]? = [:] // Compile for the specified Java SE release. var sourceCompatibility: JavaVersion? @@ -35,6 +39,17 @@ struct Configuration: Codable { var targetCompatibility: JavaVersion? } +func readConfiguration(sourceDir: String, file: String = #fileID, line: UInt = #line) throws -> Configuration { + let configFile = URL(filePath: sourceDir).appending(path: "swift-java.config") + do { + let configData = try Data(contentsOf: configFile) + return try JSONDecoder().decode(Configuration.self, from: configData) + } catch { + throw ConfigurationError(message: "Failed to parse SwiftJava configuration at '\(configFile)!'", error: error, + file: file, line: line) + } +} + extension Configuration { var compilerVersionArgs: [String] { var compilerVersionArgs = [String]() @@ -49,3 +64,18 @@ extension Configuration { return compilerVersionArgs } } + +struct ConfigurationError: Error { + let message: String + let error: any Error + + let file: String + let line: UInt + + init(message: String, error: any Error, file: String = #fileID, line: UInt = #line) { + self.message = message + self.error = error + self.file = file + self.line = line + } +} diff --git a/Plugins/JExtractSwiftCommandPlugin/PluginsShared/PluginUtils.swift b/Plugins/PluginsShared/PluginUtils.swift similarity index 70% rename from Plugins/JExtractSwiftCommandPlugin/PluginsShared/PluginUtils.swift rename to Plugins/PluginsShared/PluginUtils.swift index 320dfc19..bf4d0f0a 100644 --- a/Plugins/JExtractSwiftCommandPlugin/PluginsShared/PluginUtils.swift +++ b/Plugins/PluginsShared/PluginUtils.swift @@ -22,7 +22,7 @@ func findJavaHome() -> String { if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] { return home } - + // This is a workaround for envs (some IDEs) which have trouble with // picking up env variables during the build process let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home" @@ -30,19 +30,45 @@ func findJavaHome() -> String { if let lastChar = home.last, lastChar.isNewline { return String(home.dropLast()) } - + return home } - + fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.") } -func getSwiftJavaConfig(target: Target) -> String? { +func getSwiftJavaConfigPath(target: Target) -> String? { let configPath = URL(fileURLWithPath: target.directory.string).appending(component: "swift-java.config").path() - + if FileManager.default.fileExists(atPath: configPath) { - return configPath + return configPath } else { return nil } } + +func getEnvironmentBool(_ name: String) -> Bool { + if let value = ProcessInfo.processInfo.environment[name] { + switch value.lowercased() { + case "true", "yes", "1": true + case "false", "no", "0": false + default: false + } + } else { + false + } +} + +extension PluginContext { + var outputDirectoryJava: URL { + self.pluginWorkDirectoryURL + .appending(path: "src") + .appending(path: "generated") + .appending(path: "java") + } + + var outputDirectorySwift: URL { + self.pluginWorkDirectoryURL + .appending(path: "Sources") + } +} diff --git a/Plugins/PluginsShared/SwiftJavaPlugin+Errors.swift b/Plugins/PluginsShared/SwiftJavaPlugin+Errors.swift new file mode 100644 index 00000000..d9022830 --- /dev/null +++ b/Plugins/PluginsShared/SwiftJavaPlugin+Errors.swift @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +enum SwiftJavaPluginError: Error { + case missingConfiguration(sourceDir: String, key: String?, file: String = #file, line: UInt = #line) +} diff --git a/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift b/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift new file mode 100644 index 00000000..546d91b9 --- /dev/null +++ b/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +protocol SwiftJavaPluginProtocol { + var verbose: Bool { get } + var pluginName: String { get } + + func log(_ message: @autoclosure () -> String, terminator: String) +} + +extension SwiftJavaPluginProtocol { + func log(_ message: @autoclosure () -> String, terminator: String = "\n") { + if self.verbose { + print("[swift-java-command] \(message())", terminator: terminator) + } + } +} diff --git a/Plugins/JExtractSwiftPlugin/JExtractSwiftPlugin.swift b/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift similarity index 69% rename from Plugins/JExtractSwiftPlugin/JExtractSwiftPlugin.swift rename to Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift index 94cd4aa6..f4255ff5 100644 --- a/Plugins/JExtractSwiftPlugin/JExtractSwiftPlugin.swift +++ b/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift @@ -16,39 +16,46 @@ import Foundation import PackagePlugin @main -struct JExtractSwiftBuildToolPlugin: BuildToolPlugin { +struct JExtractSwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { + + var pluginName: String = "swift-java" + var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") + func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { + let toolURL = try context.tool(named: "JExtractSwiftTool").url + guard let sourceModule = target.sourceModule else { return [] } // Note: Target doesn't have a directoryURL counterpart to directory, // so we cannot eliminate this deprecation warning. - let sourceDir = target.directory.string - - let t = target.dependencies.first! - switch (t) { - case .target(let t): - t.sourceModule - case .product(let p): - p.sourceModules - @unknown default: - fatalError("Unknown target dependency type: \(t)") + for dependency in target.dependencies { + switch (dependency) { + case .target(let t): + t.sourceModule + case .product(let p): + p.sourceModules + @unknown default: + fatalError("Unknown target dependency type: \(dependency)") + } } - let toolURL = try context.tool(named: "JExtractSwiftTool").url + let sourceDir = target.directory.string let configuration = try readConfiguration(sourceDir: "\(sourceDir)") - + + guard let javaPackage = configuration.javaPackage else { + // throw SwiftJavaPluginError.missingConfiguration(sourceDir: "\(sourceDir)", key: "javaPackage") + log("Skipping jextract step, no 'javaPackage' configuration in \(getSwiftJavaConfigPath(target: target) ?? "")") + return [] + } + // We use the the usual maven-style structure of "src/[generated|main|test]/java/..." // that is common in JVM ecosystem - let outputDirectoryJava = context.pluginWorkDirectoryURL - .appending(path: "src") - .appending(path: "generated") - .appending(path: "java") - let outputDirectorySwift = context.pluginWorkDirectoryURL - .appending(path: "Sources") + let outputDirectoryJava = context.outputDirectoryJava + let outputDirectorySwift = context.outputDirectorySwift var arguments: [String] = [ "--swift-module", sourceModule.name, - "--package-name", configuration.javaPackage, + "--package-name", javaPackage, "--output-directory-java", outputDirectoryJava.path(percentEncoded: false), "--output-directory-swift", outputDirectorySwift.path(percentEncoded: false), // TODO: "--build-cache-directory", ... diff --git a/Plugins/SwiftJavaPlugin/_PluginsShared b/Plugins/SwiftJavaPlugin/_PluginsShared new file mode 120000 index 00000000..de623a5e --- /dev/null +++ b/Plugins/SwiftJavaPlugin/_PluginsShared @@ -0,0 +1 @@ +../PluginsShared \ No newline at end of file diff --git a/Samples/JavaKitSampleApp/Package.swift b/Samples/JavaKitSampleApp/Package.swift index 8976bd41..3366cfee 100644 --- a/Samples/JavaKitSampleApp/Package.swift +++ b/Samples/JavaKitSampleApp/Package.swift @@ -76,7 +76,7 @@ let package = Package( ], plugins: [ .plugin(name: "JavaCompilerPlugin", package: "swift-java"), - .plugin(name: "Java2SwiftPlugin", package: "swift-java"), + .plugin(name: "SwiftJavaPlugin", package: "swift-java"), ] ), ] diff --git a/Samples/JavaKitSampleApp/Sources/JavaKitExample/Java2Swift.config b/Samples/JavaKitSampleApp/Sources/JavaKitExample/swift-java.config similarity index 100% rename from Samples/JavaKitSampleApp/Sources/JavaKitExample/Java2Swift.config rename to Samples/JavaKitSampleApp/Sources/JavaKitExample/swift-java.config diff --git a/Samples/SwiftAndJavaJarSampleLib/Package.swift b/Samples/SwiftAndJavaJarSampleLib/Package.swift index 5f132239..a1212fd7 100644 --- a/Samples/SwiftAndJavaJarSampleLib/Package.swift +++ b/Samples/SwiftAndJavaJarSampleLib/Package.swift @@ -70,7 +70,7 @@ let package = Package( .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) ], plugins: [ - .plugin(name: "JExtractSwiftPlugin", package: "swift-java"), + .plugin(name: "SwiftJavaPlugin", package: "swift-java"), ] ), ] diff --git a/Samples/SwiftKitSampleApp/Package.swift b/Samples/SwiftKitSampleApp/Package.swift index f12ecfd6..bfd3ecbe 100644 --- a/Samples/SwiftKitSampleApp/Package.swift +++ b/Samples/SwiftKitSampleApp/Package.swift @@ -70,7 +70,7 @@ let package = Package( .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) ], plugins: [ - .plugin(name: "JExtractSwiftPlugin", package: "swift-java"), + .plugin(name: "SwiftJavaPlugin", package: "swift-java"), ] ), ] diff --git a/swift-java-plugin/build.gradle.kts b/swift-java-plugin/build.gradle.kts new file mode 100644 index 00000000..0edc6c02 --- /dev/null +++ b/swift-java-plugin/build.gradle.kts @@ -0,0 +1,38 @@ +plugins { + // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins + `java-gradle-plugin` +} + +repositories { + // Use Maven Central for resolving dependencies + mavenCentral() +} + +dependencies { + // Use JUnit test framework for unit tests + testImplementation("junit:junit:4.13") +} + +gradlePlugin { + // Define the plugin + val greeting by plugins.creating { + id = "com.example.plugin.greeting" + implementationClass = "com.example.plugin.GreetingPlugin" + } +} + +// Add a source set and a task for a functional test suite +val functionalTest by sourceSets.creating +gradlePlugin.testSourceSets(functionalTest) + +configurations[functionalTest.implementationConfigurationName].extendsFrom(configurations.testImplementation.get()) + +val functionalTestTask = tasks.register("functionalTest") { + testClassesDirs = functionalTest.output.classesDirs + classpath = configurations[functionalTest.runtimeClasspathConfigurationName] + functionalTest.output +} + +tasks.check { + // Run the functional tests as part of `check` + dependsOn(functionalTestTask) +} diff --git a/swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts b/swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts new file mode 100644 index 00000000..21ac6a36 --- /dev/null +++ b/swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts @@ -0,0 +1,13 @@ +package com.example.org.swift.swiftjava.gradle + +import org.gradle.api.Plugin; +import org.gradle.api.Project; + +class MyCustomPlugin implements Plugin { + @Override + public void apply(Project project) { + project.getTasks().register("myTask", task -> { + task.doLast(t -> System.out.println("Hello from MyCustomPlugin!")); + }); + } +} From 50c941a317bd46a37f80d2cf74c5465f0552a337 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Tue, 19 Nov 2024 18:44:39 +0900 Subject: [PATCH 2/6] ci-validate script for JavaKitSampleApp --- Samples/JavaKitSampleApp/ci-validate.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 Samples/JavaKitSampleApp/ci-validate.sh diff --git a/Samples/JavaKitSampleApp/ci-validate.sh b/Samples/JavaKitSampleApp/ci-validate.sh new file mode 100755 index 00000000..d0a6ee87 --- /dev/null +++ b/Samples/JavaKitSampleApp/ci-validate.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +swift build +java -cp .build/plugins/outputs/javakitsampleapp/JavaKitExample/destination/JavaCompilerPlugin/Java -Djava.library.path=.build/debug com.example.swift.JavaKitSampleMain \ No newline at end of file From 43684f06b2ebf44dc89049450ff007bb580f5319 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Tue, 19 Nov 2024 18:55:40 +0900 Subject: [PATCH 3/6] keep old plugin around for now --- Samples/JavaKitSampleApp/Package.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Samples/JavaKitSampleApp/Package.swift b/Samples/JavaKitSampleApp/Package.swift index 3366cfee..46dfbd80 100644 --- a/Samples/JavaKitSampleApp/Package.swift +++ b/Samples/JavaKitSampleApp/Package.swift @@ -77,6 +77,7 @@ let package = Package( plugins: [ .plugin(name: "JavaCompilerPlugin", package: "swift-java"), .plugin(name: "SwiftJavaPlugin", package: "swift-java"), + .plugin(name: "Java2SwiftPlugin", package: "swift-java"), ] ), ] From b3f20abfe69448e8e5e00cf9b549f60654cdfe37 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Tue, 19 Nov 2024 18:59:15 +0900 Subject: [PATCH 4/6] turn on verbose output for plugins on CI --- .github/workflows/pull_request.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 8039b572..06db1ff2 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -28,6 +28,7 @@ jobs: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} env: JAVA_HOME: "/usr/lib/jvm/default-jdk" + SWIFT_JAVA_VERBOSE: true steps: - uses: actions/checkout@v4 - name: Prepare CI Environment @@ -53,6 +54,7 @@ jobs: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} env: JAVA_HOME: "/usr/lib/jvm/default-jdk" + SWIFT_JAVA_VERBOSE: true steps: - uses: actions/checkout@v4 - name: Prepare CI Environment From 35540c409881d82688cdaf0b8c5d2767bd76a93d Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Tue, 19 Nov 2024 20:43:20 +0900 Subject: [PATCH 5/6] fix all configs --- .licenseignore | 3 ++- Package.swift | 12 ++++++------ .../JExtractSwiftCommandPlugin.swift | 6 ++++-- Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift | 17 ++++++++++++----- .../JavaCompilerPlugin/JavaCompilerPlugin.swift | 1 + Plugins/PluginsShared/Configuration.swift | 4 ++-- .../PluginsShared/SwiftJavaPluginProtocol.swift | 6 +++--- .../SwiftJavaPlugin/JExtractSwiftPlugin.swift | 1 + .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 Sources/Java2Swift/JavaToSwift.swift | 4 ++-- .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 .../{Java2Swift.config => swift-java.config} | 0 18 files changed, 33 insertions(+), 21 deletions(-) rename Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/{Java2Swift.config => swift-java.config} (100%) rename Samples/JavaSieve/Sources/JavaMath/{Java2Swift.config => swift-java.config} (100%) rename Samples/JavaSieve/Sources/JavaSieve/{Java2Swift.config => swift-java.config} (100%) rename Sources/JavaKit/{Java2Swift.config => swift-java.config} (100%) rename Sources/JavaKitCollection/{Java2Swift.config => swift-java.config} (100%) rename Sources/JavaKitFunction/{Java2Swift.config => swift-java.config} (100%) rename Sources/JavaKitJar/{Java2Swift.config => swift-java.config} (100%) rename Sources/JavaKitNetwork/{Java2Swift.config => swift-java.config} (100%) rename Sources/JavaKitReflection/{Java2Swift.config => swift-java.config} (100%) diff --git a/.licenseignore b/.licenseignore index e6ec5676..ce382547 100644 --- a/.licenseignore +++ b/.licenseignore @@ -41,4 +41,5 @@ gradlew.bat **/gradlew.bat **/ci-validate.sh **/DO_NOT_EDIT.txt -Plugins/**/_PluginsShared \ No newline at end of file +Plugins/**/_PluginsShared +Plugins/**/0_PLEASE_SYMLINK* \ No newline at end of file diff --git a/Package.swift b/Package.swift index 89df5a41..119aca6e 100644 --- a/Package.swift +++ b/Package.swift @@ -174,7 +174,7 @@ let package = Package( .target( name: "JavaKit", dependencies: ["JavaRuntime", "JavaKitMacros", "JavaTypes"], - exclude: ["Java2Swift.config"], + exclude: ["swift-java.config"], swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) @@ -201,7 +201,7 @@ let package = Package( .target( name: "JavaKitCollection", dependencies: ["JavaKit"], - exclude: ["Java2Swift.config"], + exclude: ["swift-java.config"], swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) @@ -210,7 +210,7 @@ let package = Package( .target( name: "JavaKitFunction", dependencies: ["JavaKit"], - exclude: ["Java2Swift.config"], + exclude: ["swift-java.config"], swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) @@ -219,7 +219,7 @@ let package = Package( .target( name: "JavaKitJar", dependencies: ["JavaKit", "JavaKitCollection"], - exclude: ["Java2Swift.config"], + exclude: ["swift-java.config"], swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) @@ -228,7 +228,7 @@ let package = Package( .target( name: "JavaKitNetwork", dependencies: ["JavaKit", "JavaKitCollection"], - exclude: ["Java2Swift.config"], + exclude: ["swift-java.config"], swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) @@ -237,7 +237,7 @@ let package = Package( .target( name: "JavaKitReflection", dependencies: ["JavaKit", "JavaKitCollection"], - exclude: ["Java2Swift.config"], + exclude: ["swift-java.config"], swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) diff --git a/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift b/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift index 65ce8971..0a4f178b 100644 --- a/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift +++ b/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift @@ -1,4 +1,4 @@ -//===----------------------------------------------------------------------===// +//---------------------------------------------===-------------------------===// // // This source file is part of the Swift.org open source project // @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 // -//===----------------------------------------------------------------------===// +//---------------------------------------------===-------------------------===// import Foundation import PackagePlugin @@ -32,11 +32,13 @@ final class JExtractSwiftCommandPlugin: SwiftJavaPluginProtocol, BuildToolPlugin var buildOutputs: Bool = true func createBuildCommands(context: PluginContext, target: any Target) async throws -> [Command] { + print("JEXTRACT COMMAND CREATE BUILD COMMANDS ================================") // FIXME: This is not a build plugin but SwiftPM forces us to impleme the protocol anyway? rdar://139556637 return [] } func performCommand(context: PluginContext, arguments: [String]) throws { + print("JEXTRACT COMMAND ================================") // Plugin can't have dependencies, so we have some naive argument parsing instead: self.verbose = arguments.contains("-v") || arguments.contains("--verbose") diff --git a/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift b/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift index 82ae2be3..c227ff84 100644 --- a/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift +++ b/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift @@ -1,4 +1,4 @@ -//===----------------------------------------------------------------------===// +//---------------------------------------------===-------------------------===// // // This source file is part of the Swift.org open source project // @@ -10,12 +10,12 @@ // // SPDX-License-Identifier: Apache-2.0 // -//===----------------------------------------------------------------------===// +//---------------------------------------------===-------------------------===// import Foundation import PackagePlugin -fileprivate let Java2SwiftConfigFileName = "Java2Swift.config" +fileprivate let SwiftJavaConfigFileName = "swift-java.config" @main struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { @@ -24,8 +24,15 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { + print("JAVA2Swift ================================") + print("JAVA2Swift ================================") + print("JAVA2Swift ================================") + print("JAVA2Swift ================================") + print("JAVA2Swift ================================") + guard let sourceModule = target.sourceModule else { return [] } + // Note: Target doesn't have a directoryURL counterpart to directory, // so we cannot eliminate this deprecation warning. let sourceDir = target.directory.string @@ -33,7 +40,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { // The name of the configuration file JavaKit.config from the target for // which we are generating Swift wrappers for Java classes. let configFile = URL(filePath: sourceDir) - .appending(path: "Java2Swift.config") + .appending(path: SwiftJavaConfigFileName) let configData = try Data(contentsOf: configFile) let config = try JSONDecoder().decode(Configuration.self, from: configData) @@ -45,7 +52,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { // Look for a config file within this target. let dependencyConfigURL = dependencyURL - .appending(path: Java2SwiftConfigFileName) + .appending(path: SwiftJavaConfigFileName) let dependencyConfigString = dependencyConfigURL .path(percentEncoded: false) diff --git a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift index b93fe403..5afdd35a 100644 --- a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift +++ b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift @@ -18,6 +18,7 @@ import PackagePlugin @main struct JavaCompilerBuildToolPlugin: BuildToolPlugin { func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { + print("COMPILER PLUGIN ================================") guard let sourceModule = target.sourceModule else { return [] } // Collect all of the Java source files within this target's sources. diff --git a/Plugins/PluginsShared/Configuration.swift b/Plugins/PluginsShared/Configuration.swift index 769eef70..2c0adbcf 100644 --- a/Plugins/PluginsShared/Configuration.swift +++ b/Plugins/PluginsShared/Configuration.swift @@ -1,4 +1,4 @@ -//===----------------------------------------------------------------------===// +//---------------------------------------------===-------------------------===// // // This source file is part of the Swift.org open source project // @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 // -//===----------------------------------------------------------------------===// +//---------------------------------------------===-------------------------===// import Foundation diff --git a/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift b/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift index 546d91b9..68f8964e 100644 --- a/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift +++ b/Plugins/PluginsShared/SwiftJavaPluginProtocol.swift @@ -21,8 +21,8 @@ protocol SwiftJavaPluginProtocol { extension SwiftJavaPluginProtocol { func log(_ message: @autoclosure () -> String, terminator: String = "\n") { - if self.verbose { - print("[swift-java-command] \(message())", terminator: terminator) - } +// if self.verbose { + print("[\(pluginName)] \(message())", terminator: terminator) +// } } } diff --git a/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift b/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift index f4255ff5..6cf5f7b2 100644 --- a/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift +++ b/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift @@ -22,6 +22,7 @@ struct JExtractSwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { + print("JEXTRACT BUILD COMMANDS PLAIN PLUGIN ================================") let toolURL = try context.tool(named: "JExtractSwiftTool").url guard let sourceModule = target.sourceModule else { return [] } diff --git a/Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/Java2Swift.config b/Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/swift-java.config similarity index 100% rename from Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/Java2Swift.config rename to Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/swift-java.config diff --git a/Samples/JavaSieve/Sources/JavaMath/Java2Swift.config b/Samples/JavaSieve/Sources/JavaMath/swift-java.config similarity index 100% rename from Samples/JavaSieve/Sources/JavaMath/Java2Swift.config rename to Samples/JavaSieve/Sources/JavaMath/swift-java.config diff --git a/Samples/JavaSieve/Sources/JavaSieve/Java2Swift.config b/Samples/JavaSieve/Sources/JavaSieve/swift-java.config similarity index 100% rename from Samples/JavaSieve/Sources/JavaSieve/Java2Swift.config rename to Samples/JavaSieve/Sources/JavaSieve/swift-java.config diff --git a/Sources/Java2Swift/JavaToSwift.swift b/Sources/Java2Swift/JavaToSwift.swift index 1434629f..125191bd 100644 --- a/Sources/Java2Swift/JavaToSwift.swift +++ b/Sources/Java2Swift/JavaToSwift.swift @@ -369,8 +369,8 @@ struct JavaToSwift: ParsableCommand { // Write the file. try writeContents( contents, - to: "Java2Swift.config", - description: "Java2Swift configuration file" + to: "swift-java.config", + description: "swift-java configuration file" ) } } diff --git a/Sources/JavaKit/Java2Swift.config b/Sources/JavaKit/swift-java.config similarity index 100% rename from Sources/JavaKit/Java2Swift.config rename to Sources/JavaKit/swift-java.config diff --git a/Sources/JavaKitCollection/Java2Swift.config b/Sources/JavaKitCollection/swift-java.config similarity index 100% rename from Sources/JavaKitCollection/Java2Swift.config rename to Sources/JavaKitCollection/swift-java.config diff --git a/Sources/JavaKitFunction/Java2Swift.config b/Sources/JavaKitFunction/swift-java.config similarity index 100% rename from Sources/JavaKitFunction/Java2Swift.config rename to Sources/JavaKitFunction/swift-java.config diff --git a/Sources/JavaKitJar/Java2Swift.config b/Sources/JavaKitJar/swift-java.config similarity index 100% rename from Sources/JavaKitJar/Java2Swift.config rename to Sources/JavaKitJar/swift-java.config diff --git a/Sources/JavaKitNetwork/Java2Swift.config b/Sources/JavaKitNetwork/swift-java.config similarity index 100% rename from Sources/JavaKitNetwork/Java2Swift.config rename to Sources/JavaKitNetwork/swift-java.config diff --git a/Sources/JavaKitReflection/Java2Swift.config b/Sources/JavaKitReflection/swift-java.config similarity index 100% rename from Sources/JavaKitReflection/Java2Swift.config rename to Sources/JavaKitReflection/swift-java.config From 3f3bd4678a5d2de91a14faefd84cc09a872b75a5 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Tue, 19 Nov 2024 21:03:32 +0900 Subject: [PATCH 6/6] use JAVA_HOME in ci-verify script --- .../JExtractSwiftCommandPlugin.swift | 6 +-- .../Java2SwiftPlugin/Java2SwiftPlugin.swift | 11 +----- .../JavaCompilerPlugin.swift | 1 - Plugins/PluginsShared/Configuration.swift | 4 +- .../SwiftJavaPlugin/JExtractSwiftPlugin.swift | 1 - Samples/JavaKitSampleApp/ci-validate.sh | 5 ++- swift-java-plugin/build.gradle.kts | 38 ------------------- .../swiftjava/gradle/SwiftJavaPlugin.kts | 13 ------- 8 files changed, 10 insertions(+), 69 deletions(-) delete mode 100644 swift-java-plugin/build.gradle.kts delete mode 100644 swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts diff --git a/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift b/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift index 0a4f178b..65ce8971 100644 --- a/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift +++ b/Plugins/JExtractSwiftCommandPlugin/JExtractSwiftCommandPlugin.swift @@ -1,4 +1,4 @@ -//---------------------------------------------===-------------------------===// +//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 // -//---------------------------------------------===-------------------------===// +//===----------------------------------------------------------------------===// import Foundation import PackagePlugin @@ -32,13 +32,11 @@ final class JExtractSwiftCommandPlugin: SwiftJavaPluginProtocol, BuildToolPlugin var buildOutputs: Bool = true func createBuildCommands(context: PluginContext, target: any Target) async throws -> [Command] { - print("JEXTRACT COMMAND CREATE BUILD COMMANDS ================================") // FIXME: This is not a build plugin but SwiftPM forces us to impleme the protocol anyway? rdar://139556637 return [] } func performCommand(context: PluginContext, arguments: [String]) throws { - print("JEXTRACT COMMAND ================================") // Plugin can't have dependencies, so we have some naive argument parsing instead: self.verbose = arguments.contains("-v") || arguments.contains("--verbose") diff --git a/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift b/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift index c227ff84..8c7045e0 100644 --- a/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift +++ b/Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift @@ -1,4 +1,4 @@ -//---------------------------------------------===-------------------------===// +//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 // -//---------------------------------------------===-------------------------===// +//===----------------------------------------------------------------------===// import Foundation import PackagePlugin @@ -24,15 +24,8 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { - print("JAVA2Swift ================================") - print("JAVA2Swift ================================") - print("JAVA2Swift ================================") - print("JAVA2Swift ================================") - print("JAVA2Swift ================================") - guard let sourceModule = target.sourceModule else { return [] } - // Note: Target doesn't have a directoryURL counterpart to directory, // so we cannot eliminate this deprecation warning. let sourceDir = target.directory.string diff --git a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift index 5afdd35a..b93fe403 100644 --- a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift +++ b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift @@ -18,7 +18,6 @@ import PackagePlugin @main struct JavaCompilerBuildToolPlugin: BuildToolPlugin { func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { - print("COMPILER PLUGIN ================================") guard let sourceModule = target.sourceModule else { return [] } // Collect all of the Java source files within this target's sources. diff --git a/Plugins/PluginsShared/Configuration.swift b/Plugins/PluginsShared/Configuration.swift index 2c0adbcf..769eef70 100644 --- a/Plugins/PluginsShared/Configuration.swift +++ b/Plugins/PluginsShared/Configuration.swift @@ -1,4 +1,4 @@ -//---------------------------------------------===-------------------------===// +//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // @@ -10,7 +10,7 @@ // // SPDX-License-Identifier: Apache-2.0 // -//---------------------------------------------===-------------------------===// +//===----------------------------------------------------------------------===// import Foundation diff --git a/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift b/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift index 6cf5f7b2..f4255ff5 100644 --- a/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift +++ b/Plugins/SwiftJavaPlugin/JExtractSwiftPlugin.swift @@ -22,7 +22,6 @@ struct JExtractSwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin { var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE") func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] { - print("JEXTRACT BUILD COMMANDS PLAIN PLUGIN ================================") let toolURL = try context.tool(named: "JExtractSwiftTool").url guard let sourceModule = target.sourceModule else { return [] } diff --git a/Samples/JavaKitSampleApp/ci-validate.sh b/Samples/JavaKitSampleApp/ci-validate.sh index d0a6ee87..eff61551 100755 --- a/Samples/JavaKitSampleApp/ci-validate.sh +++ b/Samples/JavaKitSampleApp/ci-validate.sh @@ -1,4 +1,7 @@ #!/bin/sh swift build -java -cp .build/plugins/outputs/javakitsampleapp/JavaKitExample/destination/JavaCompilerPlugin/Java -Djava.library.path=.build/debug com.example.swift.JavaKitSampleMain \ No newline at end of file +"$JAVA_HOME/bin/java" \ + -cp .build/plugins/outputs/javakitsampleapp/JavaKitExample/destination/JavaCompilerPlugin/Java \ + -Djava.library.path=.build/debug \ + "com.example.swift.JavaKitSampleMain" diff --git a/swift-java-plugin/build.gradle.kts b/swift-java-plugin/build.gradle.kts deleted file mode 100644 index 0edc6c02..00000000 --- a/swift-java-plugin/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -plugins { - // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins - `java-gradle-plugin` -} - -repositories { - // Use Maven Central for resolving dependencies - mavenCentral() -} - -dependencies { - // Use JUnit test framework for unit tests - testImplementation("junit:junit:4.13") -} - -gradlePlugin { - // Define the plugin - val greeting by plugins.creating { - id = "com.example.plugin.greeting" - implementationClass = "com.example.plugin.GreetingPlugin" - } -} - -// Add a source set and a task for a functional test suite -val functionalTest by sourceSets.creating -gradlePlugin.testSourceSets(functionalTest) - -configurations[functionalTest.implementationConfigurationName].extendsFrom(configurations.testImplementation.get()) - -val functionalTestTask = tasks.register("functionalTest") { - testClassesDirs = functionalTest.output.classesDirs - classpath = configurations[functionalTest.runtimeClasspathConfigurationName] + functionalTest.output -} - -tasks.check { - // Run the functional tests as part of `check` - dependsOn(functionalTestTask) -} diff --git a/swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts b/swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts deleted file mode 100644 index 21ac6a36..00000000 --- a/swift-java-plugin/src/main/kotlin/org/swift/swiftjava/gradle/SwiftJavaPlugin.kts +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.org.swift.swiftjava.gradle - -import org.gradle.api.Plugin; -import org.gradle.api.Project; - -class MyCustomPlugin implements Plugin { - @Override - public void apply(Project project) { - project.getTasks().register("myTask", task -> { - task.doLast(t -> System.out.println("Hello from MyCustomPlugin!")); - }); - } -}