@@ -16,6 +16,8 @@ import org.gradle.api.tasks.OutputFile
1616import org.gradle.api.tasks.PathSensitive
1717import org.gradle.api.tasks.PathSensitivity
1818import org.gradle.api.tasks.TaskAction
19+ import org.gradle.process.ProcessExecutionException
20+ import org.gradle.process.internal.ExecException
1921import java.io.File
2022import 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