passenger 4.0.20 → 4.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -28,86 +28,160 @@ require 'phusion_passenger/platform_info/operating_system'
28
28
  module PhusionPassenger
29
29
 
30
30
  module PlatformInfo
31
- # Compiler flags that should be used for compiling every C/C++ program,
31
+ # Linker flags that should be used for linking every C/C++ program,
32
32
  # for portability reasons. These flags should be specified as last
33
- # when invoking the compiler.
34
- def self.portability_cflags
35
- flags = ["-D_REENTRANT -I/usr/local/include"]
36
-
37
- # There are too many implementations of of the hash map!
38
- # Figure out the right one.
39
- ok = try_compile("Checking for tr1/unordered_map", :cxx, %Q{
40
- #include <tr1/unordered_map>
33
+ # when invoking the linker.
34
+ def self.portability_ldflags
35
+ if os_name =~ /solaris/
36
+ result = '-lxnet -lsocket -lnsl -lpthread'
37
+ else
38
+ result = '-lpthread'
39
+ end
40
+ result << ' -lrt' if has_rt_library?
41
+ result << ' -lmath' if has_math_library?
42
+ return result
43
+ end
44
+ memoize :portability_ldflags
45
+
46
+ # Extra compiler flags that should always be passed to the C compiler,
47
+ # last in the command string.
48
+ def self.default_extra_cflags
49
+ return default_extra_c_or_cxxflags(:cc)
50
+ end
51
+ memoize :default_extra_cflags, true
52
+
53
+ # Extra compiler flags that should always be passed to the C++ compiler,
54
+ # last in the command string.
55
+ def self.default_extra_cxxflags
56
+ return default_extra_c_or_cxxflags(:cxx)
57
+ end
58
+ memoize :default_extra_cxxflags, true
59
+
60
+ private
61
+ def self.check_unordered_map(flags, class_name, header_name, macro_name)
62
+ ok = try_compile("Checking for unordered_map", :cxx, %Q{
63
+ #include <#{header_name}>
41
64
  int
42
65
  main() {
43
- std::tr1::unordered_map<int, int> m;
66
+ #{class_name}<int, int> m;
44
67
  return 0;
45
68
  }
46
69
  })
47
- if ok
48
- flags << "-DHAS_TR1_UNORDERED_MAP"
49
- else
50
- hash_namespace = nil
51
- ok = false
52
- ['__gnu_cxx', '', 'std', 'stdext'].each do |namespace|
53
- ['hash_map', 'ext/hash_map'].each do |hash_map_header|
54
- ok = try_compile("Checking for #{hash_map_header}", :cxx, %Q{
55
- #include <#{hash_map_header}>
56
- int
57
- main() {
58
- #{namespace}::hash_map<int, int> m;
59
- return 0;
60
- }
61
- })
62
- if ok
63
- hash_namespace = namespace
64
- flags << "-DHASH_NAMESPACE=\"#{namespace}\""
65
- flags << "-DHASH_MAP_HEADER=\"<#{hash_map_header}>\""
66
- flags << "-DHASH_MAP_CLASS=\"hash_map\""
67
- end
68
- break if ok
69
- end
70
- break if ok
71
- end
72
- ['ext/hash_fun.h', 'functional', 'tr1/functional',
73
- 'ext/stl_hash_fun.h', 'hash_fun.h', 'stl_hash_fun.h',
74
- 'stl/_hash_fun.h'].each do |hash_function_header|
75
- ok = try_compile("Checking for #{hash_function_header}", :cxx, %Q{
76
- #include <#{hash_function_header}>
70
+ flags << "-D#{macro_name}" if ok
71
+ return ok
72
+ end
73
+ private_class_method :check_unordered_map
74
+
75
+ def self.check_hash_map(flags)
76
+ hash_namespace = nil
77
+ ok = false
78
+ ['__gnu_cxx', '', 'std', 'stdext'].each do |namespace|
79
+ ['hash_map', 'ext/hash_map'].each do |hash_map_header|
80
+ ok = try_compile("Checking for #{hash_map_header}", :cxx, %Q{
81
+ #include <#{hash_map_header}>
77
82
  int
78
83
  main() {
79
- #{hash_namespace}::hash<int>()(5);
84
+ #{namespace}::hash_map<int, int> m;
80
85
  return 0;
81
86
  }
82
87
  })
83
88
  if ok
84
- flags << "-DHASH_FUN_H=\"<#{hash_function_header}>\""
89
+ hash_namespace = namespace
90
+ flags << "-DHASH_NAMESPACE=\"#{namespace}\""
91
+ flags << "-DHASH_MAP_HEADER=\"<#{hash_map_header}>\""
92
+ flags << "-DHASH_MAP_CLASS=\"hash_map\""
85
93
  break
86
94
  end
87
95
  end
96
+ break if ok
97
+ end
98
+ ['ext/hash_fun.h', 'functional', 'tr1/functional',
99
+ 'ext/stl_hash_fun.h', 'hash_fun.h', 'stl_hash_fun.h',
100
+ 'stl/_hash_fun.h'].each do |hash_function_header|
101
+ ok = try_compile("Checking for #{hash_function_header}", :cxx, %Q{
102
+ #include <#{hash_function_header}>
103
+ int
104
+ main() {
105
+ #{hash_namespace}::hash<int>()(5);
106
+ return 0;
107
+ }
108
+ })
109
+ if ok
110
+ flags << "-DHASH_FUN_H=\"<#{hash_function_header}>\""
111
+ break
112
+ end
113
+ end
114
+ end
115
+ private_class_method :check_hash_map
116
+
117
+ def self.default_extra_c_or_cxxflags(cc_or_cxx)
118
+ flags = ["-D_REENTRANT", "-I/usr/local/include"]
119
+
120
+ if !send("#{cc_or_cxx}_is_sun_studio?")
121
+ flags << "-Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long"
122
+ if send("#{cc_or_cxx}_supports_wno_missing_field_initializers_flag?")
123
+ flags << "-Wno-missing-field-initializers"
124
+ end
125
+ if requires_no_tls_direct_seg_refs? && send("#{cc_or_cxx}_supports_no_tls_direct_seg_refs_option?")
126
+ flags << "-mno-tls-direct-seg-refs"
127
+ end
128
+ # Work around Clang warnings in ev++.h.
129
+ if send("#{cc_or_cxx}_is_clang?")
130
+ flags << "-Wno-ambiguous-member-template"
131
+ end
88
132
  end
89
133
 
90
- ok = try_compile("Checking for accept4()", :c, %Q{
91
- #define _GNU_SOURCE
92
- #include <sys/socket.h>
93
- static void *foo = accept4;
94
- })
95
- flags << '-DHAVE_ACCEPT4' if ok
96
-
97
- if RUBY_PLATFORM =~ /solaris/
98
- flags << '-pthreads'
99
- if RUBY_PLATFORM =~ /solaris2.11/
134
+ if !send("#{cc_or_cxx}_is_sun_studio?")
135
+ flags << "-fcommon"
136
+ if send("#{cc_or_cxx}_supports_feliminate_unused_debug?")
137
+ flags << "-feliminate-unused-debug-symbols -feliminate-unused-debug-types"
138
+ end
139
+ if send("#{cc_or_cxx}_supports_visibility_flag?")
140
+ flags << "-fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED"
141
+ if send("#{cc_or_cxx}_visibility_flag_generates_warnings?") &&
142
+ send("#{cc_or_cxx}_supports_wno_attributes_flag?")
143
+ flags << "-Wno-attributes"
144
+ end
145
+ end
146
+ end
147
+
148
+ flags << debugging_cflags
149
+ flags << '-DHAS_ALLOCA_H' if has_alloca_h?
150
+ flags << '-DHAVE_ACCEPT4' if has_accept4?
151
+ flags << '-DHAS_SFENCE' if supports_sfence_instruction?
152
+ flags << '-DHAS_LFENCE' if supports_lfence_instruction?
153
+ flags << "-DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS"
154
+
155
+ if cc_or_cxx == :cxx
156
+ # There are too many implementations of of the hash map!
157
+ # Figure out the right one.
158
+ check_unordered_map(flags, "std::unordered_map", "unordered_map", "HAS_UNORDERED_MAP") ||
159
+ check_unordered_map(flags, "std::tr1::unordered_map", "unordered_map", "HAS_TR1_UNORDERED_MAP") ||
160
+ check_hash_map(flags)
161
+ end
162
+
163
+ if os_name =~ /solaris/
164
+ if send("#{cc_or_cxx}_is_sun_studio?")
165
+ flags << '-mt'
166
+ else
167
+ flags << '-pthreads'
168
+ end
169
+ if os_name =~ /solaris2\.11/
100
170
  # skip the _XOPEN_SOURCE and _XPG4_2 definitions in later versions of Solaris / OpenIndiana
101
171
  flags << '-D__EXTENSIONS__ -D__SOLARIS__ -D_FILE_OFFSET_BITS=64'
102
172
  else
103
173
  flags << '-D_XOPEN_SOURCE=500 -D_XPG4_2 -D__EXTENSIONS__ -D__SOLARIS__ -D_FILE_OFFSET_BITS=64'
104
- flags << '-D__SOLARIS9__ -DBOOST__STDC_CONSTANT_MACROS_DEFINED' if RUBY_PLATFORM =~ /solaris2.9/
174
+ flags << '-D__SOLARIS9__ -DBOOST__STDC_CONSTANT_MACROS_DEFINED' if os_name =~ /solaris2\.9/
175
+ end
176
+ flags << '-DBOOST_HAS_STDINT_H' unless os_name =~ /solaris2\.9/
177
+ if send("#{cc_or_cxx}_is_sun_studio?")
178
+ flags << '-xtarget=ultra' if RUBY_PLATFORM =~ /sparc/
179
+ else
180
+ flags << '-mcpu=ultrasparc' if RUBY_PLATFORM =~ /sparc/
105
181
  end
106
- flags << '-DBOOST_HAS_STDINT_H' unless RUBY_PLATFORM =~ /solaris2.9/
107
- flags << '-mcpu=ultrasparc' if RUBY_PLATFORM =~ /sparc/
108
- elsif RUBY_PLATFORM =~ /openbsd/
182
+ elsif os_name =~ /openbsd/
109
183
  flags << '-DBOOST_HAS_STDINT_H -D_GLIBCPP__PTHREADS'
110
- elsif RUBY_PLATFORM =~ /aix/
184
+ elsif os_name =~ /aix/
111
185
  flags << '-pthread'
112
186
  flags << '-DOXT_DISABLE_BACKTRACES'
113
187
  elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux|^arm.*-linux|sh4-linux)/
@@ -116,28 +190,10 @@ module PlatformInfo
116
190
  # http://groups.google.com/group/phusion-passenger/browse_thread/thread/aad4bd9d8d200561
117
191
  flags << '-DBOOST_SP_USE_PTHREADS'
118
192
  end
119
-
120
- flags << '-DHAS_ALLOCA_H' if has_alloca_h?
121
- flags << '-DHAS_SFENCE' if supports_sfence_instruction?
122
- flags << '-DHAS_LFENCE' if supports_lfence_instruction?
123
-
124
- return flags.compact.join(" ").strip
125
- end
126
- memoize :portability_cflags, true
127
193
 
128
- # Linker flags that should be used for linking every C/C++ program,
129
- # for portability reasons. These flags should be specified as last
130
- # when invoking the linker.
131
- def self.portability_ldflags
132
- if RUBY_PLATFORM =~ /solaris/
133
- result = '-lxnet -lrt -lsocket -lnsl -lpthread'
134
- else
135
- result = '-lpthread'
136
- end
137
- flags << ' -lmath' if has_math_library?
138
- return result
194
+ return flags.compact.map{ |str| str.strip }.join(" ").strip
139
195
  end
140
- memoize :portability_ldflags
196
+ private_class_method :default_extra_c_or_cxxflags
141
197
  end
142
198
 
143
199
  end # module PhusionPassenger
@@ -243,8 +243,12 @@ module Depcheck
243
243
  install_instructions("Please install it with <b>urpmi #{package_name}</b>")
244
244
  end
245
245
 
246
- def yum_install(package_name)
247
- install_instructions("Please install it with <b>yum install #{package_name}</b>")
246
+ def yum_install(package_name, options = {})
247
+ if options[:epel]
248
+ install_instructions("Please enable <b>EPEL</b>, then install with <b>yum install #{package_name}</b>")
249
+ else
250
+ install_instructions("Please install it with <b>yum install #{package_name}</b>")
251
+ end
248
252
  end
249
253
 
250
254
  def emerge(package_name)
@@ -253,12 +257,18 @@ module Depcheck
253
257
 
254
258
  def gem_install(package_name)
255
259
  install_instructions("Please make sure RubyGems is installed, then run " +
256
- "<b>#{gem_command || 'gem'} install #{package_name}</b>")
260
+ "<b>#{gem_command} install #{package_name}</b>")
257
261
  end
258
262
 
259
- def xcode_install(component)
260
- install_instructions("Please install <b>Xcode</b>, then in Xcode go to " +
261
- "<b>Preferences -> Downloads -> Components</b> and install <b>#{component}</b>")
263
+ def install_osx_command_line_tools
264
+ require 'phusion_passenger/platform_info/compiler'
265
+ if PlatformInfo.xcode_select_version.to_s >= "2333"
266
+ install_instructions "Please install the Xcode command line tools: " +
267
+ "<b>sudo xcode-select --install</b>"
268
+ else
269
+ install_instructions "Please install Xcode, then install the command line tools " +
270
+ "though the menu <b>Xcode -> Preferences -> Downloads -> Components</b>"
271
+ end
262
272
  end
263
273
 
264
274
 
@@ -267,7 +277,7 @@ module Depcheck
267
277
  end
268
278
 
269
279
  def gem_command
270
- PlatformInfo.gem_command
280
+ PlatformInfo.gem_command(:sudo => true) || 'gem'
271
281
  end
272
282
 
273
283
  def find_command(command, *args)
@@ -56,7 +56,7 @@ define 'apache2-dev' do
56
56
  emerge "apache"
57
57
  end
58
58
  on :macosx do
59
- xcode_install "Command Line Tools"
59
+ install_osx_command_line_tools
60
60
  end
61
61
  end
62
62
 
@@ -89,7 +89,7 @@ define 'apr-dev' do
89
89
  emerge "apr"
90
90
  end
91
91
  on :macosx do
92
- xcode_install "Command Line Tools"
92
+ install_osx_command_line_tools
93
93
  end
94
94
  end
95
95
 
@@ -119,6 +119,6 @@ define 'apu-dev' do
119
119
  yum_install "apr-util-devel"
120
120
  end
121
121
  on :macosx do
122
- xcode_install "Command Line Tools"
122
+ install_osx_command_line_tools
123
123
  end
124
124
  end
@@ -19,7 +19,7 @@ define 'cc' do
19
19
  emerge "gcc"
20
20
  end
21
21
  on :macosx do
22
- xcode_install "Command Line Tools"
22
+ install_osx_command_line_tools
23
23
  end
24
24
  end
25
25
 
@@ -44,7 +44,7 @@ define 'c++' do
44
44
  emerge "gcc"
45
45
  end
46
46
  on :macosx do
47
- xcode_install "Command Line Tools"
47
+ install_osx_command_line_tools
48
48
  end
49
49
  end
50
50
 
@@ -65,7 +65,7 @@ define 'make' do
65
65
  yum_install "make"
66
66
  end
67
67
  on :macosx do
68
- xcode_install "Command Line Tools"
68
+ install_osx_command_line_tools
69
69
  end
70
70
  on :other_platforms do
71
71
  website "http://www.gnu.org/software/make/"
@@ -89,7 +89,7 @@ define 'gmake' do
89
89
  yum_install "make"
90
90
  end
91
91
  on :macosx do
92
- xcode_install "Command Line Tools"
92
+ install_osx_command_line_tools
93
93
  end
94
94
  on :other_platforms do
95
95
  website "http://www.gnu.org/software/make/"
@@ -24,7 +24,7 @@ define 'ruby-dev' do
24
24
  end
25
25
  end
26
26
 
27
- if ruby_command =~ %r(^/usr/bin/ruby)
27
+ if ruby_command =~ %r(^/usr/bin/ruby) || ruby_command =~ %r(^/System/Library/Frameworks/Ruby.framework)
28
28
  # Only tell user to install the headers with the system's package manager
29
29
  # if Ruby itself was installed with the package manager.
30
30
  on :debian do
@@ -36,6 +36,9 @@ define 'ruby-dev' do
36
36
  on :redhat do
37
37
  yum_install "ruby-devel"
38
38
  end
39
+ on :macosx do
40
+ install_osx_command_line_tools
41
+ end
39
42
  end
40
43
  on :other_platforms do
41
44
  install_instructions "Please (re)install Ruby by downloading it from <b>#{website}</b>"
@@ -127,12 +130,8 @@ define 'rake' do
127
130
  on :mandriva do
128
131
  urpmi "rake"
129
132
  end
130
- on :amazon do
131
- # 'yum install rake' installs Ruby 1.9's Rake but Ruby 1.8 is the default -_-
132
- gem_install 'rake'
133
- end
134
133
  on :redhat do
135
- yum_install "rake"
134
+ yum_install "rubygem-rake", :epel => true
136
135
  end
137
136
  end
138
137
  on :other_platforms do
@@ -22,6 +22,7 @@
22
22
  # THE SOFTWARE.
23
23
 
24
24
  require 'phusion_passenger/platform_info'
25
+ require 'phusion_passenger/platform_info/operating_system'
25
26
 
26
27
  module PhusionPassenger
27
28
 
@@ -41,7 +42,7 @@ module PlatformInfo
41
42
  # distributions it is likely compatible with.
42
43
  # Returns nil if the operating system is not Linux.
43
44
  def self.linux_distro_tags
44
- if RUBY_PLATFORM !~ /linux/
45
+ if os_name != "linux"
45
46
  return nil
46
47
  end
47
48
  lsb_release = read_file("/etc/lsb-release")
@@ -40,7 +40,7 @@ module PlatformInfo
40
40
 
41
41
  # The current platform's shared library extension ('so' on most Unices).
42
42
  def self.library_extension
43
- if RUBY_PLATFORM =~ /darwin/
43
+ if os_name == "macosx"
44
44
  return "bundle"
45
45
  else
46
46
  return "so"
@@ -23,6 +23,7 @@
23
23
 
24
24
  require 'rbconfig'
25
25
  require 'phusion_passenger/platform_info'
26
+ require 'phusion_passenger/platform_info/operating_system'
26
27
 
27
28
  module PhusionPassenger
28
29
 
@@ -139,10 +140,24 @@ module PlatformInfo
139
140
  end
140
141
 
141
142
  # Returns the correct 'gem' command for this Ruby interpreter.
142
- def self.gem_command
143
- return locate_ruby_tool('gem')
143
+ # If `:sudo => true` is given, then the gem command is prefixed by a
144
+ # sudo command if filesystem permissions require this.
145
+ def self.gem_command(options = {})
146
+ command = locate_ruby_tool('gem')
147
+ if options[:sudo] && gem_install_requires_sudo?
148
+ command = "#{ruby_sudo_command} #{command}"
149
+ end
150
+ return command
144
151
  end
145
152
  memoize :gem_command
153
+
154
+ # Returns whether running 'gem install' as the current user requires sudo.
155
+ def self.gem_install_requires_sudo?
156
+ `#{gem_command} env` =~ /INSTALLATION DIRECTORY: (.+)/
157
+ install_dir = $1
158
+ return !File.writable?(install_dir)
159
+ end
160
+ memoize :gem_install_requires_sudo?
146
161
 
147
162
  # Returns the absolute path to the Rake executable that
148
163
  # belongs to the current Ruby interpreter. Returns nil if it
@@ -335,7 +350,7 @@ module PlatformInfo
335
350
 
336
351
  private
337
352
  def self.locate_ruby_tool_by_basename(name)
338
- if RUBY_PLATFORM =~ /darwin/ &&
353
+ if os_name == "macosx" &&
339
354
  ruby_command =~ %r(\A/System/Library/Frameworks/Ruby.framework/Versions/.*?/usr/bin/ruby\Z)
340
355
  # On OS X we must look for Ruby binaries in /usr/bin.
341
356
  # RubyGems puts executables (e.g. 'rake') in there, not in