Create a Windows installer on a Mac or Linux
Your options for building a Setup.exe when you develop on macOS or Linux, from cross-compiling NSIS to a browser-only build, and how to test the result without owning a Windows PC.
Updated October 31, 2026 · 3 min read
Plenty of Windows apps are built on Macs: Electron and Tauri apps, Python tools, games, cross-compiled Go and Rust binaries. The app builds fine; the installer is where people get stuck, because the classic installer tools assume a Windows machine. Here are the ways around that, and how to test the installer when you don't have Windows at hand.
Option 1: build the installer in the browser
ExeTup builds the Setup.exe in the cloud. From a Mac or a Linux desktop:
- Produce the Windows build of your app, so that one folder contains
MyApp.exeand its files. Electron Packager, PyInstaller (run on Windows or in a Windows VM, as PyInstaller doesn't cross-compile),GOOS=windows go build,cargo build --target x86_64-pc-windows-gnuand similar all produce this. - Zip the folder and upload it.
- Fill in the name, version, publisher, scope, shortcuts and languages. Add a
.ico. - Build and download
Setup.exe.
Nothing is installed on your machine and there is no script. See how to make a Setup.exe for the options in detail.
Option 2: compile NSIS locally
NSIS's compiler runs on macOS and Linux:
brew install makensis # macOS
sudo apt install nsis # Debian, Ubuntu
makensis installer.nsi
You write the .nsi script yourself (see NSIS installer online for what that involves). The installer it produces is identical to one compiled on Windows. This is the right choice when you want the build fully inside your own CI and are happy to maintain the script.
Option 3: Inno Setup under Wine
Inno Setup is Windows-only, but its compiler runs under Wine. Install Wine, run the Inno Setup installer inside it, then call ISCC.exe through Wine from your build script. It works and some projects ship this way; expect a little friction with paths and fonts. See Inno Setup alternative for a comparison.
Option 4: a Windows build in CI
GitHub Actions, GitLab and Azure Pipelines all offer Windows runners. Build the app and the installer there, with NSIS or Inno Setup installed by a setup step, and download the artefact. Good for teams with a release pipeline; heavy for a solo developer shipping a small tool.
Making the .ico on a Mac
Windows icons are .ico files holding several sizes. From a 256×256 PNG:
brew install imagemagick
magick icon.png -define icon:auto-resize=256,128,64,48,32,16 icon.ico
Use the same file for the app binary (Electron Packager's --icon, PyInstaller's --icon) and for the installer.
Testing without a Windows PC
You should run the installer at least once before shipping. Choices, roughly in order of effort:
- A Windows virtual machine. On Apple silicon, UTM or Parallels with Windows 11 ARM run x64 apps through emulation well enough to test installs. VirtualBox and VMware work on Intel Macs and on Linux. Microsoft's licensing allows evaluation installs for testing.
- A cloud Windows desktop. Windows 365, Azure Virtual Desktop or any provider's Windows VM, by the hour.
- A colleague or a customer's machine, for a final check: run the installer, open the app from the Start Menu, uninstall from Windows Settings.
Wine on macOS can run some Windows apps, but it is not a reliable way to judge an installer.
FAQ
Can I build the Windows app itself on a Mac?
Often. Electron, Tauri, Go, Rust and .NET can target Windows from macOS. PyInstaller cannot cross-compile, so freeze Python apps on Windows or in a Windows VM, then build the installer from the folder it produces.
Do I need Wine or a VM for ExeTup?
No. The build runs in the cloud and the result downloads in your browser. A VM is only useful to test the installer afterwards.
Will an installer compiled on a Mac behave differently on Windows?
No. An NSIS installer compiled by makensis on macOS is byte-for-byte equivalent to one compiled on Windows, and ExeTup's cloud build is the same compiler.
How do I sign the installer from a Mac?
Code signing with signtool needs Windows, but osslsigncode signs Windows executables on macOS and Linux with the same certificate. See the SmartScreen guide for why signing matters.
Related guides
- How to make a Setup.exe for your Windows app (no code)What a Setup.exe actually does, the three ways to make one, and how to turn an app folder into a professional installer in minutes without writing an installer script.
- Create a Windows installer for an Electron appPackage an Electron app with Electron Packager or Forge, then turn the output folder into a Setup.exe with a wizard, shortcuts and an uninstaller, no electron-builder configuration needed.
- Build an NSIS installer online, without writing a scriptWhat NSIS is, what a minimal .nsi script looks like, and how to get a standard NSIS Setup.exe with the Modern UI wizard, shortcuts and an uninstaller from a form instead of a script.