rubygems-update 3.3.18 → 3.4.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (615) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1429 -1064
  3. data/CONTRIBUTING.md +31 -8
  4. data/Manifest.txt +61 -36
  5. data/POLICIES.md +55 -20
  6. data/README.md +19 -6
  7. data/bundler/CHANGELOG.md +457 -1
  8. data/bundler/README.md +3 -6
  9. data/bundler/UPGRADING.md +11 -4
  10. data/bundler/bundler.gemspec +8 -10
  11. data/bundler/exe/bundle +5 -16
  12. data/bundler/lib/bundler/build_metadata.rb +2 -2
  13. data/bundler/lib/bundler/cli/add.rb +1 -1
  14. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +2 -0
  17. data/bundler/lib/bundler/cli/console.rb +2 -2
  18. data/bundler/lib/bundler/cli/doctor.rb +4 -6
  19. data/bundler/lib/bundler/cli/gem.rb +62 -40
  20. data/bundler/lib/bundler/cli/info.rb +1 -1
  21. data/bundler/lib/bundler/cli/init.rb +6 -2
  22. data/bundler/lib/bundler/cli/install.rb +8 -6
  23. data/bundler/lib/bundler/cli/lock.rb +8 -5
  24. data/bundler/lib/bundler/cli/open.rb +6 -4
  25. data/bundler/lib/bundler/cli/outdated.rb +14 -7
  26. data/bundler/lib/bundler/cli/platform.rb +7 -5
  27. data/bundler/lib/bundler/cli/viz.rb +1 -1
  28. data/bundler/lib/bundler/cli.rb +53 -7
  29. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
  30. data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
  31. data/bundler/lib/bundler/constants.rb +1 -1
  32. data/bundler/lib/bundler/current_ruby.rb +16 -5
  33. data/bundler/lib/bundler/definition.rb +262 -133
  34. data/bundler/lib/bundler/dependency.rb +20 -86
  35. data/bundler/lib/bundler/digest.rb +1 -1
  36. data/bundler/lib/bundler/dsl.rb +6 -7
  37. data/bundler/lib/bundler/endpoint_specification.rb +2 -13
  38. data/bundler/lib/bundler/env.rb +2 -2
  39. data/bundler/lib/bundler/environment_preserver.rb +3 -2
  40. data/bundler/lib/bundler/errors.rb +1 -11
  41. data/bundler/lib/bundler/feature_flag.rb +0 -2
  42. data/bundler/lib/bundler/fetcher/compact_index.rb +11 -13
  43. data/bundler/lib/bundler/fetcher/dependency.rb +2 -6
  44. data/bundler/lib/bundler/fetcher/downloader.rb +4 -5
  45. data/bundler/lib/bundler/fetcher/index.rb +1 -2
  46. data/bundler/lib/bundler/fetcher.rb +21 -15
  47. data/bundler/lib/bundler/force_platform.rb +18 -0
  48. data/bundler/lib/bundler/friendly_errors.rb +1 -4
  49. data/bundler/lib/bundler/gem_helper.rb +3 -4
  50. data/bundler/lib/bundler/gem_helpers.rb +7 -2
  51. data/bundler/lib/bundler/gem_version_promoter.rb +53 -98
  52. data/bundler/lib/bundler/graph.rb +3 -3
  53. data/bundler/lib/bundler/index.rb +13 -47
  54. data/bundler/lib/bundler/injector.rb +5 -4
  55. data/bundler/lib/bundler/inline.rb +9 -11
  56. data/bundler/lib/bundler/installer/parallel_installer.rb +4 -34
  57. data/bundler/lib/bundler/installer/standalone.rb +13 -9
  58. data/bundler/lib/bundler/installer.rb +17 -29
  59. data/bundler/lib/bundler/lazy_specification.rb +54 -53
  60. data/bundler/lib/bundler/lockfile_generator.rb +3 -3
  61. data/bundler/lib/bundler/lockfile_parser.rb +17 -16
  62. data/bundler/lib/bundler/man/bundle-add.1 +6 -2
  63. data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
  64. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  65. data/bundler/lib/bundler/man/bundle-cache.1 +9 -3
  66. data/bundler/lib/bundler/man/bundle-cache.1.ronn +9 -2
  67. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  68. data/bundler/lib/bundler/man/bundle-clean.1 +2 -2
  69. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  70. data/bundler/lib/bundler/man/bundle-config.1 +26 -10
  71. data/bundler/lib/bundler/man/bundle-config.1.ronn +17 -10
  72. data/bundler/lib/bundler/man/bundle-console.1 +53 -0
  73. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  74. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  75. data/bundler/lib/bundler/man/bundle-exec.1 +6 -6
  76. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -6
  77. data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
  78. data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
  79. data/bundler/lib/bundler/man/bundle-help.1 +13 -0
  80. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  81. data/bundler/lib/bundler/man/bundle-info.1 +3 -3
  82. data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
  83. data/bundler/lib/bundler/man/bundle-init.1 +5 -1
  84. data/bundler/lib/bundler/man/bundle-init.1.ronn +2 -0
  85. data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
  86. data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
  87. data/bundler/lib/bundler/man/bundle-install.1 +5 -30
  88. data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -29
  89. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  90. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  91. data/bundler/lib/bundler/man/bundle-open.1 +22 -2
  92. data/bundler/lib/bundler/man/bundle-open.1.ronn +9 -1
  93. data/bundler/lib/bundler/man/bundle-outdated.1 +13 -9
  94. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
  95. data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
  96. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  97. data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
  98. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  99. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  100. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  101. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  102. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  103. data/bundler/lib/bundler/man/bundle-version.1 +35 -0
  104. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  105. data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
  106. data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
  107. data/bundler/lib/bundler/man/bundle.1 +15 -10
  108. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  109. data/bundler/lib/bundler/man/gemfile.5 +55 -55
  110. data/bundler/lib/bundler/man/gemfile.5.ronn +57 -53
  111. data/bundler/lib/bundler/man/index.txt +4 -0
  112. data/bundler/lib/bundler/match_metadata.rb +13 -0
  113. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  114. data/bundler/lib/bundler/mirror.rb +5 -7
  115. data/bundler/lib/bundler/plugin/index.rb +5 -5
  116. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  117. data/bundler/lib/bundler/plugin/installer.rb +5 -2
  118. data/bundler/lib/bundler/plugin.rb +3 -1
  119. data/bundler/lib/bundler/remote_specification.rb +7 -12
  120. data/bundler/lib/bundler/resolver/base.rb +107 -0
  121. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  122. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  123. data/bundler/lib/bundler/resolver/package.rb +72 -0
  124. data/bundler/lib/bundler/resolver/root.rb +25 -0
  125. data/bundler/lib/bundler/resolver/spec_group.rb +42 -71
  126. data/bundler/lib/bundler/resolver.rb +335 -328
  127. data/bundler/lib/bundler/ruby_dsl.rb +7 -1
  128. data/bundler/lib/bundler/ruby_version.rb +8 -8
  129. data/bundler/lib/bundler/rubygems_ext.rb +100 -9
  130. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -14
  131. data/bundler/lib/bundler/rubygems_integration.rb +11 -15
  132. data/bundler/lib/bundler/runtime.rb +2 -6
  133. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  134. data/bundler/lib/bundler/settings.rb +5 -11
  135. data/bundler/lib/bundler/setup.rb +4 -1
  136. data/bundler/lib/bundler/shared_helpers.rb +3 -3
  137. data/bundler/lib/bundler/source/git/git_proxy.rb +237 -74
  138. data/bundler/lib/bundler/source/git.rb +55 -30
  139. data/bundler/lib/bundler/source/metadata.rb +1 -2
  140. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  141. data/bundler/lib/bundler/source/path.rb +6 -6
  142. data/bundler/lib/bundler/source/rubygems.rb +26 -81
  143. data/bundler/lib/bundler/source.rb +1 -1
  144. data/bundler/lib/bundler/source_list.rb +8 -2
  145. data/bundler/lib/bundler/spec_set.rb +60 -37
  146. data/bundler/lib/bundler/templates/Executable +1 -1
  147. data/bundler/lib/bundler/templates/Executable.bundler +5 -10
  148. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  149. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  150. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  151. data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
  152. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +12 -1
  153. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  154. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  155. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  156. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  157. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  158. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  159. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  160. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  161. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  162. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  163. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +9 -2
  164. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  165. data/bundler/lib/bundler/ui/shell.rb +35 -12
  166. data/bundler/lib/bundler/ui/silent.rb +21 -5
  167. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  168. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  169. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  170. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  171. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1351 -409
  172. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  173. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  174. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  175. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  176. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  177. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  178. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  179. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  180. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  181. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  182. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  184. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  185. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  186. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  187. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  188. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  189. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  190. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  192. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  193. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  194. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  195. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  196. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  197. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  198. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  199. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  200. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  201. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +15 -9
  202. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +11 -6
  203. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  204. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  205. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  206. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  207. data/bundler/lib/bundler/vendored_persistent.rb +1 -33
  208. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  209. data/bundler/lib/bundler/version.rb +5 -1
  210. data/bundler/lib/bundler/worker.rb +5 -7
  211. data/bundler/lib/bundler.rb +25 -77
  212. data/{bin → exe}/gem +4 -5
  213. data/{bin → exe}/update_rubygems +12 -10
  214. data/lib/rubygems/available_set.rb +4 -3
  215. data/lib/rubygems/basic_specification.rb +5 -4
  216. data/lib/rubygems/bundler_version_finder.rb +2 -2
  217. data/lib/rubygems/command.rb +41 -32
  218. data/lib/rubygems/command_manager.rb +30 -15
  219. data/lib/rubygems/commands/build_command.rb +12 -8
  220. data/lib/rubygems/commands/cert_command.rb +34 -33
  221. data/lib/rubygems/commands/check_command.rb +21 -20
  222. data/lib/rubygems/commands/cleanup_command.rb +18 -17
  223. data/lib/rubygems/commands/contents_command.rb +14 -13
  224. data/lib/rubygems/commands/dependency_command.rb +17 -16
  225. data/lib/rubygems/commands/environment_command.rb +6 -5
  226. data/lib/rubygems/commands/exec_command.rb +249 -0
  227. data/lib/rubygems/commands/fetch_command.rb +10 -9
  228. data/lib/rubygems/commands/generate_index_command.rb +18 -17
  229. data/lib/rubygems/commands/help_command.rb +7 -6
  230. data/lib/rubygems/commands/info_command.rb +3 -3
  231. data/lib/rubygems/commands/install_command.rb +28 -23
  232. data/lib/rubygems/commands/list_command.rb +4 -3
  233. data/lib/rubygems/commands/lock_command.rb +5 -4
  234. data/lib/rubygems/commands/mirror_command.rb +4 -3
  235. data/lib/rubygems/commands/open_command.rb +10 -9
  236. data/lib/rubygems/commands/outdated_command.rb +6 -5
  237. data/lib/rubygems/commands/owner_command.rb +17 -14
  238. data/lib/rubygems/commands/pristine_command.rb +46 -36
  239. data/lib/rubygems/commands/push_command.rb +9 -8
  240. data/lib/rubygems/commands/query_command.rb +9 -8
  241. data/lib/rubygems/commands/rdoc_command.rb +21 -19
  242. data/lib/rubygems/commands/search_command.rb +4 -3
  243. data/lib/rubygems/commands/server_command.rb +4 -3
  244. data/lib/rubygems/commands/setup_command.rb +97 -106
  245. data/lib/rubygems/commands/signin_command.rb +10 -9
  246. data/lib/rubygems/commands/signout_command.rb +8 -7
  247. data/lib/rubygems/commands/sources_command.rb +22 -21
  248. data/lib/rubygems/commands/specification_command.rb +14 -13
  249. data/lib/rubygems/commands/stale_command.rb +3 -2
  250. data/lib/rubygems/commands/uninstall_command.rb +44 -40
  251. data/lib/rubygems/commands/unpack_command.rb +14 -13
  252. data/lib/rubygems/commands/update_command.rb +42 -63
  253. data/lib/rubygems/commands/which_command.rb +8 -7
  254. data/lib/rubygems/commands/yank_command.rb +12 -11
  255. data/lib/rubygems/config_file.rb +55 -21
  256. data/lib/rubygems/core_ext/kernel_gem.rb +1 -6
  257. data/lib/rubygems/core_ext/kernel_require.rb +109 -115
  258. data/lib/rubygems/core_ext/kernel_warn.rb +33 -37
  259. data/lib/rubygems/core_ext/tcpsocket_init.rb +3 -1
  260. data/lib/rubygems/defaults.rb +33 -18
  261. data/lib/rubygems/dependency.rb +15 -11
  262. data/lib/rubygems/dependency_installer.rb +38 -37
  263. data/lib/rubygems/dependency_list.rb +7 -6
  264. data/lib/rubygems/deprecate.rb +3 -2
  265. data/lib/rubygems/doctor.rb +19 -18
  266. data/lib/rubygems/errors.rb +3 -2
  267. data/lib/rubygems/exceptions.rb +16 -8
  268. data/lib/rubygems/ext/build_error.rb +2 -1
  269. data/lib/rubygems/ext/builder.rb +37 -21
  270. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  271. data/lib/rubygems/ext/cargo_builder.rb +150 -111
  272. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  273. data/lib/rubygems/ext/configure_builder.rb +2 -1
  274. data/lib/rubygems/ext/ext_conf_builder.rb +11 -9
  275. data/lib/rubygems/ext/rake_builder.rb +7 -5
  276. data/lib/rubygems/ext.rb +8 -7
  277. data/lib/rubygems/gem_runner.rb +6 -5
  278. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  279. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  280. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  281. data/lib/rubygems/gemcutter_utilities.rb +90 -34
  282. data/lib/rubygems/indexer.rb +29 -28
  283. data/lib/rubygems/install_default_message.rb +3 -2
  284. data/lib/rubygems/install_message.rb +3 -2
  285. data/lib/rubygems/install_update_options.rb +56 -55
  286. data/lib/rubygems/installer.rb +54 -46
  287. data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
  288. data/lib/rubygems/local_remote_options.rb +19 -20
  289. data/lib/rubygems/mock_gem_ui.rb +3 -2
  290. data/lib/rubygems/name_tuple.rb +5 -4
  291. data/lib/rubygems/optparse/lib/optparse.rb +20 -15
  292. data/lib/rubygems/optparse.rb +1 -1
  293. data/lib/rubygems/package/digest_io.rb +1 -0
  294. data/lib/rubygems/package/file_source.rb +3 -2
  295. data/lib/rubygems/package/io_source.rb +1 -0
  296. data/lib/rubygems/package/old.rb +9 -8
  297. data/lib/rubygems/package/source.rb +1 -0
  298. data/lib/rubygems/package/tar_header.rb +63 -62
  299. data/lib/rubygems/package/tar_reader/entry.rb +91 -9
  300. data/lib/rubygems/package/tar_reader.rb +2 -29
  301. data/lib/rubygems/package/tar_writer.rb +8 -7
  302. data/lib/rubygems/package.rb +64 -48
  303. data/lib/rubygems/package_task.rb +5 -4
  304. data/lib/rubygems/path_support.rb +1 -0
  305. data/lib/rubygems/platform.rb +79 -53
  306. data/lib/rubygems/psych_tree.rb +2 -1
  307. data/lib/rubygems/query_utils.rb +35 -35
  308. data/lib/rubygems/rdoc.rb +3 -2
  309. data/lib/rubygems/remote_fetcher.rb +23 -22
  310. data/lib/rubygems/request/connection_pools.rb +4 -4
  311. data/lib/rubygems/request/http_pool.rb +2 -1
  312. data/lib/rubygems/request/https_pool.rb +1 -0
  313. data/lib/rubygems/request.rb +23 -22
  314. data/lib/rubygems/request_set/gem_dependency_api.rb +123 -123
  315. data/lib/rubygems/request_set/lockfile/parser.rb +28 -27
  316. data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -3
  317. data/lib/rubygems/request_set/lockfile.rb +6 -5
  318. data/lib/rubygems/request_set.rb +20 -19
  319. data/lib/rubygems/requirement.rb +15 -14
  320. data/lib/rubygems/resolver/activation_request.rb +4 -3
  321. data/lib/rubygems/resolver/api_set.rb +5 -4
  322. data/lib/rubygems/resolver/api_specification.rb +7 -6
  323. data/lib/rubygems/resolver/best_set.rb +6 -5
  324. data/lib/rubygems/resolver/composed_set.rb +1 -0
  325. data/lib/rubygems/resolver/conflict.rb +11 -10
  326. data/lib/rubygems/resolver/current_set.rb +1 -0
  327. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  328. data/lib/rubygems/resolver/git_set.rb +3 -2
  329. data/lib/rubygems/resolver/git_specification.rb +7 -6
  330. data/lib/rubygems/resolver/index_set.rb +4 -3
  331. data/lib/rubygems/resolver/index_specification.rb +7 -5
  332. data/lib/rubygems/resolver/installed_specification.rb +5 -4
  333. data/lib/rubygems/resolver/installer_set.rb +15 -17
  334. data/lib/rubygems/resolver/local_specification.rb +3 -2
  335. data/lib/rubygems/resolver/lock_set.rb +5 -4
  336. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  337. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
  338. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
  339. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  340. data/lib/rubygems/resolver/molinillo.rb +2 -1
  341. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  342. data/lib/rubygems/resolver/set.rb +1 -0
  343. data/lib/rubygems/resolver/source_set.rb +2 -0
  344. data/lib/rubygems/resolver/spec_specification.rb +1 -0
  345. data/lib/rubygems/resolver/specification.rb +2 -1
  346. data/lib/rubygems/resolver/stats.rb +2 -1
  347. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  348. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  349. data/lib/rubygems/resolver.rb +41 -40
  350. data/lib/rubygems/s3_uri_signer.rb +10 -8
  351. data/lib/rubygems/safe_yaml.rb +4 -2
  352. data/lib/rubygems/security/policies.rb +48 -47
  353. data/lib/rubygems/security/policy.rb +19 -18
  354. data/lib/rubygems/security/signer.rb +6 -5
  355. data/lib/rubygems/security/trust_dir.rb +5 -4
  356. data/lib/rubygems/security.rb +30 -42
  357. data/lib/rubygems/security_option.rb +6 -5
  358. data/lib/rubygems/shellwords.rb +3 -0
  359. data/lib/rubygems/source/git.rb +22 -22
  360. data/lib/rubygems/source/installed.rb +2 -1
  361. data/lib/rubygems/source/local.rb +3 -2
  362. data/lib/rubygems/source/lock.rb +1 -0
  363. data/lib/rubygems/source/specific_file.rb +2 -1
  364. data/lib/rubygems/source/vendor.rb +1 -0
  365. data/lib/rubygems/source.rb +16 -16
  366. data/lib/rubygems/spec_fetcher.rb +10 -9
  367. data/lib/rubygems/specification.rb +121 -114
  368. data/lib/rubygems/specification_policy.rb +36 -15
  369. data/lib/rubygems/stub_specification.rb +11 -9
  370. data/lib/rubygems/text.rb +2 -2
  371. data/lib/rubygems/tsort/lib/tsort.rb +308 -310
  372. data/lib/rubygems/tsort.rb +1 -1
  373. data/lib/rubygems/uninstaller.rb +19 -18
  374. data/lib/rubygems/update_suggestion.rb +69 -0
  375. data/lib/rubygems/uri.rb +4 -4
  376. data/lib/rubygems/uri_formatter.rb +1 -1
  377. data/lib/rubygems/user_interaction.rb +37 -21
  378. data/lib/rubygems/util/licenses.rb +4 -3
  379. data/lib/rubygems/util/list.rb +1 -0
  380. data/lib/rubygems/util.rb +12 -15
  381. data/lib/rubygems/validator.rb +7 -6
  382. data/lib/rubygems/version.rb +17 -11
  383. data/lib/rubygems/version_option.rb +4 -3
  384. data/lib/rubygems.rb +89 -68
  385. data/rubygems-update.gemspec +10 -8
  386. data/setup.rb +10 -9
  387. data/test/rubygems/alternate_cert.pem +14 -14
  388. data/test/rubygems/alternate_cert_32.pem +15 -15
  389. data/test/rubygems/alternate_key.pem +25 -25
  390. data/test/rubygems/bad_rake.rb +1 -0
  391. data/test/rubygems/bundler_test_gem.rb +421 -0
  392. data/test/rubygems/child_cert.pem +15 -16
  393. data/test/rubygems/child_cert_32.pem +15 -16
  394. data/test/rubygems/child_key.pem +25 -25
  395. data/test/rubygems/encrypted_private_key.pem +26 -26
  396. data/test/rubygems/expired_cert.pem +15 -15
  397. data/test/rubygems/fake_certlib/openssl.rb +1 -0
  398. data/test/rubygems/future_cert.pem +15 -15
  399. data/test/rubygems/future_cert_32.pem +15 -15
  400. data/test/rubygems/good_rake.rb +1 -0
  401. data/test/rubygems/grandchild_cert.pem +15 -16
  402. data/test/rubygems/grandchild_cert_32.pem +15 -16
  403. data/test/rubygems/grandchild_key.pem +25 -25
  404. data/test/rubygems/helper.rb +172 -151
  405. data/test/rubygems/installer_test_case.rb +14 -13
  406. data/test/rubygems/invalid_issuer_cert.pem +16 -16
  407. data/test/rubygems/invalid_issuer_cert_32.pem +16 -16
  408. data/test/rubygems/invalid_key.pem +25 -25
  409. data/test/rubygems/invalid_signer_cert.pem +15 -15
  410. data/test/rubygems/invalid_signer_cert_32.pem +15 -15
  411. data/test/rubygems/invalidchild_cert.pem +15 -16
  412. data/test/rubygems/invalidchild_cert_32.pem +15 -16
  413. data/test/rubygems/invalidchild_key.pem +25 -25
  414. data/test/rubygems/multifactor_auth_utilities.rb +111 -0
  415. data/test/rubygems/package/tar_test_case.rb +53 -17
  416. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  417. data/test/rubygems/plugin/exception/rubygems_plugin.rb +2 -1
  418. data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
  419. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +2 -1
  420. data/test/rubygems/private_key.pem +25 -25
  421. data/test/rubygems/public_cert.pem +16 -16
  422. data/test/rubygems/public_cert_32.pem +15 -15
  423. data/test/rubygems/public_key.pem +7 -7
  424. data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
  425. data/test/rubygems/rubygems_plugin.rb +3 -2
  426. data/test/rubygems/simple_gem.rb +2 -1
  427. data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
  428. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +6 -4
  429. data/test/rubygems/test_bundled_ca.rb +13 -12
  430. data/test/rubygems/test_config.rb +5 -4
  431. data/test/rubygems/test_deprecate.rb +5 -4
  432. data/test/rubygems/test_exit.rb +9 -3
  433. data/test/rubygems/test_gem.rb +339 -677
  434. data/test/rubygems/test_gem_available_set.rb +22 -21
  435. data/test/rubygems/test_gem_bundler_version_finder.rb +6 -4
  436. data/test/rubygems/test_gem_command.rb +45 -44
  437. data/test/rubygems/test_gem_command_manager.rb +96 -30
  438. data/test/rubygems/test_gem_commands_build_command.rb +74 -63
  439. data/test/rubygems/test_gem_commands_cert_command.rb +98 -99
  440. data/test/rubygems/test_gem_commands_check_command.rb +5 -4
  441. data/test/rubygems/test_gem_commands_cleanup_command.rb +41 -40
  442. data/test/rubygems/test_gem_commands_contents_command.rb +28 -27
  443. data/test/rubygems/test_gem_commands_dependency_command.rb +37 -36
  444. data/test/rubygems/test_gem_commands_environment_command.rb +17 -16
  445. data/test/rubygems/test_gem_commands_exec_command.rb +853 -0
  446. data/test/rubygems/test_gem_commands_fetch_command.rb +38 -37
  447. data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -7
  448. data/test/rubygems/test_gem_commands_help_command.rb +14 -13
  449. data/test/rubygems/test_gem_commands_info_command.rb +29 -2
  450. data/test/rubygems/test_gem_commands_install_command.rb +152 -132
  451. data/test/rubygems/test_gem_commands_list_command.rb +5 -4
  452. data/test/rubygems/test_gem_commands_lock_command.rb +11 -10
  453. data/test/rubygems/test_gem_commands_mirror.rb +3 -2
  454. data/test/rubygems/test_gem_commands_open_command.rb +5 -4
  455. data/test/rubygems/test_gem_commands_outdated_command.rb +10 -9
  456. data/test/rubygems/test_gem_commands_owner_command.rb +227 -50
  457. data/test/rubygems/test_gem_commands_pristine_command.rb +142 -93
  458. data/test/rubygems/test_gem_commands_push_command.rb +189 -64
  459. data/test/rubygems/test_gem_commands_query_command.rb +74 -73
  460. data/test/rubygems/test_gem_commands_search_command.rb +3 -2
  461. data/test/rubygems/test_gem_commands_server_command.rb +3 -2
  462. data/test/rubygems/test_gem_commands_setup_command.rb +123 -96
  463. data/test/rubygems/test_gem_commands_signin_command.rb +71 -31
  464. data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
  465. data/test/rubygems/test_gem_commands_sources_command.rb +29 -29
  466. data/test/rubygems/test_gem_commands_specification_command.rb +33 -32
  467. data/test/rubygems/test_gem_commands_stale_command.rb +5 -4
  468. data/test/rubygems/test_gem_commands_uninstall_command.rb +99 -81
  469. data/test/rubygems/test_gem_commands_unpack_command.rb +32 -31
  470. data/test/rubygems/test_gem_commands_update_command.rb +96 -95
  471. data/test/rubygems/test_gem_commands_which_command.rb +7 -6
  472. data/test/rubygems/test_gem_commands_yank_command.rb +162 -43
  473. data/test/rubygems/test_gem_config_file.rb +94 -81
  474. data/test/rubygems/test_gem_dependency.rb +76 -73
  475. data/test/rubygems/test_gem_dependency_installer.rb +200 -165
  476. data/test/rubygems/test_gem_dependency_list.rb +48 -47
  477. data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -4
  478. data/test/rubygems/test_gem_doctor.rb +27 -26
  479. data/test/rubygems/test_gem_ext_builder.rb +60 -61
  480. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +4 -4
  481. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.lock → ext/custom_name_lib/Cargo.lock} +23 -33
  482. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.toml → ext/custom_name_lib/Cargo.toml} +1 -1
  483. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{src → ext/custom_name_lib/src}/lib.rs +1 -1
  484. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +3 -0
  485. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +37 -33
  486. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  487. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
  488. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
  489. data/test/rubygems/test_gem_ext_cargo_builder.rb +48 -59
  490. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +20 -19
  491. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +21 -36
  492. data/test/rubygems/test_gem_ext_cmake_builder.rb +16 -15
  493. data/test/rubygems/test_gem_ext_configure_builder.rb +14 -13
  494. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
  495. data/test/rubygems/test_gem_ext_rake_builder.rb +16 -15
  496. data/test/rubygems/test_gem_gem_runner.rb +15 -9
  497. data/test/rubygems/test_gem_gemcutter_utilities.rb +170 -84
  498. data/test/rubygems/test_gem_impossible_dependencies_error.rb +5 -4
  499. data/test/rubygems/test_gem_indexer.rb +87 -67
  500. data/test/rubygems/test_gem_install_update_options.rb +17 -16
  501. data/test/rubygems/test_gem_installer.rb +422 -304
  502. data/test/rubygems/test_gem_local_remote_options.rb +11 -10
  503. data/test/rubygems/test_gem_name_tuple.rb +5 -4
  504. data/test/rubygems/test_gem_package.rb +243 -231
  505. data/test/rubygems/test_gem_package_old.rb +14 -13
  506. data/test/rubygems/test_gem_package_tar_header.rb +48 -47
  507. data/test/rubygems/test_gem_package_tar_reader.rb +56 -8
  508. data/test/rubygems/test_gem_package_tar_reader_entry.rb +162 -16
  509. data/test/rubygems/test_gem_package_tar_writer.rb +77 -76
  510. data/test/rubygems/test_gem_package_task.rb +19 -18
  511. data/test/rubygems/test_gem_path_support.rb +15 -14
  512. data/test/rubygems/test_gem_platform.rb +333 -227
  513. data/test/rubygems/test_gem_rdoc.rb +15 -14
  514. data/test/rubygems/test_gem_remote_fetcher.rb +155 -154
  515. data/test/rubygems/test_gem_request.rb +64 -58
  516. data/test/rubygems/test_gem_request_connection_pools.rb +30 -29
  517. data/test/rubygems/test_gem_request_set.rb +101 -100
  518. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +210 -211
  519. data/test/rubygems/test_gem_request_set_lockfile.rb +87 -86
  520. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +58 -57
  521. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +63 -62
  522. data/test/rubygems/test_gem_requirement.rb +48 -41
  523. data/test/rubygems/test_gem_resolver.rb +167 -99
  524. data/test/rubygems/test_gem_resolver_activation_request.rb +7 -6
  525. data/test/rubygems/test_gem_resolver_api_set.rb +34 -33
  526. data/test/rubygems/test_gem_resolver_api_specification.rb +48 -47
  527. data/test/rubygems/test_gem_resolver_best_set.rb +23 -22
  528. data/test/rubygems/test_gem_resolver_composed_set.rb +2 -1
  529. data/test/rubygems/test_gem_resolver_conflict.rb +13 -12
  530. data/test/rubygems/test_gem_resolver_dependency_request.rb +16 -15
  531. data/test/rubygems/test_gem_resolver_git_set.rb +22 -21
  532. data/test/rubygems/test_gem_resolver_git_specification.rb +22 -21
  533. data/test/rubygems/test_gem_resolver_index_set.rb +13 -12
  534. data/test/rubygems/test_gem_resolver_index_specification.rb +17 -16
  535. data/test/rubygems/test_gem_resolver_installed_specification.rb +6 -5
  536. data/test/rubygems/test_gem_resolver_installer_set.rb +79 -34
  537. data/test/rubygems/test_gem_resolver_local_specification.rb +8 -7
  538. data/test/rubygems/test_gem_resolver_lock_set.rb +13 -12
  539. data/test/rubygems/test_gem_resolver_lock_specification.rb +18 -17
  540. data/test/rubygems/test_gem_resolver_requirement_list.rb +2 -1
  541. data/test/rubygems/test_gem_resolver_specification.rb +9 -8
  542. data/test/rubygems/test_gem_resolver_vendor_set.rb +7 -6
  543. data/test/rubygems/test_gem_resolver_vendor_specification.rb +11 -10
  544. data/test/rubygems/test_gem_security.rb +69 -68
  545. data/test/rubygems/test_gem_security_policy.rb +72 -72
  546. data/test/rubygems/test_gem_security_signer.rb +35 -34
  547. data/test/rubygems/test_gem_security_trust_dir.rb +7 -6
  548. data/test/rubygems/test_gem_silent_ui.rb +39 -32
  549. data/test/rubygems/test_gem_source.rb +45 -44
  550. data/test/rubygems/test_gem_source_fetch_problem.rb +10 -9
  551. data/test/rubygems/test_gem_source_git.rb +69 -62
  552. data/test/rubygems/test_gem_source_installed.rb +17 -16
  553. data/test/rubygems/test_gem_source_list.rb +6 -5
  554. data/test/rubygems/test_gem_source_local.rb +15 -14
  555. data/test/rubygems/test_gem_source_lock.rb +32 -31
  556. data/test/rubygems/test_gem_source_specific_file.rb +18 -17
  557. data/test/rubygems/test_gem_source_subpath_problem.rb +8 -7
  558. data/test/rubygems/test_gem_source_vendor.rb +14 -13
  559. data/test/rubygems/test_gem_spec_fetcher.rb +73 -72
  560. data/test/rubygems/test_gem_specification.rb +533 -469
  561. data/test/rubygems/test_gem_stream_ui.rb +53 -22
  562. data/test/rubygems/test_gem_stub_specification.rb +33 -32
  563. data/test/rubygems/test_gem_text.rb +2 -1
  564. data/test/rubygems/test_gem_uninstaller.rb +118 -117
  565. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +4 -3
  566. data/test/rubygems/test_gem_update_suggestion.rb +209 -0
  567. data/test/rubygems/test_gem_uri.rb +6 -4
  568. data/test/rubygems/test_gem_uri_formatter.rb +15 -14
  569. data/test/rubygems/test_gem_util.rb +24 -23
  570. data/test/rubygems/test_gem_validator.rb +8 -8
  571. data/test/rubygems/test_gem_version.rb +24 -16
  572. data/test/rubygems/test_gem_version_option.rb +16 -15
  573. data/test/rubygems/test_kernel.rb +43 -48
  574. data/test/rubygems/test_project_sanity.rb +32 -3
  575. data/test/rubygems/test_remote_fetch_error.rb +8 -7
  576. data/test/rubygems/test_require.rb +118 -103
  577. data/test/rubygems/test_rubygems.rb +10 -8
  578. data/test/rubygems/test_webauthn_listener.rb +143 -0
  579. data/test/rubygems/test_webauthn_listener_response.rb +93 -0
  580. data/test/rubygems/test_webauthn_poller.rb +124 -0
  581. data/test/rubygems/utilities.rb +98 -34
  582. data/test/rubygems/wrong_key_cert.pem +15 -15
  583. data/test/rubygems/wrong_key_cert_32.pem +15 -15
  584. data/test/test_changelog_generator.rb +1 -1
  585. metadata +99 -46
  586. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  587. data/bundler/lib/bundler/templates/gems.rb +0 -5
  588. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  589. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  590. data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
  591. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  592. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  593. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  594. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  595. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  596. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  597. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  598. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  599. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  600. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  601. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  602. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  603. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  604. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  605. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  606. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  607. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  608. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  609. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  610. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  611. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  612. data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
  613. data/bundler/lib/bundler/version_ranges.rb +0 -122
  614. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  615. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  #--
3
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
5
  # All rights reserved.
5
6
  # See LICENSE.txt for permissions.
6
7
  #++
7
8
 
8
- require_relative '../user_interaction'
9
+ require_relative "../user_interaction"
10
+ require_relative "../shellwords"
9
11
 
10
12
  class Gem::Ext::Builder
11
13
  include Gem::UserInteraction
@@ -17,30 +19,30 @@ class Gem::Ext::Builder
17
19
  $1.downcase
18
20
  end
19
21
 
20
- def self.make(dest_path, results, make_dir = Dir.pwd, sitedir = nil)
21
- unless File.exist? File.join(make_dir, 'Makefile')
22
- raise Gem::InstallError, 'Makefile not found'
22
+ def self.make(dest_path, results, make_dir = Dir.pwd, sitedir = nil, targets = ["clean", "", "install"])
23
+ unless File.exist? File.join(make_dir, "Makefile")
24
+ raise Gem::InstallError, "Makefile not found"
23
25
  end
24
26
 
25
27
  # try to find make program from Ruby configure arguments first
26
- RbConfig::CONFIG['configure_args'] =~ /with-make-prog\=(\w+)/
27
- make_program_name = ENV['MAKE'] || ENV['make'] || $1
28
+ RbConfig::CONFIG["configure_args"] =~ /with-make-prog\=(\w+)/
29
+ make_program_name = ENV["MAKE"] || ENV["make"] || $1
28
30
  unless make_program_name
29
- make_program_name = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
31
+ make_program_name = (RUBY_PLATFORM.include?("mswin")) ? "nmake" : "make"
30
32
  end
31
33
  make_program = Shellwords.split(make_program_name)
32
34
 
33
35
  # The installation of the bundled gems is failed when DESTDIR is empty in mswin platform.
34
- destdir = (/\bnmake/i !~ make_program_name || ENV['DESTDIR'] && ENV['DESTDIR'] != "") ? 'DESTDIR=%s' % ENV['DESTDIR'] : ''
36
+ destdir = (/\bnmake/i !~ make_program_name || ENV["DESTDIR"] && ENV["DESTDIR"] != "") ? "DESTDIR=%s" % ENV["DESTDIR"] : ""
35
37
 
36
38
  env = [destdir]
37
39
 
38
40
  if sitedir
39
- env << 'sitearchdir=%s' % sitedir
40
- env << 'sitelibdir=%s' % sitedir
41
+ env << "sitearchdir=%s" % sitedir
42
+ env << "sitelibdir=%s" % sitedir
41
43
  end
42
44
 
43
- ['clean', '', 'install'].each do |target|
45
+ targets.each do |target|
44
46
  # Pass DESTDIR via command line to override what's in MAKEFLAGS
45
47
  cmd = [
46
48
  *make_program,
@@ -50,27 +52,42 @@ class Gem::Ext::Builder
50
52
  begin
51
53
  run(cmd, results, "make #{target}".rstrip, make_dir)
52
54
  rescue Gem::InstallError
53
- raise unless target == 'clean' # ignore clean failure
55
+ raise unless target == "clean" # ignore clean failure
54
56
  end
55
57
  end
56
58
  end
57
59
 
60
+ def self.ruby
61
+ # Gem.ruby is quoted if it contains whitespace
62
+ cmd = Shellwords.split(Gem.ruby)
63
+
64
+ # This load_path is only needed when running rubygems test without a proper installation.
65
+ # Prepending it in a normal installation will cause problem with order of $LOAD_PATH.
66
+ # Therefore only add load_path if it is not present in the default $LOAD_PATH.
67
+ load_path = File.expand_path("../..", __dir__)
68
+ case load_path
69
+ when RbConfig::CONFIG["sitelibdir"], RbConfig::CONFIG["vendorlibdir"], RbConfig::CONFIG["rubylibdir"]
70
+ cmd
71
+ else
72
+ cmd << "-I#{load_path}"
73
+ end
74
+ end
75
+
58
76
  def self.run(command, results, command_name = nil, dir = Dir.pwd, env = {})
59
77
  verbose = Gem.configuration.really_verbose
60
78
 
61
79
  begin
62
- rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'], nil
80
+ rubygems_gemdeps, ENV["RUBYGEMS_GEMDEPS"] = ENV["RUBYGEMS_GEMDEPS"], nil
63
81
  if verbose
64
82
  puts("current directory: #{dir}")
65
83
  p(command)
66
84
  end
67
85
  results << "current directory: #{dir}"
68
- require "shellwords"
69
- results << command.shelljoin
86
+ results << Shellwords.join(command)
70
87
 
71
88
  require "open3"
72
89
  # Set $SOURCE_DATE_EPOCH for the subprocess.
73
- build_env = { 'SOURCE_DATE_EPOCH' => Gem.source_date_epoch_string }.merge(env)
90
+ build_env = { "SOURCE_DATE_EPOCH" => Gem.source_date_epoch_string }.merge(env)
74
91
  output, status = begin
75
92
  Open3.capture2e(build_env, *command, :chdir => dir)
76
93
  rescue => error
@@ -82,7 +99,7 @@ class Gem::Ext::Builder
82
99
  results << output
83
100
  end
84
101
  ensure
85
- ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps
102
+ ENV["RUBYGEMS_GEMDEPS"] = rubygems_gemdeps
86
103
  end
87
104
 
88
105
  unless status.success?
@@ -131,8 +148,7 @@ class Gem::Ext::Builder
131
148
  when /CMakeLists.txt/ then
132
149
  Gem::Ext::CmakeBuilder
133
150
  when /Cargo.toml/ then
134
- # We use the spec name here to ensure we invoke the correct init function later
135
- Gem::Ext::CargoBuilder.new(@spec)
151
+ Gem::Ext::CargoBuilder.new
136
152
  else
137
153
  build_error("No builder for extension '#{extension}'")
138
154
  end
@@ -212,11 +228,11 @@ EOF
212
228
  # Writes +output+ to gem_make.out in the extension install directory.
213
229
 
214
230
  def write_gem_make_out(output) # :nodoc:
215
- destination = File.join @spec.extension_dir, 'gem_make.out'
231
+ destination = File.join @spec.extension_dir, "gem_make.out"
216
232
 
217
233
  FileUtils.mkdir_p @spec.extension_dir
218
234
 
219
- File.open destination, 'wb' do |io|
235
+ File.open destination, "wb" do |io|
220
236
  io.puts output
221
237
  end
222
238
 
@@ -3,20 +3,24 @@
3
3
  class Gem::Ext::CargoBuilder < Gem::Ext::Builder
4
4
  # Converts Ruby link flags into something cargo understands
5
5
  class LinkFlagConverter
6
+ FILTERED_PATTERNS = [
7
+ /compress-debug-sections/, # Not supported by all linkers, and not required for Rust
8
+ ].freeze
9
+
6
10
  def self.convert(arg)
11
+ return [] if FILTERED_PATTERNS.any? {|p| p.match?(arg) }
12
+
7
13
  case arg.chomp
8
14
  when /^-L\s*(.+)$/
9
15
  ["-L", "native=#{$1}"]
10
16
  when /^--library=(\w+\S+)$/, /^-l\s*(\w+\S+)$/
11
17
  ["-l", $1]
12
- when /^-l\s*:lib(\S+).a$/
13
- ["-l", "static=#{$1}"]
14
- when /^-l\s*:lib(\S+).(so|dylib|dll)$/
15
- ["-l", "dylib=#{$1}"]
18
+ when /^-l\s*([^:\s])+/ # -lfoo, but not -l:libfoo.a
19
+ ["-l", $1]
16
20
  when /^-F\s*(.*)$/
17
21
  ["-l", "framework=#{$1}"]
18
22
  else
19
- ["-C", "link_arg=#{arg}"]
23
+ ["-C", "link-args=#{arg}"]
20
24
  end
21
25
  end
22
26
  end
@@ -1,80 +1,132 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../shellwords"
4
+
3
5
  # This class is used by rubygems to build Rust extensions. It is a thin-wrapper
4
6
  # over the `cargo rustc` command which takes care of building Rust code in a way
5
7
  # that Ruby can use.
6
8
  class Gem::Ext::CargoBuilder < Gem::Ext::Builder
7
9
  attr_accessor :spec, :runner, :profile
8
10
 
9
- def initialize(spec)
11
+ def initialize
10
12
  require_relative "../command"
11
13
  require_relative "cargo_builder/link_flag_converter"
12
14
 
13
- @spec = spec
14
15
  @runner = self.class.method(:run)
15
16
  @profile = :release
16
17
  end
17
18
 
18
- def build(_extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd)
19
+ def build(extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd)
20
+ require "tempfile"
19
21
  require "fileutils"
20
- require "shellwords"
21
22
 
22
- build_crate(dest_path, results, args, cargo_dir)
23
- validate_cargo_build!(dest_path)
24
- rename_cdylib_for_ruby_compatibility(dest_path)
25
- finalize_directory(dest_path, lib_dir, cargo_dir)
26
- results
27
- end
23
+ # Where's the Cargo.toml of the crate we're building
24
+ cargo_toml = File.join(cargo_dir, "Cargo.toml")
25
+ # What's the crate's name
26
+ crate_name = cargo_crate_name(cargo_dir, cargo_toml, results)
27
+
28
+ begin
29
+ # Create a tmp dir to do the build in
30
+ tmp_dest = Dir.mktmpdir(".gem.", cargo_dir)
31
+
32
+ # Run the build
33
+ cmd = cargo_command(cargo_toml, tmp_dest, args, crate_name)
34
+ runner.call(cmd, results, "cargo", cargo_dir, build_env)
35
+
36
+ # Where do we expect Cargo to write the compiled library
37
+ dylib_path = cargo_dylib_path(tmp_dest, crate_name)
38
+
39
+ # Helpful error if we didn't find the compiled library
40
+ raise DylibNotFoundError, tmp_dest unless File.exist?(dylib_path)
28
41
 
29
- def build_crate(dest_path, results, args, cargo_dir)
30
- env = build_env
31
- cmd = cargo_command(cargo_dir, dest_path, args)
32
- runner.call cmd, results, 'cargo', cargo_dir, env
42
+ # Cargo and Ruby differ on how the library should be named, rename from
43
+ # what Cargo outputs to what Ruby expects
44
+ dlext_name = "#{crate_name}.#{makefile_config("DLEXT")}"
45
+ dlext_path = File.join(File.dirname(dylib_path), dlext_name)
46
+ FileUtils.cp(dylib_path, dlext_path)
47
+
48
+ nesting = extension_nesting(extension)
49
+
50
+ # TODO: remove in RubyGems 4
51
+ if Gem.install_extension_in_lib && lib_dir
52
+ nested_lib_dir = File.join(lib_dir, nesting)
53
+ FileUtils.mkdir_p nested_lib_dir
54
+ FileUtils.cp_r dlext_path, nested_lib_dir, remove_destination: true
55
+ end
56
+
57
+ # move to final destination
58
+ nested_dest_path = File.join(dest_path, nesting)
59
+ FileUtils.mkdir_p nested_dest_path
60
+ FileUtils.cp_r dlext_path, nested_dest_path, remove_destination: true
61
+ ensure
62
+ # clean up intermediary build artifacts
63
+ FileUtils.rm_rf tmp_dest if tmp_dest
64
+ end
33
65
 
34
66
  results
35
67
  end
36
68
 
37
69
  def build_env
38
70
  build_env = rb_config_env
39
- build_env["RUBY_STATIC"] = "true" if ruby_static? && ENV.key?('RUBY_STATIC')
71
+ build_env["RUBY_STATIC"] = "true" if ruby_static? && ENV.key?("RUBY_STATIC")
72
+ cfg = "--cfg=rb_sys_gem --cfg=rubygems --cfg=rubygems_#{Gem::VERSION.tr(".", "_")}"
73
+ build_env["RUSTFLAGS"] = [ENV["RUSTFLAGS"], cfg].compact.join(" ")
40
74
  build_env
41
75
  end
42
76
 
43
- def cargo_command(cargo_dir, dest_path, args = [])
44
- manifest = File.join(cargo_dir, "Cargo.toml")
45
- cargo = ENV.fetch("CARGO", "cargo")
46
-
77
+ def cargo_command(cargo_toml, dest_path, args = [], crate_name = nil)
47
78
  cmd = []
48
79
  cmd += [cargo, "rustc"]
49
- cmd += ["--target", ENV['CARGO_BUILD_TARGET']] if ENV['CARGO_BUILD_TARGET']
80
+ cmd += ["--crate-type", "cdylib"]
81
+ cmd += ["--target", ENV["CARGO_BUILD_TARGET"]] if ENV["CARGO_BUILD_TARGET"]
50
82
  cmd += ["--target-dir", dest_path]
51
- cmd += ["--manifest-path", manifest]
83
+ cmd += ["--manifest-path", cargo_toml]
52
84
  cmd += ["--lib"]
53
85
  cmd += ["--profile", profile.to_s]
54
- cmd += ["--locked"] if profile == :release
86
+ cmd += ["--locked"]
55
87
  cmd += Gem::Command.build_args
56
88
  cmd += args
57
89
  cmd += ["--"]
58
- cmd += [*cargo_rustc_args(dest_path)]
90
+ cmd += [*cargo_rustc_args(dest_path, crate_name)]
59
91
  cmd
60
92
  end
61
93
 
62
94
  private
63
95
 
96
+ def cargo
97
+ ENV.fetch("CARGO", "cargo")
98
+ end
99
+
100
+ # returns the directory nesting of the extension, ignoring the first part, so
101
+ # "ext/foo/bar/Cargo.toml" becomes "foo/bar"
102
+ def extension_nesting(extension)
103
+ parts = extension.to_s.split(Regexp.union([File::SEPARATOR, File::ALT_SEPARATOR].compact))
104
+
105
+ parts = parts.each_with_object([]) do |segment, final|
106
+ next if segment == "."
107
+ if segment == ".."
108
+ raise Gem::InstallError, "extension outside of gem root" if final.empty?
109
+ next final.pop
110
+ end
111
+ final << segment
112
+ end
113
+
114
+ File.join(parts[1...-1])
115
+ end
116
+
64
117
  def rb_config_env
65
118
  result = {}
66
119
  RbConfig::CONFIG.each {|k, v| result["RBCONFIG_#{k}"] = v }
67
120
  result
68
121
  end
69
122
 
70
- def cargo_rustc_args(dest_dir)
123
+ def cargo_rustc_args(dest_dir, crate_name)
71
124
  [
72
125
  *linker_args,
73
126
  *mkmf_libpath,
74
- *rustc_dynamic_linker_flags(dest_dir),
127
+ *rustc_dynamic_linker_flags(dest_dir, crate_name),
75
128
  *rustc_lib_flags(dest_dir),
76
129
  *platform_specific_rustc_args(dest_dir),
77
- *debug_flags,
78
130
  ]
79
131
  end
80
132
 
@@ -92,6 +144,9 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
92
144
  # run on one that isn't the missing libraries will cause the extension
93
145
  # to fail on start.
94
146
  flags += ["-C", "link-arg=-static-libgcc"]
147
+ elsif darwin_target?
148
+ # Ventura does not always have this flag enabled
149
+ flags += ["-C", "link-arg=-Wl,-undefined,dynamic_lookup"]
95
150
  end
96
151
 
97
152
  flags
@@ -100,14 +155,23 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
100
155
  # We want to use the same linker that Ruby uses, so that the linker flags from
101
156
  # mkmf work properly.
102
157
  def linker_args
103
- # Have to handle CC="cl /nologo" on mswin
104
158
  cc_flag = Shellwords.split(makefile_config("CC"))
105
159
  linker = cc_flag.shift
106
160
  link_args = cc_flag.flat_map {|a| ["-C", "link-arg=#{a}"] }
107
161
 
162
+ return mswin_link_args if linker == "cl"
163
+
108
164
  ["-C", "linker=#{linker}", *link_args]
109
165
  end
110
166
 
167
+ def mswin_link_args
168
+ args = []
169
+ args += ["-l", makefile_config("LIBRUBYARG_SHARED").chomp(".lib")]
170
+ args += split_flags("LIBS").flat_map {|lib| ["-l", lib.chomp(".lib")] }
171
+ args += split_flags("LOCAL_LIBS").flat_map {|lib| ["-l", lib.chomp(".lib")] }
172
+ args
173
+ end
174
+
111
175
  def libruby_args(dest_dir)
112
176
  libs = makefile_config(ruby_static? ? "LIBRUBYARG_STATIC" : "LIBRUBYARG_SHARED")
113
177
  raw_libs = Shellwords.split(libs)
@@ -120,42 +184,70 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
120
184
  makefile_config("ENABLE_SHARED") == "no"
121
185
  end
122
186
 
123
- # Ruby expects the dylib to follow a file name convention for loading
124
- def rename_cdylib_for_ruby_compatibility(dest_path)
125
- new_path = final_extension_path(dest_path)
126
- FileUtils.cp(cargo_dylib_path(dest_path), new_path)
127
- new_path
187
+ def cargo_dylib_path(dest_path, crate_name)
188
+ prefix = so_ext == "dll" ? "" : "lib"
189
+ path_parts = [dest_path]
190
+ path_parts << ENV["CARGO_BUILD_TARGET"] if ENV["CARGO_BUILD_TARGET"]
191
+ path_parts += ["release", "#{prefix}#{crate_name}.#{so_ext}"]
192
+ File.join(*path_parts)
128
193
  end
129
194
 
130
- def validate_cargo_build!(dir)
131
- dylib_path = cargo_dylib_path(dir)
195
+ def cargo_crate_name(cargo_dir, manifest_path, results)
196
+ require "open3"
197
+ Gem.load_yaml
132
198
 
133
- raise DylibNotFoundError, dir unless File.exist?(dylib_path)
199
+ output, status =
200
+ begin
201
+ Open3.capture2e(cargo, "metadata", "--no-deps", "--format-version", "1", :chdir => cargo_dir)
202
+ rescue => error
203
+ raise Gem::InstallError, "cargo metadata failed #{error.message}"
204
+ end
134
205
 
135
- dylib_path
136
- end
206
+ unless status.success?
207
+ if Gem.configuration.really_verbose
208
+ puts output
209
+ else
210
+ results << output
211
+ end
137
212
 
138
- def final_extension_path(dest_path)
139
- dylib_path = cargo_dylib_path(dest_path)
140
- dlext_name = "#{spec.name}.#{makefile_config("DLEXT")}"
141
- dylib_path.gsub(File.basename(dylib_path), dlext_name)
142
- end
213
+ exit_reason =
214
+ if status.exited?
215
+ ", exit code #{status.exitstatus}"
216
+ elsif status.signaled?
217
+ ", uncaught signal #{status.termsig}"
218
+ end
143
219
 
144
- def cargo_dylib_path(dest_path)
145
- prefix = so_ext == "dll" ? "" : "lib"
146
- path_parts = [dest_path]
147
- path_parts << ENV['CARGO_BUILD_TARGET'] if ENV['CARGO_BUILD_TARGET']
148
- path_parts += [profile_target_directory, "#{prefix}#{cargo_crate_name}.#{so_ext}"]
149
- File.join(*path_parts)
220
+ raise Gem::InstallError, "cargo metadata failed#{exit_reason}"
221
+ end
222
+
223
+ # cargo metadata output is specified as json, but with the
224
+ # --format-version 1 option the output is compatible with YAML, so we can
225
+ # avoid the json dependency
226
+ metadata = Gem::SafeYAML.safe_load(output)
227
+ package = metadata["packages"].find {|pkg| normalize_path(pkg["manifest_path"]) == manifest_path }
228
+ unless package
229
+ found = metadata["packages"].map {|md| "#{md["name"]} at #{md["manifest_path"]}" }
230
+ raise Gem::InstallError, <<-EOF
231
+ failed to determine cargo package name
232
+
233
+ looking for: #{manifest_path}
234
+
235
+ found:
236
+ #{found.join("\n")}
237
+ EOF
238
+ end
239
+ package["name"].tr("-", "_")
150
240
  end
151
241
 
152
- def cargo_crate_name
153
- spec.metadata.fetch('cargo_crate_name', spec.name).tr('-', '_')
242
+ def normalize_path(path)
243
+ return path unless File::ALT_SEPARATOR
244
+
245
+ path.tr(File::ALT_SEPARATOR, File::SEPARATOR)
154
246
  end
155
247
 
156
- def rustc_dynamic_linker_flags(dest_dir)
248
+ def rustc_dynamic_linker_flags(dest_dir, crate_name)
157
249
  split_flags("DLDFLAGS")
158
- .map {|arg| maybe_resolve_ldflag_variable(arg, dest_dir) }
250
+ .map {|arg| maybe_resolve_ldflag_variable(arg, dest_dir, crate_name) }
159
251
  .compact
160
252
  .flat_map {|arg| ldflag_to_link_modifier(arg) }
161
253
  end
@@ -189,8 +281,8 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
189
281
  !!Gem::WIN_PATTERNS.find {|r| target_platform =~ r }
190
282
  end
191
283
 
192
- # Interpolate substition vars in the arg (i.e. $(DEFFILE))
193
- def maybe_resolve_ldflag_variable(input_arg, dest_dir)
284
+ # Interpolate substitution vars in the arg (i.e. $(DEFFILE))
285
+ def maybe_resolve_ldflag_variable(input_arg, dest_dir, crate_name)
194
286
  var_matches = input_arg.match(/\$\((\w+)\)/)
195
287
 
196
288
  return input_arg unless var_matches
@@ -203,19 +295,19 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
203
295
  # On windows, it is assumed that mkmf has setup an exports file for the
204
296
  # extension, so we have to to create one ourselves.
205
297
  when "DEFFILE"
206
- write_deffile(dest_dir)
298
+ write_deffile(dest_dir, crate_name)
207
299
  else
208
300
  RbConfig::CONFIG[var_name]
209
301
  end
210
302
  end
211
303
 
212
- def write_deffile(dest_dir)
213
- deffile_path = File.join(dest_dir, "#{spec.name}-#{RbConfig::CONFIG["arch"]}.def")
304
+ def write_deffile(dest_dir, crate_name)
305
+ deffile_path = File.join(dest_dir, "#{crate_name}-#{RbConfig::CONFIG["arch"]}.def")
214
306
  export_prefix = makefile_config("EXPORT_PREFIX") || ""
215
307
 
216
308
  File.open(deffile_path, "w") do |f|
217
309
  f.puts "EXPORTS"
218
- f.puts "#{export_prefix.strip}Init_#{spec.name}"
310
+ f.puts "#{export_prefix.strip}Init_#{crate_name}"
219
311
  end
220
312
 
221
313
  deffile_path
@@ -250,59 +342,6 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
250
342
  RbConfig.expand(val.dup)
251
343
  end
252
344
 
253
- # Good balance between binary size and debugability
254
- def debug_flags
255
- return [] if profile == :dev
256
-
257
- ["-C", "debuginfo=1"]
258
- end
259
-
260
- # Copied from ExtConfBuilder
261
- def finalize_directory(dest_path, lib_dir, extension_dir)
262
- require "fileutils"
263
- require "tempfile"
264
-
265
- ext_path = final_extension_path(dest_path)
266
-
267
- begin
268
- tmp_dest = Dir.mktmpdir(".gem.", extension_dir)
269
-
270
- # Some versions of `mktmpdir` return absolute paths, which will break make
271
- # if the paths contain spaces.
272
- #
273
- # As such, we convert to a relative path.
274
- tmp_dest_relative = get_relative_path(tmp_dest.clone, extension_dir)
275
-
276
- full_tmp_dest = File.join(extension_dir, tmp_dest_relative)
277
-
278
- # TODO: remove in RubyGems 4
279
- if Gem.install_extension_in_lib && lib_dir
280
- FileUtils.mkdir_p lib_dir
281
- FileUtils.cp_r ext_path, lib_dir, remove_destination: true
282
- end
283
-
284
- FileUtils::Entry_.new(full_tmp_dest).traverse do |ent|
285
- destent = ent.class.new(dest_path, ent.rel)
286
- destent.exist? || FileUtils.mv(ent.path, destent.path)
287
- end
288
- ensure
289
- FileUtils.rm_rf tmp_dest if tmp_dest
290
- end
291
- end
292
-
293
- def get_relative_path(path, base)
294
- path[0..base.length - 1] = "." if path.start_with?(base)
295
- path
296
- end
297
-
298
- def profile_target_directory
299
- case profile
300
- when :release then 'release'
301
- when :dev then 'debug'
302
- else raise "unknown target directory for profile: #{profile}"
303
- end
304
- end
305
-
306
345
  # Error raised when no cdylib artifact was created
307
346
  class DylibNotFoundError < StandardError
308
347
  def initialize(dir)
@@ -2,8 +2,8 @@
2
2
 
3
3
  class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
4
4
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd)
5
- unless File.exist?(File.join(cmake_dir, 'Makefile'))
6
- require_relative '../command'
5
+ unless File.exist?(File.join(cmake_dir, "Makefile"))
6
+ require_relative "../command"
7
7
  cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args]
8
8
 
9
9
  run cmd, results, class_name, cmake_dir
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  #--
3
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
5
  # All rights reserved.
@@ -7,7 +8,7 @@
7
8
 
8
9
  class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
9
10
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd)
10
- unless File.exist?(File.join(configure_dir, 'Makefile'))
11
+ unless File.exist?(File.join(configure_dir, "Makefile"))
11
12
  cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args]
12
13
 
13
14
  run cmd, results, class_name, configure_dir
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  #--
3
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
5
  # All rights reserved.
@@ -7,8 +8,8 @@
7
8
 
8
9
  class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
9
10
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd)
10
- require 'fileutils'
11
- require 'tempfile'
11
+ require "fileutils"
12
+ require "tempfile"
12
13
 
13
14
  tmp_dest = Dir.mktmpdir(".gem.", extension_dir)
14
15
 
@@ -21,17 +22,16 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
21
22
  destdir = ENV["DESTDIR"]
22
23
 
23
24
  begin
24
- require "shellwords"
25
- cmd = Gem.ruby.shellsplit << "-I" << File.expand_path('../..', __dir__) << File.basename(extension)
25
+ cmd = ruby << File.basename(extension)
26
26
  cmd.push(*args)
27
27
 
28
28
  run(cmd, results, class_name, extension_dir) do |s, r|
29
- mkmf_log = File.join(extension_dir, 'mkmf.log')
29
+ mkmf_log = File.join(extension_dir, "mkmf.log")
30
30
  if File.exist? mkmf_log
31
31
  unless s.success?
32
32
  r << "To see why this extension failed to compile, please check" \
33
33
  " the mkmf.log which can be found here:\n"
34
- r << " " + File.join(dest_path, 'mkmf.log') + "\n"
34
+ r << " " + File.join(dest_path, "mkmf.log") + "\n"
35
35
  end
36
36
  FileUtils.mv mkmf_log, dest_path
37
37
  end
@@ -44,7 +44,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
44
44
  full_tmp_dest = File.join(extension_dir, tmp_dest_relative)
45
45
 
46
46
  # TODO remove in RubyGems 4
47
- if Gem.install_extension_in_lib and lib_dir
47
+ if Gem.install_extension_in_lib && lib_dir
48
48
  FileUtils.mkdir_p lib_dir
49
49
  entries = Dir.entries(full_tmp_dest) - %w[. ..]
50
50
  entries = entries.map {|entry| File.join full_tmp_dest, entry }
@@ -53,8 +53,10 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
53
53
 
54
54
  FileUtils::Entry_.new(full_tmp_dest).traverse do |ent|
55
55
  destent = ent.class.new(dest_path, ent.rel)
56
- destent.exist? or FileUtils.mv(ent.path, destent.path)
56
+ destent.exist? || FileUtils.mv(ent.path, destent.path)
57
57
  end
58
+
59
+ make dest_path, results, extension_dir, tmp_dest_relative, ["clean"]
58
60
  ensure
59
61
  ENV["DESTDIR"] = destdir
60
62
  end
@@ -67,7 +69,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
67
69
  private
68
70
 
69
71
  def self.get_relative_path(path, base)
70
- path[0..base.length - 1] = '.' if path.start_with?(base)
72
+ path[0..base.length - 1] = "." if path.start_with?(base)
71
73
  path
72
74
  end
73
75
  end
@@ -1,4 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require_relative "../shellwords"
4
+
2
5
  #--
3
6
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
7
  # All rights reserved.
@@ -11,16 +14,15 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
11
14
  run([Gem.ruby, File.basename(extension), *args], results, class_name, extension_dir)
12
15
  end
13
16
 
14
- rake = ENV['rake']
17
+ rake = ENV["rake"]
15
18
 
16
19
  if rake
17
- require "shellwords"
18
- rake = rake.shellsplit
20
+ rake = Shellwords.split(rake)
19
21
  else
20
22
  begin
21
- rake = [Gem.ruby, "-I#{File.expand_path("../..", __dir__)}", "-rrubygems", Gem.bin_path('rake', 'rake')]
23
+ rake = ruby << "-rrubygems" << Gem.bin_path("rake", "rake")
22
24
  rescue Gem::Exception
23
- rake = [Gem.default_exec_format % 'rake']
25
+ rake = [Gem.default_exec_format % "rake"]
24
26
  end
25
27
  end
26
28