Yesterday I decided to give a try in making my old 7.1 MacBook Pro second chance by upgrading macOS to Catalina with IS NOT supported by Apple.
There is a reason why they want drop support for older architecture but You can squeeze last breath if You can allow for sacrifice in stability or compatibility. Upfront I can say that iMovie crash and I was unable to resolve that issue, other applications used for basic web-dev (phpstorm, mysql, nginx, npm) looks and feel working good but still I would not recommend it for profesional work when disruption in workflow cause money or data loss – for any non critical applications, reading email, watching YT it’s worth of trying.
First step is to upgrade patched macOS dosdude1
When You got Your system set up, and try to execute applications installed with Homebrew (in my case it was node) I got this error:
illegal hardware instruction
After investigation, I was able to locate problem. Applications distributed in Homebrew as bottle are compiled for specified architecture. Authors of Homebrew have valid reason to assume that this compiled software is going to be executed on compatible hardware in correlation with macOS version. There is no change of having C2D CPU in Catalina, here is why compiled code is targeted for newer CPU.
Lucky Homebrew have ability for self compiling any packages, but that operation have exactly same (error) outcome as when installing compiled bottle.
answer to this problem, is in telling Homebrew to set target architecture for older CPU-s.
You can edit this file:
nano /usr/local/Homebrew/Library/Homebrew/extend/os/mac/hardware.rb
and change it’s content to
frozen_string_literal: true
Notice edited architecture, when OS is greater or equal to Mojave
module Hardware
def self.oldest_cpu(version = MacOS.version)
if version >= :mojave
:core2
else
generic_oldest_cpu
end
end
end
After that change we can recompile from source our not working applications by using following command.
brew reinstall -s python
-s stands from source
When trying recompile node, I still got error. After more investigation i found out that Node depend on another packages, that are already installed but not recompiled with new directive. Dirty solution i found is to see what node depend on:
brew info npm
and from following code, read dependencies section to recompile all dependent packages with -s
brew reinstall -s pkg-config
brew reinstall -s icu4c
brew reinstall -s python
After that, we can reinstall node
brew reinstall -s npm
After this operation, node works perfect. You can follow same schematic for any other applications that can be found in Homebrew.