Skip to content

Commit 3c892d4

Browse files
committed
Improve error message on clang failure
1 parent b59983f commit 3c892d4

File tree

1 file changed

+59
-42
lines changed

1 file changed

+59
-42
lines changed

plugins/build-plugin/src/main/kotlin/com/powersync/compile/JniLibraryCompile.kt

Lines changed: 59 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import org.gradle.api.tasks.OutputFile
1616
import org.gradle.api.tasks.PathSensitive
1717
import org.gradle.api.tasks.PathSensitivity
1818
import org.gradle.api.tasks.TaskAction
19+
import org.gradle.process.ProcessExecutionException
20+
import org.gradle.process.internal.ExecException
1921
import java.io.File
2022
import javax.inject.Inject
2123

@@ -79,59 +81,74 @@ abstract class JniLibraryCompile: DefaultTask() {
7981
fun run() {
8082
val target = this.target.get()
8183
val clang = clangPath.getOrElse("clang")
84+
val workingDir = layout.projectDirectory.asFile
8285

83-
providers.exec {
84-
workingDir = layout.projectDirectory.asFile
85-
86-
fun filePath(file: File): String {
87-
return file.relativeTo(workingDir).path
88-
}
86+
fun filePath(file: File): String {
87+
return file.relativeTo(workingDir).path
88+
}
8989

90+
val args = buildList {
9091
if (target == JniTarget.LINUX_X64) {
91-
args("-fuse-ld=lld")
92-
args("--sysroot=build/sysroot/")
92+
add("-fuse-ld=lld")
93+
add("--sysroot=build/sysroot/")
9394
}
9495

9596
if (target == JniTarget.LINUX_ARM) {
9697
val gccParent = layout.buildDirectory.dir("sysroot/usr/lib/gcc/aarch64-linux-gnu")
9798
val gccPath = filePath(gccParent.get().asFile.listFiles().single())
9899

99-
args("-fuse-ld=lld")
100-
args("--sysroot=build/sysroot/usr/aarch64-linux-gnu/")
101-
args("-Wl,-L", gccPath)
102-
args("-B", gccPath)
100+
add("-fuse-ld=lld")
101+
add("--sysroot=build/sysroot/usr/aarch64-linux-gnu/")
102+
add("-Wl,-L")
103+
add(gccPath)
104+
add("-B")
105+
add(gccPath)
103106
}
104107

108+
toolchain.orNull?.let { add("-B$toolchain") }
109+
110+
add("-shared")
111+
add("-fPIC")
112+
add(when (target) {
113+
JniTarget.LINUX_ARM -> "--target=aarch64-pc-linux"
114+
JniTarget.LINUX_X64 -> "--target=x86_64-pc-linux"
115+
JniTarget.MACOS_ARM -> "--target=aarch64-apple-macos"
116+
JniTarget.MACOS_X64 -> "--target=x86_64-apple-macos"
117+
JniTarget.WINDOWS_ARM -> "--target=aarch64-w64-mingw32uwp"
118+
JniTarget.WINDOWS_X64 -> "--target=x86_64-w64-mingw32uwp"
119+
})
120+
add("-o")
121+
add(filePath(sharedLibrary.get().asFile))
122+
inputFiles.files.forEach { add(filePath(it)) }
123+
add("-I")
124+
add(filePath(include.get().asFile))
125+
add("-I")
126+
add("jni/headers/common")
127+
add("-I")
128+
add(when (target) {
129+
JniTarget.LINUX_X64, JniTarget.LINUX_ARM -> "jni/headers/inc_linux"
130+
JniTarget.MACOS_X64, JniTarget.MACOS_ARM -> "jni/headers/inc_mac"
131+
JniTarget.WINDOWS_X64, JniTarget.WINDOWS_ARM -> "jni/headers/inc_win"
132+
})
133+
add("-O3")
134+
addAll(ClangCompile.sqlite3ClangOptions)
135+
}
136+
137+
val execProvider = providers.exec {
138+
this.workingDir = workingDir
105139
executable = clang
106-
toolchain.orNull?.let { args("-B$toolchain") }
107-
108-
args(
109-
"-shared",
110-
"-fPIC",
111-
when (target) {
112-
JniTarget.LINUX_ARM -> "--target=aarch64-pc-linux"
113-
JniTarget.LINUX_X64 -> "--target=x86_64-pc-linux"
114-
JniTarget.MACOS_ARM -> "--target=aarch64-apple-macos"
115-
JniTarget.MACOS_X64 -> "--target=x86_64-apple-macos"
116-
JniTarget.WINDOWS_ARM -> "--target=aarch64-w64-mingw32uwp"
117-
JniTarget.WINDOWS_X64 -> "--target=x86_64-w64-mingw32uwp"
118-
},
119-
"-o",
120-
filePath(sharedLibrary.get().asFile),
121-
*inputFiles.files.map { filePath(it) }.toTypedArray(),
122-
"-I",
123-
filePath(include.get().asFile),
124-
"-I",
125-
"jni/headers/common",
126-
"-I",
127-
when (target) {
128-
JniTarget.LINUX_X64, JniTarget.LINUX_ARM -> "jni/headers/inc_linux"
129-
JniTarget.MACOS_X64, JniTarget.MACOS_ARM -> "jni/headers/inc_mac"
130-
JniTarget.WINDOWS_X64, JniTarget.WINDOWS_ARM -> "jni/headers/inc_win"
131-
},
132-
"-O3",
133-
*ClangCompile.sqlite3ClangOptions,
134-
)
135-
}.result.get()
140+
args(args)
141+
142+
isIgnoreExitValue = true // So that we can provide better error messages
143+
}
144+
145+
try {
146+
execProvider.result.get().assertNormalExitValue()
147+
} catch (_: ProcessExecutionException) {
148+
val formattedArgs = args.joinToString(separator = " ") { "\"$it\"" }
149+
val stderr = execProvider.standardError.asText.orNull
150+
151+
throw ProcessExecutionException("Could not start $clang $formattedArgs. Stderr: $stderr")
152+
}
136153
}
137154
}

0 commit comments

Comments
 (0)