index.js 7.0 KB

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