Making a Mac Common binary for Intel and ARM M1/M2 with Qt

Apple has transitioned Macs from Intel to ARM (M1/M2) chips. Within the course of it has supplied an emulation layer (Rosetta2) to make sure that the brand new ARM Macs can nonetheless run purposes created for Intel Macs. The emulation works very nicely, however is quoted to be some 20% slower than operating native ARM binaries. That won’t appear to be loads, however it’s important on processor intensive purposes akin to my very own knowledge wrangling software program, which regularly processes datasets with thousands and thousands of rows via complicated sequences of merging, splitting, reformatting, filtering and reshaping. Additionally individuals who have simply spent a small fortune on a shiny new ARM Mac can get grumpy about not having a local ARM binary to run on it. So I’ve been investigating shifting Simple Knowledge Remodel from an Intel binary to a Common (‘fats'[1]) binary containing each Intel and ARM binaries. It is a course of acquainted from shifting my seating planner software program for Mac from PowerPC to Intel chips some years in the past. Hopefully I’ll have retired earlier than the subsequent chip change on the Mac.

My software program is constructed on-top of the wonderful Qt cross-platfom framework. Qt introduced help for Mac Common binaries in Qt 6.2 and Qt 5.15.9. I’m sticking with Qt 5 for now, as a result of it higher helps a number of textual content encodings and since I don’t see any explicit benefit to switching to Qt 6 but. However, there’s a wrinkle. Qt 5.15.3 and later are solely accessible to Qt clients with industrial licenses. I wish to use the QtCharts element in Simple Knowledge Remodel v2, and QtCharts requires a industrial license (or GPL, which is a no-go for me). I additionally need entry to all the most recent bug fixes for Qt 5. So I made a decision to modify from the free LGPL license and purchase a industrial Qt license. Fortunately I used to be eligible for the Qt small enterprise license which is at the moment $499 per yr. The push in the direction of industrial licensing is controversial with Qt builders, however I actually respect Qt and all of the work that goes into it, so I’m comfortable to help the enterprise (not sufficient to pay the eye-watering charge for a full enterprise license although!).

Transferring from producing an Intel binary utilizing LGPL Qt to producing a Common binary utilizing industrial Qt concerned a number of main stumbling factors that took me hours and a number of googling to kind out. I’m going to spell them out right here to avoid wasting you that ache. You’re welcome.

  • The most recent Qt 5 LTS releases aren’t accessible through the Qt upkeep software when you’ve got open supply Qt put in. After you purchase your industrial licence that you must delete your open supply set up and all of the related license recordsdata. Right here is the data I obtained from Qt help:
I assume that you simply had been beforehand utilizing open supply model, is that right?

Qt 5.15.10 ought to be accessible via the upkeep software however it's required to take away the previous open supply set up fully and likewise take away the open supply license recordsdata out of your system.

So, first step is to take away the previous Qt set up fully. Then take away the previous open supply licenses which could exist. Directions for eradicating the license recordsdata:

Unified installer/maintenancetool/qtcreator will save all licenses (downloaded from the used Qt Account) inside the brand new qtlicenses.ini file. You should take away the next recordsdata to completely reset the license data.

Home windows


"/Customers/$USERNAME/Library/Utility Help/Qt/qtlicenses.ini"
"/Customers/$USERNAME/Library/Utility Help/Qt/qtaccount.ini"

As a aspect observe: If the recordsdata above can't be discovered $HOME/.qt-license(Linux/macOS) or %USERPROFILE%.qt-license(Home windows) file is used as a fallback. .qt-license file could be downloaded from Qt Account.
Remember to identify the Qt license file as ".qt-license" and never for instance ".qt-license.txt".


After eradicating the previous set up and the license recordsdata, please obtain the brand new on-line installer through your industrial Qt Account.
You possibly can login there at:

After putting in Qt with industrial license, it ought to have the ability to discover the Qt 5.15.10 additionally via the upkeep software along with on-line installer.
  • Then that you must obtain the industrial installer out of your on-line Qt account and reinstall all of the Qt variations you want. Gigabytes of it. Time to drink some espresso. Loads of espresso.
  • In your .professional file that you must add:
macx {
  • Observe that the above doubles the construct time of your software, so that you in all probability don’t need it set for day after day improvement.
  • You should use macdeployqt to create your deployable Common .app however, and that is the important step that took me hours to work out, that you must use <QtDir>/macos/bin/macdeployqt not <QtDir>/clang_64/bin/macdeployqt . Doh!
  • I used to be in a position to make use of my present practise of copying additional recordsdata (third celebration libraries, assist and so forth) into the .app file after which digitally signing the whole lot utilizing codesign –deep [2]. Fortunately the one third celebration library I exploit other than Qt (the wonderful libXL library for Excel) is out there as a Common framework.
  • I notarize the applying, as earlier than.

I did all of the above on an Intel iMac utilizing the most recent Qt 5 LTS launch (Qt 5.15.10) and XCode 13.4 on macOS 12. I then examined it on an ARM MacBook Air. Little doubt you may also construct Common binaries on an ARM Mac.

Unsurprisingly the Common app is considerably bigger than the Intel-only model. My Simple Knowledge Remodel .dmg file (which additionally contains a number of assist documentation) went from ~56 MB to ~69 MB. Nonetheless that’s nonetheless positively anorexic in comparison with many bloated fashionable apps (taking a look at you Electron).

A few checks I did on an ARM MacBook Air confirmed ~16% enchancment in efficiency. For instance becoming a member of two 500,000 row x 10 column tables went from 4.5 seconds to three.8 seconds. Clearly the efficiency enchancment is dependent upon the duty and the system. One buyer reported batch processing 3,541 JSON Recordsdata and writing the outcomes to CSV went from 12.8 to eight.1 seconds, a 37% enchancment.

[1] I’m not judging.

[2] Apparently the usage of –deep is frowned on by Apple. Nevertheless it works (for now anyway). Chunk me, Apple.


Leave a Reply

    Your Cart
    Your cart is emptyReturn to Shop