index.js 6.8 KB

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