44import CompilerPluginSupport
55import PackageDescription
66
7- import class Foundation. FileManager
8- import class Foundation. ProcessInfo
7+ import Foundation
98
109// Note: the JAVA_HOME environment variable must be set to point to where
1110// Java is installed, e.g.,
@@ -25,9 +24,53 @@ func findJavaHome() -> String {
2524
2625 return home
2726 }
27+
28+ if let home = getJavaHomeFromLibexecJavaHome ( ) ,
29+ !home. isEmpty {
30+ return home
31+ }
2832
2933 fatalError ( " Please set the JAVA_HOME environment variable to point to where Java is installed. " )
3034}
35+
36+ /// On MacOS we can use the java_home tool as a fallback if we can't find JAVA_HOME environment variable.
37+ func getJavaHomeFromLibexecJavaHome( ) -> String ? {
38+ let task = Process ( )
39+ task. executableURL = URL ( fileURLWithPath: " /usr/libexec/java_home " )
40+
41+ // Check if the executable exists before trying to run it
42+ guard FileManager . default. fileExists ( atPath: task. executableURL!. path) else {
43+ print ( " /usr/libexec/java_home does not exist " )
44+ return nil
45+ }
46+
47+ let pipe = Pipe ( )
48+ task. standardOutput = pipe
49+ task. standardError = pipe // Redirect standard error to the same pipe for simplicity
50+
51+ do {
52+ try task. run ( )
53+ task. waitUntilExit ( )
54+
55+ let data = pipe. fileHandleForReading. readDataToEndOfFile ( )
56+ let output = String ( data: data, encoding: . utf8) ? . trimmingCharacters ( in: . whitespacesAndNewlines)
57+
58+ if task. terminationStatus == 0 {
59+ return output
60+ } else {
61+ print ( " java_home terminated with status: \( task. terminationStatus) " )
62+ // Optionally, log the error output for debugging
63+ if let errorOutput = String ( data: pipe. fileHandleForReading. readDataToEndOfFile ( ) , encoding: . utf8) {
64+ print ( " Error output: \( errorOutput) " )
65+ }
66+ return nil
67+ }
68+ } catch {
69+ print ( " Error running java_home: \( error) " )
70+ return nil
71+ }
72+ }
73+
3174let javaHome = findJavaHome ( )
3275
3376let javaIncludePath = " \( javaHome) /include "
@@ -92,8 +135,8 @@ let package = Package(
92135 ) ,
93136
94137 . executable(
95- name: " Java2Swift " ,
96- targets: [ " Java2Swift " ]
138+ name: " swift-java " ,
139+ targets: [ " SwiftJavaTool " ]
97140 ) ,
98141
99142 // ==== Plugin for building Java code
@@ -106,19 +149,12 @@ let package = Package(
106149
107150 // ==== Plugin for wrapping Java classes in Swift
108151 . plugin(
109- name: " Java2SwiftPlugin " ,
152+ name: " SwiftJavaPlugin " ,
110153 targets: [
111- " Java2SwiftPlugin "
154+ " SwiftJavaPlugin "
112155 ]
113156 ) ,
114157
115- // ==== jextract-swift (extract Java accessors from Swift interface files)
116-
117- . executable(
118- name: " jextract-swift " ,
119- targets: [ " JExtractSwiftTool " ]
120- ) ,
121-
122158 // Support library written in Swift for SwiftKit "Java"
123159 . library(
124160 name: " SwiftKitSwift " ,
@@ -127,8 +163,8 @@ let package = Package(
127163 ) ,
128164
129165 . library(
130- name: " JExtractSwift " ,
131- targets: [ " JExtractSwift " ]
166+ name: " JExtractSwiftLib " ,
167+ targets: [ " JExtractSwiftLib " ]
132168 ) ,
133169
134170 // ==== Plugin for wrapping Java classes in Swift
@@ -274,10 +310,10 @@ let package = Package(
274310 ) ,
275311
276312 . plugin(
277- name: " Java2SwiftPlugin " ,
313+ name: " SwiftJavaPlugin " ,
278314 capability: . buildTool( ) ,
279315 dependencies: [
280- " Java2Swift "
316+ " SwiftJavaTool "
281317 ]
282318 ) ,
283319
@@ -315,7 +351,7 @@ let package = Package(
315351 ) ,
316352
317353 . target(
318- name: " Java2SwiftLib " ,
354+ name: " SwiftJavaLib " ,
319355 dependencies: [
320356 . product( name: " SwiftBasicFormat " , package : " swift-syntax " ) ,
321357 . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
@@ -337,7 +373,7 @@ let package = Package(
337373 ) ,
338374
339375 . executableTarget(
340- name: " Java2Swift " ,
376+ name: " SwiftJavaTool " ,
341377 dependencies: [
342378 . product( name: " SwiftBasicFormat " , package : " swift-syntax " ) ,
343379 . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
@@ -346,7 +382,8 @@ let package = Package(
346382 " JavaKit " ,
347383 " JavaKitJar " ,
348384 " JavaKitNetwork " ,
349- " Java2SwiftLib " ,
385+ " SwiftJavaLib " ,
386+ " JExtractSwiftLib " ,
350387 " JavaKitShared " ,
351388 ] ,
352389
@@ -358,7 +395,7 @@ let package = Package(
358395 ) ,
359396
360397 . target(
361- name: " JExtractSwift " ,
398+ name: " JExtractSwiftLib " ,
362399 dependencies: [
363400 . product( name: " SwiftBasicFormat " , package : " swift-syntax " ) ,
364401 . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
@@ -373,21 +410,11 @@ let package = Package(
373410 ]
374411 ) ,
375412
376- . executableTarget(
377- name: " JExtractSwiftTool " ,
378- dependencies: [
379- " JExtractSwift " ,
380- ] ,
381- swiftSettings: [
382- . swiftLanguageMode( . v5)
383- ]
384- ) ,
385-
386413 . plugin(
387414 name: " JExtractSwiftPlugin " ,
388415 capability: . buildTool( ) ,
389416 dependencies: [
390- " JExtractSwiftTool "
417+ " SwiftJavaTool "
391418 ]
392419 ) ,
393420 . plugin(
@@ -397,7 +424,7 @@ let package = Package(
397424 permissions: [
398425 ] ) ,
399426 dependencies: [
400- " JExtractSwiftTool "
427+ " SwiftJavaTool "
401428 ]
402429 ) ,
403430
@@ -430,8 +457,8 @@ let package = Package(
430457 ) ,
431458
432459 . testTarget(
433- name: " Java2SwiftTests " ,
434- dependencies: [ " Java2SwiftLib " ] ,
460+ name: " SwiftJavaTests " ,
461+ dependencies: [ " SwiftJavaLib " ] ,
435462 swiftSettings: [
436463 . swiftLanguageMode( . v5) ,
437464 . unsafeFlags( [ " -I \( javaIncludePath) " , " -I \( javaPlatformIncludePath) " ] )
@@ -441,7 +468,7 @@ let package = Package(
441468 . testTarget(
442469 name: " JExtractSwiftTests " ,
443470 dependencies: [
444- " JExtractSwift "
471+ " JExtractSwiftLib "
445472 ] ,
446473 swiftSettings: [
447474 . swiftLanguageMode( . v5) ,
0 commit comments