So a couple of days ago, I documented how I compiled Wine 1.9.21 with Retina Mode from scratch on macOS Sierra. After that I though I might as well figure out how to bundle all these files into a .app bundle, which Finder presents as if it were a single file.

Turns out to be quite easy:

  1. Create the folder hierarchy for the bundle.
  2. Create two required files (Info.plist and PkgInfo) and, optionally, an icon.
  3. Copy all the compiled Wine files into the folder created.
  4. Create a script to start Wine.

Create the bundle

Choose a directory to create the package and run these in shell:

mkdir -p Wine.app/Contents/MacOS
mkdir -p Wine.app/Contents/Resources

Create required files

In the folder Contents you must:

  • Create a file called PkgInfo containing APPL????.
  • Create a file called Info.plist containing:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key><string>startwine</string>
<key>CFBundleIconFile</key><string>wine.icns</string>
<key>CFBundleIdentifier</key><string>com.myByways.wine</string>
<key>CFBundlePackageType</key><string>APPL</string>
<key>CFBundleVersion</key><string>1.9.21</string>
<key>CFBundleSupportedPlatforms</key>
<array><string>MacOSX</string></array>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key><string>10.6</string>
</dict>
</plist>

You can, and should, modify items as you see fit, as documented under the section Recommended Keys for Cocoa Apps and Launch Service Keys:

  • CFBundleExecutable - the executable to run, in the MacOS folder, but can also be a bash script!
  • CFBundleIconFiles - the icon, either in ICNS or PNG (I think) formats.
  • CFBundlePackageType - don't change this, because AAPL indicates it's an application.

Optionally, create an icon file called wine.icns in the Resources folder. What I did was:

  1. Download the wine_logo.svg from WineHQ.
  2. Edit the icon in GIMP to make it 1024x1024 (square) and export as PNG.
  3. Convert the PNG into the icns format. I used Iconie (free, Mac App Store).
  4. Copy the resulting ICNS file to Resources.

Or,

  • If you don't want to bother, just leave this step off. The system will use a standard icon.
  • You could also choose and use a standard icon included with macOS e.g. GenericApplicationIcon.icns at /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/.
  • Or, download the one I created (and give credit where it's due, since I only took the one made available at WineHQ).

Click the icon to download wine.icns: Wine Icon in ICNS format

Create the bundle

Next, copy the Wine files to the bundle. In my previous guide on building Wine, the compiled outputs were put in ~/Downloads/wine/usr. Just copy the contents within this folder to Resources. You should end up with a folder hierarchy like this:

  • Wine.app
    • Contents
      • MacOS
      • Resources
        • bin
        • include
        • lib
        • share

You can choose to remove files that are not required, e.g. includes, man pages, .old files, or documents (I noted some .html files). I also moved the files from sbin to bin so that a single PATH would suffice.

Also, I don't have a "Mac Developer" certificate, so can't "code sign". This means you may get Gatekeeper warnings. Just FYI, Apple's recommendation is to use MacOS, Frameworks and Plugins folders for code and sign them, but here, everything is in Resources (i.e. expected to be "data" files) so there is no need to sign them.

Create a script to start Wine

Create a simple script called startwine in the MacOS folder. I did not use the .sh extension and it still worked:

#!/bin/bash
cd "$(dirname $0)"
cd "../Resources/bin"
export PATH="$PWD":$PATH
exec winefile C:\\

The first cd is to go to actual directory where startwine is located, since the current path may be anything. The second cd will move to where the Wine executable resides, i.e. bin, which must be added to PATH for Wine to find its dependencies. A bit of a hack, I know.

You need to set the executable bit for this file, or else you'll get an error "The application "Wine.app" can't be opened." when trying to run the app:

chmod +x startwine

Now you can double-click Wine.app and it'll run the Wine file manager! You could change this to explorer (i.e. wine explorer) or command console (wineconsole).

Problems stopping Wine

I encountered a few instances where Wine.app was still running after closing all windows and I could not Quit Wine:

Wine Cannot Quit

It would seem the program I ran needed various background services, which Wine started. But Wine does not stop them, and these orphans sometimes prevent Wine.app from closing cleanly.

To check for running services, run ps

ps -e | grep -e C: -e wineserver

This gives a list like this:

ps -e | grep -e C: -e wineserver
 1941 ??         0:00.04 C:\windows\system32\services.exe 
 1945 ??         0:00.03 C:\windows\system32\plugplay.exe 
 1947 ??         0:00.47 C:\windows\system32\explorer.exe /desktop 
 2039 ??         0:00.12 C:\windows\system32\svchost.exe -k imgsvc 
 2049 ??         0:20.20 C:\Program Files\Paint.NET\PaintDotNet.exe 
 3328 ttys000    0:00.00 grep --color=auto -e C: -e wine

Stop these services with winserver -k.

If that fails, then kill each process manually by Process ID, e.g.:

kill -9 1941 1945 1947 2039 2049

Problems with Windows applications

I have run a few apps and found some problems, but it's best you check with the Wine AppDB. Lots of apps don't work, and you can't expect perfect operation! And as mentioned before, icons and text may appear off due to Wine's experimental Retina Mode.

In my case, I did a quick test with a few 32-bit apps:

  • Word 2010
  • Excel 2010
  • Powerpoint 2010 - needed riched20 to be (native, builtin) as described in the Wine AppDB:
    • Run winecfg (Wine Configuration) and click the Libraries tab.
    • In the New override for library combo box, type riched20
    • Press Add.
    • You should see riched20 (native, builtin) in the list, but if not, Edit it and select Native then Builtin.
  • Notepad++
  • Paint.Net 3.5.11 (note: version 4 and above do not work) - installer will have an error (believe it's when trying to optimzie .NET) but complete; zooming does not update until scrolled; crashes on exit.

Wine in Retina Mode Running Microsoft Word and Powerpoint 2010 32-bit

Final words

If you have made it this far, congratulations! It was really quite a task for me to get to this point, and hopefully it'll be much smoother for you!

I have done lots more, like:

  • Scripts to download, compile and re-link Wine and its dependencies.
  • A very cool version of startwine that pops up a menu of available Wine Prefixes (i.e. the folder from which to run Wine's "virtual" C:\Windows).
  • And a killwine that does what I described above automatically.

But, I honestly don't know if anyone would be interested, since I barely test anything. All I know is it works for me!

Update 30 Oct 2016: Added winserver -k which stops background services (most of the time).