passenger 5.0.0.beta3 → 5.0.0.rc1

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 (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -25,37 +25,37 @@ PhusionPassenger.require_passenger_lib 'platform_info'
25
25
 
26
26
  module PhusionPassenger
27
27
 
28
- module PlatformInfo
29
- def self.curl_flags
30
- result = `(curl-config --cflags) 2>/dev/null`.strip
31
- if result.empty?
32
- return nil
33
- else
34
- version = `curl-config --vernum`.strip
35
- if version >= '070c01'
36
- # Curl >= 7.12.1 supports curl_easy_reset()
37
- result << " -DHAS_CURL_EASY_RESET"
38
- end
39
- return result
40
- end
41
- end
42
- memoize :curl_flags
43
-
44
- def self.curl_libs
45
- result = `(curl-config --libs) 2>/dev/null`.strip
46
- if result.empty?
47
- return nil
48
- else
49
- return result
50
- end
51
- end
52
- memoize :curl_libs
53
-
54
- def self.curl_supports_ssl?
55
- features = `(curl-config --feature) 2>/dev/null`
56
- return features =~ /SSL/
57
- end
58
- memoize :curl_supports_ssl?
59
- end
28
+ module PlatformInfo
29
+ def self.curl_flags
30
+ result = `(curl-config --cflags) 2>/dev/null`.strip
31
+ if result.empty?
32
+ return nil
33
+ else
34
+ version = `curl-config --vernum`.strip
35
+ if version >= '070c01'
36
+ # Curl >= 7.12.1 supports curl_easy_reset()
37
+ result << " -DHAS_CURL_EASY_RESET"
38
+ end
39
+ return result
40
+ end
41
+ end
42
+ memoize :curl_flags
43
+
44
+ def self.curl_libs
45
+ result = `(curl-config --libs) 2>/dev/null`.strip
46
+ if result.empty?
47
+ return nil
48
+ else
49
+ return result
50
+ end
51
+ end
52
+ memoize :curl_libs
53
+
54
+ def self.curl_supports_ssl?
55
+ features = `(curl-config --feature) 2>/dev/null`
56
+ return features =~ /SSL/
57
+ end
58
+ memoize :curl_supports_ssl?
59
+ end
60
60
 
61
61
  end # module PhusionPassenger
@@ -27,193 +27,193 @@ PhusionPassenger.require_passenger_lib 'platform_info/operating_system'
27
27
 
28
28
  module PhusionPassenger
29
29
 
30
- module PlatformInfo
31
- # Extra flags that should always be passed to the C compiler
32
- # when linking, to be included last in the command string.
33
- def self.portability_c_ldflags
34
- return portability_c_or_cxx_ldflags(:c)
35
- end
36
- memoize :portability_c_ldflags
37
-
38
- # Extra flags that should always be passed to the C++ compiler
39
- # when linking, to be included last in the command string.
40
- def self.portability_cxx_ldflags
41
- return portability_c_or_cxx_ldflags(:cxx)
42
- end
43
- memoize :portability_cxx_ldflags
44
-
45
- # Extra compiler flags that should always be passed to the C compiler,
46
- # last in the command string.
47
- def self.default_extra_cflags
48
- return default_extra_c_or_cxxflags(:cc)
49
- end
50
- memoize :default_extra_cflags, true
51
-
52
- # Extra compiler flags that should always be passed to the C++ compiler,
53
- # last in the command string.
54
- def self.default_extra_cxxflags
55
- return default_extra_c_or_cxxflags(:cxx)
56
- end
57
- memoize :default_extra_cxxflags, true
58
-
59
- private
60
- def self.check_unordered_map(flags, class_name, header_name, macro_name)
61
- ok = try_compile("Checking for unordered_map", :cxx, %Q{
62
- #include <#{header_name}>
63
- int
64
- main() {
65
- #{class_name}<int, int> m;
66
- return 0;
67
- }
68
- })
69
- flags << "-D#{macro_name}" if ok
70
- return ok
71
- end
72
- private_class_method :check_unordered_map
73
-
74
- def self.check_hash_map(flags)
75
- hash_namespace = nil
76
- ok = false
77
- ['__gnu_cxx', '', 'std', 'stdext'].each do |namespace|
78
- ['hash_map', 'ext/hash_map'].each do |hash_map_header|
79
- ok = try_compile("Checking for #{hash_map_header}", :cxx, %Q{
80
- #include <#{hash_map_header}>
81
- int
82
- main() {
83
- #{namespace}::hash_map<int, int> m;
84
- return 0;
85
- }
86
- })
87
- if ok
88
- hash_namespace = namespace
89
- flags << "-DHASH_NAMESPACE=\"#{namespace}\""
90
- flags << "-DHASH_MAP_HEADER=\"<#{hash_map_header}>\""
91
- flags << "-DHASH_MAP_CLASS=\"hash_map\""
92
- break
93
- end
94
- end
95
- break if ok
96
- end
97
- ['ext/hash_fun.h', 'functional', 'tr1/functional',
98
- 'ext/stl_hash_fun.h', 'hash_fun.h', 'stl_hash_fun.h',
99
- 'stl/_hash_fun.h'].each do |hash_function_header|
100
- ok = try_compile("Checking for #{hash_function_header}", :cxx, %Q{
101
- #include <#{hash_function_header}>
102
- int
103
- main() {
104
- #{hash_namespace}::hash<int>()(5);
105
- return 0;
106
- }
107
- })
108
- if ok
109
- flags << "-DHASH_FUN_H=\"<#{hash_function_header}>\""
110
- break
111
- end
112
- end
113
- end
114
- private_class_method :check_hash_map
115
-
116
- def self.default_extra_c_or_cxxflags(cc_or_cxx)
117
- flags = ["-D_REENTRANT", "-I/usr/local/include"]
118
-
119
- if !send("#{cc_or_cxx}_is_sun_studio?")
120
- flags << "-Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long"
121
- if send("#{cc_or_cxx}_supports_wno_missing_field_initializers_flag?")
122
- flags << "-Wno-missing-field-initializers"
123
- end
124
- if requires_no_tls_direct_seg_refs? && send("#{cc_or_cxx}_supports_no_tls_direct_seg_refs_option?")
125
- flags << "-mno-tls-direct-seg-refs"
126
- end
127
- # Work around Clang warnings in ev++.h.
128
- if send("#{cc_or_cxx}_is_clang?")
129
- flags << "-Wno-ambiguous-member-template"
130
- end
131
- end
132
-
133
- if !send("#{cc_or_cxx}_is_sun_studio?")
134
- if send("#{cc_or_cxx}_supports_feliminate_unused_debug?")
135
- flags << "-feliminate-unused-debug-symbols -feliminate-unused-debug-types"
136
- end
137
- if send("#{cc_or_cxx}_supports_visibility_flag?")
138
- flags << "-fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED"
139
- if send("#{cc_or_cxx}_visibility_flag_generates_warnings?") &&
140
- send("#{cc_or_cxx}_supports_wno_attributes_flag?")
141
- flags << "-Wno-attributes"
142
- end
143
- end
144
- end
145
-
146
- flags << debugging_cflags
147
- flags << '-DHAS_ALLOCA_H' if has_alloca_h?
148
- flags << '-DHAVE_ACCEPT4' if has_accept4?
149
- flags << '-DHAS_SFENCE' if supports_sfence_instruction?
150
- flags << '-DHAS_LFENCE' if supports_lfence_instruction?
151
- flags << "-DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS"
152
-
153
- if cc_or_cxx == :cxx
154
- flags << cxx_11_flag if cxx_11_flag
155
-
156
- if cxx_supports_wno_unused_local_typedefs_flag?
157
- # Avoids some compilaton warnings with Boost on Ubuntu 14.04.
158
- flags << "-Wno-unused-local-typedefs"
159
- end
160
-
161
- # There are too many implementations of of the hash map!
162
- # Figure out the right one.
163
- check_unordered_map(flags, "std::unordered_map", "unordered_map", "HAS_UNORDERED_MAP") ||
164
- check_unordered_map(flags, "std::tr1::unordered_map", "unordered_map", "HAS_TR1_UNORDERED_MAP") ||
165
- check_hash_map(flags)
166
- end
167
-
168
- if os_name =~ /solaris/
169
- if send("#{cc_or_cxx}_is_sun_studio?")
170
- flags << '-mt'
171
- else
172
- flags << '-pthreads'
173
- end
174
- if os_name =~ /solaris2\.11/
175
- # skip the _XOPEN_SOURCE and _XPG4_2 definitions in later versions of Solaris / OpenIndiana
176
- flags << '-D__EXTENSIONS__ -D__SOLARIS__ -D_FILE_OFFSET_BITS=64'
177
- else
178
- flags << '-D_XOPEN_SOURCE=500 -D_XPG4_2 -D__EXTENSIONS__ -D__SOLARIS__ -D_FILE_OFFSET_BITS=64'
179
- flags << '-D__SOLARIS9__ -DBOOST__STDC_CONSTANT_MACROS_DEFINED' if os_name =~ /solaris2\.9/
180
- end
181
- flags << '-DBOOST_HAS_STDINT_H' unless os_name =~ /solaris2\.9/
182
- if send("#{cc_or_cxx}_is_sun_studio?")
183
- flags << '-xtarget=ultra' if RUBY_PLATFORM =~ /sparc/
184
- else
185
- flags << '-mcpu=ultrasparc' if RUBY_PLATFORM =~ /sparc/
186
- end
187
- elsif os_name =~ /openbsd/
188
- flags << '-DBOOST_HAS_STDINT_H -D_GLIBCPP__PTHREADS'
189
- elsif os_name =~ /aix/
190
- flags << '-pthread'
191
- flags << '-DOXT_DISABLE_BACKTRACES'
192
- elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux|^arm.*-linux|sh4-linux)/
193
- # http://code.google.com/p/phusion-passenger/issues/detail?id=200
194
- # http://groups.google.com/group/phusion-passenger/t/6b904a962ee28e5c
195
- # http://groups.google.com/group/phusion-passenger/browse_thread/thread/aad4bd9d8d200561
196
- flags << '-DBOOST_SP_USE_PTHREADS'
197
- end
198
-
199
- return flags.compact.map{ |str| str.strip }.join(" ").strip
200
- end
201
- private_class_method :default_extra_c_or_cxxflags
202
-
203
- def self.portability_c_or_cxx_ldflags(cc_or_cxx)
204
- result = ''
205
- result << cxx_11_flag if cc_or_cxx == :cxx && cxx_11_flag
206
- if os_name =~ /solaris/
207
- result << ' -lxnet -lsocket -lnsl -lpthread'
208
- else
209
- result << ' -lpthread'
210
- end
211
- result << ' -lrt' if has_rt_library?
212
- result << ' -lmath' if has_math_library?
213
- result.strip!
214
- return result
215
- end
216
- private_class_method :portability_c_or_cxx_ldflags
217
- end
30
+ module PlatformInfo
31
+ # Extra flags that should always be passed to the C compiler
32
+ # when linking, to be included last in the command string.
33
+ def self.portability_c_ldflags
34
+ return portability_c_or_cxx_ldflags(:c)
35
+ end
36
+ memoize :portability_c_ldflags
37
+
38
+ # Extra flags that should always be passed to the C++ compiler
39
+ # when linking, to be included last in the command string.
40
+ def self.portability_cxx_ldflags
41
+ return portability_c_or_cxx_ldflags(:cxx)
42
+ end
43
+ memoize :portability_cxx_ldflags
44
+
45
+ # Extra compiler flags that should always be passed to the C compiler,
46
+ # last in the command string.
47
+ def self.default_extra_cflags
48
+ return default_extra_c_or_cxxflags(:cc)
49
+ end
50
+ memoize :default_extra_cflags, true
51
+
52
+ # Extra compiler flags that should always be passed to the C++ compiler,
53
+ # last in the command string.
54
+ def self.default_extra_cxxflags
55
+ return default_extra_c_or_cxxflags(:cxx)
56
+ end
57
+ memoize :default_extra_cxxflags, true
58
+
59
+ private
60
+ def self.check_unordered_map(flags, class_name, header_name, macro_name)
61
+ ok = try_compile("Checking for unordered_map", :cxx, %Q{
62
+ #include <#{header_name}>
63
+ int
64
+ main() {
65
+ #{class_name}<int, int> m;
66
+ return 0;
67
+ }
68
+ })
69
+ flags << "-D#{macro_name}" if ok
70
+ return ok
71
+ end
72
+ private_class_method :check_unordered_map
73
+
74
+ def self.check_hash_map(flags)
75
+ hash_namespace = nil
76
+ ok = false
77
+ ['__gnu_cxx', '', 'std', 'stdext'].each do |namespace|
78
+ ['hash_map', 'ext/hash_map'].each do |hash_map_header|
79
+ ok = try_compile("Checking for #{hash_map_header}", :cxx, %Q{
80
+ #include <#{hash_map_header}>
81
+ int
82
+ main() {
83
+ #{namespace}::hash_map<int, int> m;
84
+ return 0;
85
+ }
86
+ })
87
+ if ok
88
+ hash_namespace = namespace
89
+ flags << "-DHASH_NAMESPACE=\"#{namespace}\""
90
+ flags << "-DHASH_MAP_HEADER=\"<#{hash_map_header}>\""
91
+ flags << "-DHASH_MAP_CLASS=\"hash_map\""
92
+ break
93
+ end
94
+ end
95
+ break if ok
96
+ end
97
+ ['ext/hash_fun.h', 'functional', 'tr1/functional',
98
+ 'ext/stl_hash_fun.h', 'hash_fun.h', 'stl_hash_fun.h',
99
+ 'stl/_hash_fun.h'].each do |hash_function_header|
100
+ ok = try_compile("Checking for #{hash_function_header}", :cxx, %Q{
101
+ #include <#{hash_function_header}>
102
+ int
103
+ main() {
104
+ #{hash_namespace}::hash<int>()(5);
105
+ return 0;
106
+ }
107
+ })
108
+ if ok
109
+ flags << "-DHASH_FUN_H=\"<#{hash_function_header}>\""
110
+ break
111
+ end
112
+ end
113
+ end
114
+ private_class_method :check_hash_map
115
+
116
+ def self.default_extra_c_or_cxxflags(cc_or_cxx)
117
+ flags = ["-D_REENTRANT", "-I/usr/local/include"]
118
+
119
+ if !send("#{cc_or_cxx}_is_sun_studio?")
120
+ flags << "-Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long"
121
+ if send("#{cc_or_cxx}_supports_wno_missing_field_initializers_flag?")
122
+ flags << "-Wno-missing-field-initializers"
123
+ end
124
+ if requires_no_tls_direct_seg_refs? && send("#{cc_or_cxx}_supports_no_tls_direct_seg_refs_option?")
125
+ flags << "-mno-tls-direct-seg-refs"
126
+ end
127
+ # Work around Clang warnings in ev++.h.
128
+ if send("#{cc_or_cxx}_is_clang?")
129
+ flags << "-Wno-ambiguous-member-template"
130
+ end
131
+ end
132
+
133
+ if !send("#{cc_or_cxx}_is_sun_studio?")
134
+ if send("#{cc_or_cxx}_supports_feliminate_unused_debug?")
135
+ flags << "-feliminate-unused-debug-symbols -feliminate-unused-debug-types"
136
+ end
137
+ if send("#{cc_or_cxx}_supports_visibility_flag?")
138
+ flags << "-fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED"
139
+ if send("#{cc_or_cxx}_visibility_flag_generates_warnings?") &&
140
+ send("#{cc_or_cxx}_supports_wno_attributes_flag?")
141
+ flags << "-Wno-attributes"
142
+ end
143
+ end
144
+ end
145
+
146
+ flags << debugging_cflags
147
+ flags << '-DHAS_ALLOCA_H' if has_alloca_h?
148
+ flags << '-DHAVE_ACCEPT4' if has_accept4?
149
+ flags << '-DHAS_SFENCE' if supports_sfence_instruction?
150
+ flags << '-DHAS_LFENCE' if supports_lfence_instruction?
151
+ flags << "-DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS"
152
+
153
+ if cc_or_cxx == :cxx
154
+ flags << cxx_11_flag if cxx_11_flag
155
+
156
+ if cxx_supports_wno_unused_local_typedefs_flag?
157
+ # Avoids some compilaton warnings with Boost on Ubuntu 14.04.
158
+ flags << "-Wno-unused-local-typedefs"
159
+ end
160
+
161
+ # There are too many implementations of of the hash map!
162
+ # Figure out the right one.
163
+ check_unordered_map(flags, "std::unordered_map", "unordered_map", "HAS_UNORDERED_MAP") ||
164
+ check_unordered_map(flags, "std::tr1::unordered_map", "unordered_map", "HAS_TR1_UNORDERED_MAP") ||
165
+ check_hash_map(flags)
166
+ end
167
+
168
+ if os_name =~ /solaris/
169
+ if send("#{cc_or_cxx}_is_sun_studio?")
170
+ flags << '-mt'
171
+ else
172
+ flags << '-pthreads'
173
+ end
174
+ if os_name =~ /solaris2\.11/
175
+ # skip the _XOPEN_SOURCE and _XPG4_2 definitions in later versions of Solaris / OpenIndiana
176
+ flags << '-D__EXTENSIONS__ -D__SOLARIS__ -D_FILE_OFFSET_BITS=64'
177
+ else
178
+ flags << '-D_XOPEN_SOURCE=500 -D_XPG4_2 -D__EXTENSIONS__ -D__SOLARIS__ -D_FILE_OFFSET_BITS=64'
179
+ flags << '-D__SOLARIS9__ -DBOOST__STDC_CONSTANT_MACROS_DEFINED' if os_name =~ /solaris2\.9/
180
+ end
181
+ flags << '-DBOOST_HAS_STDINT_H' unless os_name =~ /solaris2\.9/
182
+ if send("#{cc_or_cxx}_is_sun_studio?")
183
+ flags << '-xtarget=ultra' if RUBY_PLATFORM =~ /sparc/
184
+ else
185
+ flags << '-mcpu=ultrasparc' if RUBY_PLATFORM =~ /sparc/
186
+ end
187
+ elsif os_name =~ /openbsd/
188
+ flags << '-DBOOST_HAS_STDINT_H -D_GLIBCPP__PTHREADS'
189
+ elsif os_name =~ /aix/
190
+ flags << '-pthread'
191
+ flags << '-DOXT_DISABLE_BACKTRACES'
192
+ elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux|^arm.*-linux|sh4-linux)/
193
+ # http://code.google.com/p/phusion-passenger/issues/detail?id=200
194
+ # http://groups.google.com/group/phusion-passenger/t/6b904a962ee28e5c
195
+ # http://groups.google.com/group/phusion-passenger/browse_thread/thread/aad4bd9d8d200561
196
+ flags << '-DBOOST_SP_USE_PTHREADS'
197
+ end
198
+
199
+ return flags.compact.map{ |str| str.strip }.join(" ").strip
200
+ end
201
+ private_class_method :default_extra_c_or_cxxflags
202
+
203
+ def self.portability_c_or_cxx_ldflags(cc_or_cxx)
204
+ result = ''
205
+ result << cxx_11_flag if cc_or_cxx == :cxx && cxx_11_flag
206
+ if os_name =~ /solaris/
207
+ result << ' -lxnet -lsocket -lnsl -lpthread'
208
+ else
209
+ result << ' -lpthread'
210
+ end
211
+ result << ' -lrt' if has_rt_library?
212
+ result << ' -lmath' if has_math_library?
213
+ result.strip!
214
+ return result
215
+ end
216
+ private_class_method :portability_c_or_cxx_ldflags
217
+ end
218
218
 
219
219
  end # module PhusionPassenger