@@ -123,6 +123,7 @@ def config=(config)
123123
124124 def refresh
125125 @dsl = DSL . new ( self )
126+ @contains_os_specific_artifacts = nil
126127 return unless @block
127128
128129 @dsl . instance_eval ( &@block )
@@ -185,35 +186,41 @@ def supports_linux?
185186
186187 return false if contains_os_specific_artifacts?
187188
188- os_value . present?
189+ # Casks with OS-specific blocks rely on the os stanza for Linux support
190+ return os_value . present? if @dsl . on_os_blocks_exist?
191+
192+ # Platform-agnostic casks: reject macOS-only artifacts and manual installers
193+ artifacts . none? do |a |
194+ Artifact ::MACOS_ONLY_ARTIFACTS . include? ( a . class ) ||
195+ ( a . is_a? ( Artifact ::Installer ) && a . manual_install )
196+ end
189197 end
190198
191199 sig { returns ( T ::Boolean ) }
192200 def contains_os_specific_artifacts?
193201 return false unless @dsl . on_system_blocks_exist?
194202
203+ return @contains_os_specific_artifacts unless @contains_os_specific_artifacts . nil?
204+
195205 any_loaded = T . let ( false , T ::Boolean )
196- @contains_os_specific_artifacts ||= begin
197- OnSystem ::VALID_OS_ARCH_TAGS . each do |bottle_tag |
198- Homebrew ::SimulateSystem . with_tag ( bottle_tag ) do
199- refresh
200-
201- any_loaded = true if artifacts . any? do |artifact |
202- ( bottle_tag . linux? && ::Cask ::Artifact ::MACOS_ONLY_ARTIFACTS . include? ( artifact . class ) ) ||
203- ( bottle_tag . macos? && ::Cask ::Artifact ::LINUX_ONLY_ARTIFACTS . include? ( artifact . class ) )
204- end
205- end
206- rescue CaskInvalidError
207- # Invalid for this OS/arch tag; treat as having no OS-specific artifacts.
208- next
209- ensure
206+ OnSystem ::VALID_OS_ARCH_TAGS . each do |bottle_tag |
207+ Homebrew ::SimulateSystem . with_tag ( bottle_tag ) do
210208 refresh
211- end
212209
213- any_loaded
210+ any_loaded = true if artifacts . any? do |artifact |
211+ ( bottle_tag . linux? && ::Cask ::Artifact ::MACOS_ONLY_ARTIFACTS . include? ( artifact . class ) ) ||
212+ ( bottle_tag . macos? && ::Cask ::Artifact ::LINUX_ONLY_ARTIFACTS . include? ( artifact . class ) )
213+ end
214+ end
215+ rescue CaskInvalidError
216+ # Invalid for this OS/arch tag; treat as having no OS-specific artifacts.
217+ next
218+ ensure
219+ refresh
214220 end
215221
216- @contains_os_specific_artifacts
222+ @contains_os_specific_artifacts = T . let ( any_loaded , T . nilable ( T ::Boolean ) )
223+ any_loaded
217224 end
218225
219226 # The caskfile is needed during installation when there are
0 commit comments