index.js 6.6 KB

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