index.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. // Copyright 2019-2023 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. const { existsSync, readFileSync } = require('fs')
  5. const { join } = require('path')
  6. const { platform, arch } = process
  7. let nativeBinding = null
  8. let localFileExisted = false
  9. let loadError = null
  10. function isMusl() {
  11. // For Node 10
  12. if (!process.report || typeof process.report.getReport !== 'function') {
  13. try {
  14. const lddPath = require('child_process').execSync('which ldd').toString().trim();
  15. return readFileSync(lddPath, 'utf8').includes('musl')
  16. } catch (e) {
  17. return true
  18. }
  19. } else {
  20. const { glibcVersionRuntime } = process.report.getReport().header
  21. return !glibcVersionRuntime
  22. }
  23. }
  24. switch (platform) {
  25. case 'android':
  26. switch (arch) {
  27. case 'arm64':
  28. localFileExisted = existsSync(join(__dirname, 'cli.android-arm64.node'))
  29. try {
  30. if (localFileExisted) {
  31. nativeBinding = require('./cli.android-arm64.node')
  32. } else {
  33. nativeBinding = require('@tauri-apps/cli-android-arm64')
  34. }
  35. } catch (e) {
  36. loadError = e
  37. }
  38. break
  39. case 'arm':
  40. localFileExisted = existsSync(join(__dirname, 'cli.android-arm-eabi.node'))
  41. try {
  42. if (localFileExisted) {
  43. nativeBinding = require('./cli.android-arm-eabi.node')
  44. } else {
  45. nativeBinding = require('@tauri-apps/cli-android-arm-eabi')
  46. }
  47. } catch (e) {
  48. loadError = e
  49. }
  50. break
  51. default:
  52. throw new Error(`Unsupported architecture on Android ${arch}`)
  53. }
  54. break
  55. case 'win32':
  56. switch (arch) {
  57. case 'x64':
  58. localFileExisted = existsSync(
  59. join(__dirname, 'cli.win32-x64-msvc.node')
  60. )
  61. try {
  62. if (localFileExisted) {
  63. nativeBinding = require('./cli.win32-x64-msvc.node')
  64. } else {
  65. nativeBinding = require('@tauri-apps/cli-win32-x64-msvc')
  66. }
  67. } catch (e) {
  68. loadError = e
  69. }
  70. break
  71. case 'ia32':
  72. localFileExisted = existsSync(
  73. join(__dirname, 'cli.win32-ia32-msvc.node')
  74. )
  75. try {
  76. if (localFileExisted) {
  77. nativeBinding = require('./cli.win32-ia32-msvc.node')
  78. } else {
  79. nativeBinding = require('@tauri-apps/cli-win32-ia32-msvc')
  80. }
  81. } catch (e) {
  82. loadError = e
  83. }
  84. break
  85. case 'arm64':
  86. localFileExisted = existsSync(
  87. join(__dirname, 'cli.win32-arm64-msvc.node')
  88. )
  89. try {
  90. if (localFileExisted) {
  91. nativeBinding = require('./cli.win32-arm64-msvc.node')
  92. } else {
  93. nativeBinding = require('@tauri-apps/cli-win32-arm64-msvc')
  94. }
  95. } catch (e) {
  96. loadError = e
  97. }
  98. break
  99. default:
  100. throw new Error(`Unsupported architecture on Windows: ${arch}`)
  101. }
  102. break
  103. case 'darwin':
  104. localFileExisted = existsSync(join(__dirname, 'cli.darwin-universal.node'))
  105. try {
  106. if (localFileExisted) {
  107. nativeBinding = require('./cli.darwin-universal.node')
  108. } else {
  109. nativeBinding = require('@tauri-apps/cli-darwin-universal')
  110. }
  111. break
  112. } catch {}
  113. switch (arch) {
  114. case 'x64':
  115. localFileExisted = existsSync(join(__dirname, 'cli.darwin-x64.node'))
  116. try {
  117. if (localFileExisted) {
  118. nativeBinding = require('./cli.darwin-x64.node')
  119. } else {
  120. nativeBinding = require('@tauri-apps/cli-darwin-x64')
  121. }
  122. } catch (e) {
  123. loadError = e
  124. }
  125. break
  126. case 'arm64':
  127. localFileExisted = existsSync(
  128. join(__dirname, 'cli.darwin-arm64.node')
  129. )
  130. try {
  131. if (localFileExisted) {
  132. nativeBinding = require('./cli.darwin-arm64.node')
  133. } else {
  134. nativeBinding = require('@tauri-apps/cli-darwin-arm64')
  135. }
  136. } catch (e) {
  137. loadError = e
  138. }
  139. break
  140. default:
  141. throw new Error(`Unsupported architecture on macOS: ${arch}`)
  142. }
  143. break
  144. case 'freebsd':
  145. if (arch !== 'x64') {
  146. throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
  147. }
  148. localFileExisted = existsSync(join(__dirname, 'cli.freebsd-x64.node'))
  149. try {
  150. if (localFileExisted) {
  151. nativeBinding = require('./cli.freebsd-x64.node')
  152. } else {
  153. nativeBinding = require('@tauri-apps/cli-freebsd-x64')
  154. }
  155. } catch (e) {
  156. loadError = e
  157. }
  158. break
  159. case 'linux':
  160. switch (arch) {
  161. case 'x64':
  162. if (isMusl()) {
  163. localFileExisted = existsSync(
  164. join(__dirname, 'cli.linux-x64-musl.node')
  165. )
  166. try {
  167. if (localFileExisted) {
  168. nativeBinding = require('./cli.linux-x64-musl.node')
  169. } else {
  170. nativeBinding = require('@tauri-apps/cli-linux-x64-musl')
  171. }
  172. } catch (e) {
  173. loadError = e
  174. }
  175. } else {
  176. localFileExisted = existsSync(
  177. join(__dirname, 'cli.linux-x64-gnu.node')
  178. )
  179. try {
  180. if (localFileExisted) {
  181. nativeBinding = require('./cli.linux-x64-gnu.node')
  182. } else {
  183. nativeBinding = require('@tauri-apps/cli-linux-x64-gnu')
  184. }
  185. } catch (e) {
  186. loadError = e
  187. }
  188. }
  189. break
  190. case 'arm64':
  191. if (isMusl()) {
  192. localFileExisted = existsSync(
  193. join(__dirname, 'cli.linux-arm64-musl.node')
  194. )
  195. try {
  196. if (localFileExisted) {
  197. nativeBinding = require('./cli.linux-arm64-musl.node')
  198. } else {
  199. nativeBinding = require('@tauri-apps/cli-linux-arm64-musl')
  200. }
  201. } catch (e) {
  202. loadError = e
  203. }
  204. } else {
  205. localFileExisted = existsSync(
  206. join(__dirname, 'cli.linux-arm64-gnu.node')
  207. )
  208. try {
  209. if (localFileExisted) {
  210. nativeBinding = require('./cli.linux-arm64-gnu.node')
  211. } else {
  212. nativeBinding = require('@tauri-apps/cli-linux-arm64-gnu')
  213. }
  214. } catch (e) {
  215. loadError = e
  216. }
  217. }
  218. break
  219. case 'arm':
  220. localFileExisted = existsSync(
  221. join(__dirname, 'cli.linux-arm-gnueabihf.node')
  222. )
  223. try {
  224. if (localFileExisted) {
  225. nativeBinding = require('./cli.linux-arm-gnueabihf.node')
  226. } else {
  227. nativeBinding = require('@tauri-apps/cli-linux-arm-gnueabihf')
  228. }
  229. } catch (e) {
  230. loadError = e
  231. }
  232. break
  233. default:
  234. throw new Error(`Unsupported architecture on Linux: ${arch}`)
  235. }
  236. break
  237. default:
  238. throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
  239. }
  240. if (!nativeBinding) {
  241. if (loadError) {
  242. throw loadError
  243. }
  244. throw new Error(`Failed to load native binding`)
  245. }
  246. const { run, logError } = nativeBinding
  247. module.exports.run = run
  248. module.exports.logError = logError