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
@@ -23,6 +23,8 @@
23
23
 
24
24
  require 'phusion_passenger/platform_info'
25
25
  require 'phusion_passenger/platform_info/compiler'
26
+ require 'phusion_passenger/platform_info/operating_system'
27
+ require 'phusion_passenger/platform_info/linux'
26
28
 
27
29
  module PhusionPassenger
28
30
 
@@ -98,6 +100,30 @@ module PlatformInfo
98
100
  end
99
101
  memoize :httpd_version
100
102
 
103
+ # The Apache executable's architectural bits. Returns 32 or 64,
104
+ # or nil if unable to detect.
105
+ def self.httpd_architecture_bits(options = nil)
106
+ if options
107
+ httpd = options[:httpd] || self.httpd(options)
108
+ else
109
+ httpd = self.httpd
110
+ end
111
+ if httpd
112
+ `#{httpd} -V` =~ %r{Architecture:(.*)}
113
+ text = $1
114
+ if text =~ /32/
115
+ return 32
116
+ elsif text =~ /64/
117
+ return 64
118
+ else
119
+ return nil
120
+ end
121
+ else
122
+ return nil
123
+ end
124
+ end
125
+ memoize :httpd_architecture_bits
126
+
101
127
  # The Apache root directory.
102
128
  def self.httpd_root(options = nil)
103
129
  if info = httpd_V(options)
@@ -414,7 +440,7 @@ module PlatformInfo
414
440
  apxs2_flags.gsub!(/-O\d? /, '')
415
441
 
416
442
  # Remove flags not supported by GCC
417
- if RUBY_PLATFORM =~ /solaris/ # TODO: Add support for people using SunStudio
443
+ if os_name =~ /solaris/ # TODO: Add support for people using SunStudio
418
444
  # The big problem is Coolstack apxs includes a bunch of solaris -x directives.
419
445
  options = apxs2_flags.split
420
446
  options.reject! { |f| f =~ /^\-x/ }
@@ -423,11 +449,22 @@ module PlatformInfo
423
449
  options.reject! { |f| f =~ /^\-mt/ }
424
450
  apxs2_flags = options.join(' ')
425
451
  end
452
+
453
+ if os_name == "linux" &&
454
+ linux_distro_tags.include?(:redhat) &&
455
+ apxs2 == "/usr/sbin/apxs" &&
456
+ httpd_architecture_bits == 64
457
+ # The Apache package in CentOS 5 x86_64 is broken.
458
+ # 'apxs -q CFLAGS' contains directives for compiling
459
+ # the module as 32-bit, even though httpd itself
460
+ # is 64-bit. Fix this.
461
+ apxs2_flags.gsub!('-m32 -march=i386 -mtune=generic', '')
462
+ end
426
463
 
427
464
  apxs2_flags.strip!
428
465
  flags << apxs2_flags
429
466
  end
430
- if !httpd.nil? && RUBY_PLATFORM =~ /darwin/
467
+ if !httpd.nil? && os_name == "macosx"
431
468
  # The default Apache install on OS X is a universal binary.
432
469
  # Figure out which architectures it's compiled for and do the same
433
470
  # thing for mod_passenger. We use the 'file' utility to do this.
@@ -513,7 +550,7 @@ module PlatformInfo
513
550
  return !try_compile("whether APR is needed for building Apache modules",
514
551
  :c, "#include <apr.h>\n", apache2_module_cflags(false))
515
552
  end
516
- memoize :apr_config_needed_for_building_apache_modules?
553
+ memoize :apr_config_needed_for_building_apache_modules?, true
517
554
 
518
555
  private
519
556
  def self.determine_apr_info
@@ -523,10 +560,10 @@ private
523
560
  flags = `#{apr_config} --cppflags --includes`.strip
524
561
  libs = `#{apr_config} --link-ld`.strip
525
562
  flags.gsub!(/-O\d? /, '')
526
- if RUBY_PLATFORM =~ /solaris/
563
+ if os_name =~ /solaris/
527
564
  # Remove flags not supported by GCC
528
565
  flags = flags.split(/ +/).reject{ |f| f =~ /^\-mt/ }.join(' ')
529
- elsif RUBY_PLATFORM =~ /aix/
566
+ elsif os_name =~ /aix/
530
567
  libs << " -Wl,-G -Wl,-brtl"
531
568
  end
532
569
  return [flags, libs]
@@ -545,7 +582,7 @@ private
545
582
  return [flags, libs]
546
583
  end
547
584
  end
548
- memoize :determine_apu_info
585
+ memoize :determine_apu_info, true
549
586
  private_class_method :determine_apu_info
550
587
 
551
588
  # Run `httpd -V` and return its output. On some systems, such as Ubuntu 13.10,
@@ -76,6 +76,8 @@ class ApacheDetector
76
76
  end
77
77
  end
78
78
 
79
+ attr_reader :results
80
+
79
81
  def initialize(output)
80
82
  @output = output
81
83
  @results = []
@@ -175,25 +177,33 @@ class ApacheDetector
175
177
  log " <b>#{PhusionPassenger.bin_dir}/passenger-install-apache2-module</b>"
176
178
  log ""
177
179
  log "If you are sure that you have Apache installed, please read the documentation:"
178
- log " * <b>#{PhusionPassenger.doc_dir}/Users guide Apache.html</b>, section"
180
+ log " * <b>#{PhusionPassenger.apache2_doc_path}</b>, section"
179
181
  log " section 'Installation' -> 'Customizing the compilation process' ->"
180
182
  log " 'Forcing location of command line tools and dependencies'"
181
183
  log " * Or visit the online version:"
182
- log " <b>http://www.modrails.com/documentation/Users%20guide%20Apache.html#_forcing_location_of_command_line_tools_and_dependencies</b>"
184
+ log " <b>#{APACHE2_DOC_URL}#_forcing_location_of_command_line_tools_and_dependencies</b>"
183
185
  elsif @results.size > 1
184
186
  log "<yellow>WARNING: You have multiple Apache installations on your system!</yellow>"
185
187
  log "You are strongly recommended to read this section of the documentation:"
186
- log " * <b>#{PhusionPassenger.doc_dir}/Users guide Apache.html</b>, section"
188
+ log " * <b>#{PhusionPassenger.apache2_doc_path}</b>, section"
187
189
  log " section 'Installation' -> 'Customizing the compilation process' ->"
188
190
  log " 'Forcing location of command line tools and dependencies'"
189
191
  log " * Or visit the online version:"
190
- log " <b>http://www.modrails.com/documentation/Users%20guide%20Apache.html#_forcing_location_of_command_line_tools_and_dependencies</b>"
192
+ log " <b>#{APACHE2_DOC_URL}#_forcing_location_of_command_line_tools_and_dependencies</b>"
191
193
  end
192
194
  end
193
195
 
196
+ def result_for(apxs2)
197
+ return @results.find { |r| r.apxs2 == apxs2 }
198
+ end
199
+
194
200
  private
195
201
  def log(message)
196
- @output.puts(Utils::AnsiColors.ansi_colorize(message))
202
+ if @output.tty?
203
+ @output.puts(Utils::AnsiColors.ansi_colorize(message))
204
+ else
205
+ @output.puts(Utils::AnsiColors.strip_color_tags(message))
206
+ end
197
207
  end
198
208
 
199
209
  # On Ubuntu, /usr/bin/apxs2 is a symlink to /usr/bin/apxs. We're only
@@ -40,6 +40,18 @@ private
40
40
  end
41
41
  private_class_method :detect_language_extension
42
42
 
43
+ def self.detect_compiler_type_name(language)
44
+ case language
45
+ when :c
46
+ return "C"
47
+ when :cxx
48
+ return "C++"
49
+ else
50
+ raise ArgumentError, "Unsupported language #{language.inspect}"
51
+ end
52
+ end
53
+ private_class_method :detect_compiler_type_name
54
+
43
55
  def self.create_compiler_command(language, flags1, flags2, link = false)
44
56
  case language
45
57
  when :c
@@ -94,17 +106,40 @@ private
94
106
  elsif result
95
107
  log("Check suceeded")
96
108
  if capture_output
97
- return { :output => output }
109
+ return { :result => true, :output => output }
98
110
  else
99
111
  return true
100
112
  end
101
113
  else
102
114
  log("Check failed with exit status #{$?.exitstatus}")
103
- return false
115
+ if capture_output == :always
116
+ return { :result => false, :output => output }
117
+ else
118
+ return false
119
+ end
104
120
  end
105
121
  end
106
122
  private_class_method :run_compiler
107
123
 
124
+ def self.cc_or_cxx_supports_feliminate_unused_debug?(language)
125
+ ext = detect_language_extension(language)
126
+ compiler_type_name = detect_compiler_type_name(language)
127
+ create_temp_file("passenger-compile-check.#{ext}") do |filename, f|
128
+ f.close
129
+ begin
130
+ command = create_compiler_command(language,
131
+ "-c '#{filename}' -o '#{filename}.o'",
132
+ '-feliminate-unused-debug-symbols -feliminate-unused-debug-types')
133
+ result = run_compiler("Checking for #{compiler_type_name} compiler '--feliminate-unused-debug-{symbols,types}' support",
134
+ command, filename, '', true)
135
+ return result && result[:output].empty?
136
+ ensure
137
+ File.unlink("#{filename}.o") rescue nil
138
+ end
139
+ end
140
+ end
141
+ private_class_method :cc_or_cxx_supports_feliminate_unused_debug?
142
+
108
143
  public
109
144
  def self.cc
110
145
  return string_env('CC', default_cc)
@@ -135,6 +170,11 @@ public
135
170
  end
136
171
  end
137
172
 
173
+ def self.cc_is_gcc?
174
+ `#{cc} -v 2>&1` =~ /gcc version/
175
+ end
176
+ memoize :cc_is_gcc?
177
+
138
178
  def self.cc_is_clang?
139
179
  `#{cc} --version 2>&1` =~ /clang version/
140
180
  end
@@ -150,6 +190,11 @@ public
150
190
  end
151
191
  memoize :cc_is_sun_studio?
152
192
 
193
+ def self.cxx_is_sun_studio?
194
+ `#{cxx} -V 2>&1` =~ /Sun C/ || `#{cc} -flags 2>&1` =~ /Sun C/
195
+ end
196
+ memoize :cxx_is_sun_studio?
197
+
153
198
 
154
199
  # Looks for the given C or C++ header. This works by invoking the compiler and
155
200
  # searching in the compiler's header search path. Returns its full filename,
@@ -254,68 +299,140 @@ public
254
299
  :c, '', "-arch #{arch}")
255
300
  end
256
301
 
257
- def self.compiler_supports_visibility_flag?
258
- return false if RUBY_PLATFORM =~ /aix/
302
+ def self.cc_supports_visibility_flag?
303
+ return false if os_name =~ /aix/
259
304
  return try_compile("Checking for C compiler '-fvisibility' support",
260
305
  :c, '', '-fvisibility=hidden')
261
306
  end
262
- memoize :compiler_supports_visibility_flag?, true
307
+ memoize :cc_supports_visibility_flag?, true
308
+
309
+ def self.cxx_supports_visibility_flag?
310
+ return false if os_name =~ /aix/
311
+ return try_compile("Checking for C++ compiler '-fvisibility' support",
312
+ :cxx, '', '-fvisibility=hidden')
313
+ end
314
+ memoize :cxx_supports_visibility_flag?, true
263
315
 
264
- def self.compiler_supports_wno_attributes_flag?
316
+ def self.cc_supports_wno_attributes_flag?
265
317
  return try_compile("Checking for C compiler '-Wno-attributes' support",
266
318
  :c, '', '-Wno-attributes')
267
319
  end
268
- memoize :compiler_supports_wno_attributes_flag?, true
320
+ memoize :cc_supports_wno_attributes_flag?, true
269
321
 
270
- def self.compiler_supports_wno_missing_field_initializers_flag?
322
+ def self.cxx_supports_wno_attributes_flag?
323
+ return try_compile("Checking for C++ compiler '-Wno-attributes' support",
324
+ :cxx, '', '-Wno-attributes')
325
+ end
326
+ memoize :cxx_supports_wno_attributes_flag?, true
327
+
328
+ def self.cc_supports_wno_missing_field_initializers_flag?
271
329
  return try_compile("Checking for C compiler '-Wno-missing-field-initializers' support",
272
330
  :c, '', '-Wno-missing-field-initializers')
273
331
  end
274
- memoize :compiler_supports_wno_missing_field_initializers_flag?, true
332
+ memoize :cc_supports_wno_missing_field_initializers_flag?, true
333
+
334
+ def self.cxx_supports_wno_missing_field_initializers_flag?
335
+ return try_compile("Checking for C++ compiler '-Wno-missing-field-initializers' support",
336
+ :cxx, '', '-Wno-missing-field-initializers')
337
+ end
338
+ memoize :cxx_supports_wno_missing_field_initializers_flag?, true
275
339
 
276
- def self.compiler_supports_no_tls_direct_seg_refs_option?
340
+ def self.cc_supports_no_tls_direct_seg_refs_option?
277
341
  return try_compile("Checking for C compiler '-mno-tls-direct-seg-refs' support",
278
342
  :c, '', '-mno-tls-direct-seg-refs')
279
343
  end
280
- memoize :compiler_supports_no_tls_direct_seg_refs_option?, true
344
+ memoize :cc_supports_no_tls_direct_seg_refs_option?, true
281
345
 
282
- def self.compiler_supports_wno_ambiguous_member_template?
283
- return try_compile("Checking for C compiler '-Wno-ambiguous-member-template' support",
284
- :c, '', '-Wno-ambiguous-member-template')
346
+ def self.cxx_supports_no_tls_direct_seg_refs_option?
347
+ return try_compile("Checking for C++ compiler '-mno-tls-direct-seg-refs' support",
348
+ :cxx, '', '-mno-tls-direct-seg-refs')
285
349
  end
286
- memoize :compiler_supports_wno_ambiguous_member_template?, true
350
+ memoize :cxx_supports_no_tls_direct_seg_refs_option?, true
351
+
352
+ def self.compiler_supports_wno_ambiguous_member_template?
353
+ result = try_compile("Checking for C++ compiler '-Wno-ambiguous-member-template' support",
354
+ :cxx, '', '-Wno-ambiguous-member-template')
355
+ return false if !result
287
356
 
288
- def self.compiler_supports_feliminate_unused_debug?
289
- create_temp_file("passenger-compile-check.c") do |filename, f|
357
+ # For some reason, GCC does not complain about -Wno-ambiguous-member-template
358
+ # not being supported unless the source contains another error. So we
359
+ # check for this.
360
+ create_temp_file("passenger-compile-check.cpp") do |filename, f|
361
+ source = %Q{
362
+ void foo() {
363
+ return error;
364
+ }
365
+ }
366
+ f.puts(source)
290
367
  f.close
291
368
  begin
292
- command = create_compiler_command(:c,
369
+ command = create_compiler_command(:cxx,
293
370
  "-c '#{filename}' -o '#{filename}.o'",
294
- '-feliminate-unused-debug-symbols -feliminate-unused-debug-types')
295
- result = run_compiler("Checking for C compiler '--feliminate-unused-debug-{symbols,types}' support",
296
- command, filename, '', true)
297
- return result && result[:output].empty?
371
+ '-Wno-ambiguous-member-template')
372
+ result = run_compiler("Checking whether C++ compiler '-Wno-ambiguous-member-template' support is *really* supported",
373
+ command, filename, source, :always)
298
374
  ensure
299
375
  File.unlink("#{filename}.o") rescue nil
300
376
  end
301
377
  end
378
+
379
+ return result && result[:output] !~ /-Wno-ambiguous-member-template/
302
380
  end
303
-
381
+ memoize :compiler_supports_wno_ambiguous_member_template?, true
382
+
383
+ def self.cc_supports_feliminate_unused_debug?
384
+ return cc_or_cxx_supports_feliminate_unused_debug?(:c)
385
+ end
386
+ memoize :cc_supports_feliminate_unused_debug?, true
387
+
388
+ def self.cxx_supports_feliminate_unused_debug?
389
+ return cc_or_cxx_supports_feliminate_unused_debug?(:cxx)
390
+ end
391
+ memoize :cxx_supports_feliminate_unused_debug?, true
392
+
304
393
  # Returns whether compiling C++ with -fvisibility=hidden might result
305
394
  # in tons of useless warnings, like this:
306
395
  # http://code.google.com/p/phusion-passenger/issues/detail?id=526
307
396
  # This appears to be a bug in older g++ versions:
308
397
  # http://gcc.gnu.org/ml/gcc-patches/2006-07/msg00861.html
309
398
  # Warnings should be suppressed with -Wno-attributes.
310
- def self.compiler_visibility_flag_generates_warnings?
311
- if RUBY_PLATFORM =~ /linux/ && `#{cxx} -v 2>&1` =~ /gcc version (.*?)/
399
+ def self.cc_visibility_flag_generates_warnings?
400
+ if os_name =~ /linux/ && `#{cc} -v 2>&1` =~ /gcc version (.*?)/
401
+ return $1 <= "4.1.2"
402
+ else
403
+ return false
404
+ end
405
+ end
406
+ memoize :cc_visibility_flag_generates_warnings?, true
407
+
408
+ def self.cxx_visibility_flag_generates_warnings?
409
+ if os_name =~ /linux/ && `#{cxx} -v 2>&1` =~ /gcc version (.*?)/
312
410
  return $1 <= "4.1.2"
313
411
  else
314
412
  return false
315
413
  end
316
414
  end
317
- memoize :compiler_visibility_flag_generates_warnings?, true
415
+ memoize :cxx_visibility_flag_generates_warnings?, true
318
416
 
417
+ def self.adress_sanitizer_flag
418
+ if cc_is_clang?
419
+ if `#{cc} --help` =~ /-fsanitize=/
420
+ return "-fsanitize=address"
421
+ else
422
+ return "-faddress-sanitizer"
423
+ end
424
+ else
425
+ return nil
426
+ end
427
+ end
428
+ memoize :adress_sanitizer_flag
429
+
430
+ def self.has_rt_library?
431
+ return try_link("Checking for -lrt support",
432
+ :c, "int main() { return 0; }\n", '-lrt')
433
+ end
434
+ memoize :has_rt_library?, true
435
+
319
436
  def self.has_math_library?
320
437
  return try_link("Checking for -lmath support",
321
438
  :c, "int main() { return 0; }\n", '-lmath')
@@ -327,6 +444,15 @@ public
327
444
  :c, '#include <alloca.h>')
328
445
  end
329
446
  memoize :has_alloca_h?, true
447
+
448
+ def self.has_accept4?
449
+ return try_compile("Checking for accept4()", :c, %Q{
450
+ #define _GNU_SOURCE
451
+ #include <sys/socket.h>
452
+ static void *foo = accept4;
453
+ })
454
+ end
455
+ memoize :has_accept4?, true
330
456
 
331
457
  # C compiler flags that should be passed in order to enable debugging information.
332
458
  def self.debugging_cflags
@@ -335,10 +461,10 @@ public
335
461
  # -ggdb instead.
336
462
  #
337
463
  # In any case we'll always want to use -ggdb for better GDB debugging.
338
- if cc_is_clang? || cxx_is_clang?
339
- return '-g'
340
- else
464
+ if cc_is_gcc?
341
465
  return '-ggdb'
466
+ else
467
+ return '-g'
342
468
  end
343
469
  end
344
470
 
@@ -346,7 +472,7 @@ public
346
472
  if !ENV['DMALLOC_LIBS'].to_s.empty?
347
473
  return ENV['DMALLOC_LIBS']
348
474
  end
349
- if RUBY_PLATFORM =~ /darwin/
475
+ if os_name == "macosx"
350
476
  ['/opt/local', '/usr/local', '/usr'].each do |prefix|
351
477
  filename = "#{prefix}/lib/libdmallocthcxx.a"
352
478
  if File.exist?(filename)
@@ -361,7 +487,7 @@ public
361
487
  memoize :dmalloc_ldflags
362
488
 
363
489
  def self.electric_fence_ldflags
364
- if RUBY_PLATFORM =~ /darwin/
490
+ if os_name == "macosx"
365
491
  ['/opt/local', '/usr/local', '/usr'].each do |prefix|
366
492
  filename = "#{prefix}/lib/libefence.a"
367
493
  if File.exist?(filename)
@@ -376,7 +502,7 @@ public
376
502
  memoize :electric_fence_ldflags
377
503
 
378
504
  def self.export_dynamic_flags
379
- if RUBY_PLATFORM =~ /linux/
505
+ if os_name == "linux"
380
506
  return '-rdynamic'
381
507
  else
382
508
  return nil
@@ -411,6 +537,15 @@ public
411
537
  end
412
538
  end
413
539
  memoize :gnu_make, true
540
+
541
+ def self.xcode_select_version
542
+ if find_command('xcode-select')
543
+ `xcode-select --version` =~ /version (.+)\./
544
+ return $1
545
+ else
546
+ return nil
547
+ end
548
+ end
414
549
  end
415
550
 
416
551
  end # module PhusionPassenger