Skip to content

Instantly share code, notes, and snippets.

@Alex4386
Last active November 8, 2024 07:23
Show Gist options
  • Save Alex4386/4cce275760367e9f5e90e2553d655309 to your computer and use it in GitHub Desktop.
Save Alex4386/4cce275760367e9f5e90e2553d655309 to your computer and use it in GitHub Desktop.
CodeWeavers CrossOver - How to compile from source! for macOS

[STOP] This gist is deprecated.

TL;DR

WAY MORE UP-TO-DATE GIST (and includes some setup stuff that I forgot to document): https://gist.github.com/sarimarton/471e9ff8046cc746f6ecb8340f942647
Current Development for Building Libre-version of CrossOver: https://github.com/GabLeRoux/macos-crossover-cloud-build.
For Latest Discussions: https://github.com/GabLeRoux/macos-crossover-cloud-build/issues.

Long Description

This version of gist is outdated since it was written while I was compiling CrossOver v19. and seems to be there are some breaking changes in v19.1+ and 20. Also, I think I missed some required libraries/stub files that was required in build (that I previously installed beforehand). Oops.

Please use the gist linked above for more information.

If you need compiled binary, @GabLeRoux did a fabulous job on building CD for Libre version of CrossOver using GitHub Actions at this repo.

This document will be stay here for archival purpose. Thanks for the updates! :D.

How to compile codeweavers crossover from source

If you have some money, try supporting wine development by supporting Crossover. (I did it)
They claim that they support the WineHQ project, and they seems to support the upstream WineGitRepoSearch

Installing Dependencies

To install, you need following dependencies to be installed on your Mac machine.

  • Xcode developer tools (Command Line)
  • cmake
  • gcc or clang to compile c codes.
  • bison >= 3.0 (can be upgraded via homebrew)
  • xquartz
  • flex
  • mingw-w64
  • pkgconfig

(If more dependencies are found, the list will be updated)

Getting the Source

Go to CodeWeavers CrossOver FOSS version Source and download the source.

This guide is strictly for Compiling on Mac. use command tar -xz whatever_the_filename_is.tar.gz to untar it.

Compiling LLVM

Go to llvm directory and create build directory with command mkdir build.

cd build to go there and run cmake ../ to configure build directory.
When cmake is done, you can run make to compile.
This will take a long time... Take your time and have a break.
(Build Time: 1h 25m 45s on 2018 Macbook Pro with intel Core i9 Processor)
now cd bin and add binaries to PATH via export PATH="$(pwd):$PATH".

Compiling Clang

Go to clang directory and create build directory with command mkdir build. (PATH setup from llvm required!!)

cd build to go there and run cmake ../ to configure build directory.
When cmake is done, you can run make to compile.
This will take some time... Take your time and have a break.
(Build Time: 34m 36s on 2018 Macbook Pro with intel Core i9 Processor)
now cd bin and add binaries to PATH via export PATH="$(pwd):$PATH".

Compiling Wine

The custom build of wine by codeweavers have special flag called --enable-win32on64.
Use that to when you setup with ./configure.

Use command CC="clang" CXX="clang++" ./configure --enable-win32on64
Then compile with make

@AgentRG
Copy link

AgentRG commented May 24, 2020

Thanks everyone. Wine managed to build. Compiler also complained about freetype, so I had to exclude it as well. My final command looked like this:

CC="clang" CXX="clang++" MACOSX_DEPLOYMENT_TARGET=10.14 ./configure --enable-win32on64 -disable-winedbg --without-x --without-vulkan --disable-mscms --without-freetype

So as I understand, simply using wine as a command won't work, only wine32on64? Otherwise I'm getting wine: could not find the Wine loader error that was posted before. I wonder if it's possible to install winetricks after all of this.

Man Catalina brought so much trouble for Wine users.

@michaeldam
Copy link

michaeldam commented May 25, 2020

First did a make clean and a config using the additional parameters like suggested by sarimarton.

Started make and Left it for the night. This is the tail of the results. I don't think I'll have time until next weekend to dig further but will try. The last step targets main.cross.o and fails a lib can't be found:
'dyld: Library not loaded: @rpath/libfreetype.6.dylib
Referenced from: /Users/michael/Projects/CrossOver/sources/wine/fonts/../tools/sfnt2fon/sfnt2fon'
The 'Referenced from' appears wrong: /Users/michael/Projects/CrossOver/sources/wine/fonts/tools/sfnt2fon/sfnt2fon is the correct path. But that's not the issue I don't think: it's @rpath/libfreetype.6.dylib that's missing.
I'll have to dig further later. Possibly someone else recognizes this as an obvious error and can give me a hint.

Full tail having main.cross.o as a target twice righ after each other (something else I did not get but I'm prepared to ignore)

i686-w64-mingw32-gcc -c -o main.cross.o main.c -I . -I ../../include -I ../../include/msvcrt -D__WINESRC__
-DWINE_CROSS_PE -Wall -fno-strict-aliasing -Wdeclaration-after-statement -Wempty-body
-Wignored-qualifiers -Wno-packed-not-aligned -Wshift-overflow=2 -Wstrict-prototypes -Wtype-limits
-Wunused-but-set-parameter -Wvla -Wwrite-strings -Wpointer-arith -Wlogical-op
-fno-omit-frame-pointer -gdwarf-2 -gstrict-dwarf -g -O2
In file included from main.c:25:
../../include/wine/debug.h: In function ‘wine_dbgstr_an’:
../../include/wine/debug.h:244:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
244 | if (!((ULONGLONG)str >> 16)) return wine_dbg_sprintf( "#%04x", LOWORD(str) );
| ^
../../include/wine/debug.h: In function ‘wine_dbgstr_wn’:
../../include/wine/debug.h:286:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
286 | if (!((ULONGLONG)str >> 16)) return wine_dbg_sprintf( "#%04x", LOWORD(str) );
| ^
../../include/wine/debug.h: In function ‘wine_dbgstr_guid’:
../../include/wine/debug.h:337:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
337 | if (!((ULONGLONG)id >> 16)) return wine_dbg_sprintf( "<guid-0x%04hx>", (WORD)(ULONGLONG)id );
| ^
../../include/wine/debug.h:337:82: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
337 | if (!((ULONGLONG)id >> 16)) return wine_dbg_sprintf( "<guid-0x%04hx>", (WORD)(ULONGLONG)id );
| ^
../../tools/wrc/wrc -o xpsprint.res -m32 --nostdinc -I . -I ../../include -I ../../include/msvcrt
-D__WINESRC__ xpsprint.rc
../../tools/winegcc/winegcc -o xpsprint.dll -B../../tools/winebuild -b i686-w64-mingw32 --lib-suffix=.cross.a
-Wl,--wine-builtin -shared xpsprint.spec -mno-cygwin main.cross.o xpsprint.res
i686-w64-mingw32-gcc -c -o main.cross.o main.c -I . -I ../../include -I ../../include/msvcrt -D__WINESRC__
-DWINE_CROSS_PE -Wall -fno-strict-aliasing -Wdeclaration-after-statement -Wempty-body
-Wignored-qualifiers -Wno-packed-not-aligned -Wshift-overflow=2 -Wstrict-prototypes -Wtype-limits
-Wunused-but-set-parameter -Wvla -Wwrite-strings -Wpointer-arith -Wlogical-op
-fno-omit-frame-pointer -gdwarf-2 -gstrict-dwarf -g -O2
../../tools/winegcc/winegcc -o xpssvcs.dll -B../../tools/winebuild -b i686-w64-mingw32 --lib-suffix=.cross.a
-Wl,--wine-builtin -shared xpssvcs.spec -mno-cygwin main.cross.o
../tools/sfnt2fon/sfnt2fon -q -o coue1255.fon courier.ttf -d 128 13,1255,8
dyld: Library not loaded: @rpath/libfreetype.6.dylib
Referenced from: /Users/michael/Projects/CrossOver/sources/wine/fonts/../tools/sfnt2fon/sfnt2fon
Reason: image not found
make[1]: *** [coue1255.fon] Abort trap: 6
make: *** [fonts] Error 2

Edit: solved by performing the following command
brew install freetype

Edit2: successfully able to run
./wine32on64 notepad

Thanks for all the help!

@michaeldam
Copy link

CC="clang" CXX="clang++" MACOSX_DEPLOYMENT_TARGET=10.14 ./configure --enable-win32on64 -disable-winedbg --without-x --without-vulkan --disable-mscms

ends in:

configure: QuickTime 64-bit development files not found, video decoding won't be supported.
configure: libinotify 64-bit development files not found (or too old), filesystem change notifications won't be supported.
configure: libsane 64-bit development files not found, scanners won't be supported.
configure: libv4l2 64-bit development files not found.
configure: libgphoto2 64-bit development files not found, digital cameras won't be supported.
configure: libgphoto2_port 64-bit development files not found, digital cameras won't be auto-detected.
configure: liblcms2 64-bit development files not found, Color Management won't be supported.
configure: libpulse 64-bit development files not found or too old, Pulse won't be supported.
configure: gstreamer-1.0 base plugins 64-bit development files not found, GStreamer won't be supported.
configure: OSS sound system found but too old (OSSv4 needed), OSS won't be supported.
configure: libudev 64-bit development files not found, plug and play won't be supported.
configure: libSDL2 64-bit development files not found, SDL2 won't be supported.
configure: libFAudio 64-bit development files not found, XAudio2 won't be supported.
configure: libcapi20 64-bit development files not found, ISDN won't be supported.
configure: libgsm 64-bit development files not found, gsm 06.10 codec won't be supported.
configure: libtiff 64-bit development files not found, TIFF won't be supported.
configure: vkd3d 64-bit development files not found (or too old), Direct3D 12 won't be supported.
configure: WARNING: libgnutls 64-bit development files not found, no schannel support.
configure: WARNING: libjpeg 64-bit development files not found, JPEG won't be supported.
configure: WARNING: libpng 64-bit development files not found, PNG won't be supported.

And I honestly don't know if this is a showstopper in the first place.

@AgentRG
Copy link

AgentRG commented May 25, 2020

How odd... even notepad won't launch after building has finished. Getting this error, maybe division by 0 is the source?

swtor@SWTORs-MacBook-Pro wine % ./wine32on64 notepad        
001d:err:plugplay:process_IOService_Device object 0x3803
001d:err:plugplay:process_IOService_Device Unable to create plug in interface for USB deviceobject 0x3807
001d:err:plugplay:process_IOService_Device object 0xa203
wine: Unhandled division by zero at address 0x1007:0x7bca2c05 (thread 0009), starting debugger...
0009:err:seh:start_debugger Couldn't start debugger ("winedbg --auto 8 100") (2)
Read the Wine Developers Guide on how to set up winedbg or another debugger
swtor@SWTORs-MacBook-Pro wine % ./wine32on64 winecfg
001d:err:plugplay:process_IOService_Device object 0x4303
001d:err:plugplay:process_IOService_Device Unable to create plug in interface for USB deviceobject 0x4307
001d:err:plugplay:process_IOService_Device object 0x5503

@michaeldam
Copy link

screenshot_48

Flawless over here. I did not exclude freetype. As mentioned above, I installed it with brew in order to be able to complete the build. brew install freetype

@AgentRG
Copy link

AgentRG commented May 26, 2020

@michaeldam Yea, looks like freetype is required. Otherwise nothing launches. Thanks for the tip.

Copy link

ghost commented Jun 5, 2020

When I try to compile clang, I get this error:
In file included from /Users/rohanraman/CompApps/clang-10.0.0.src/utils/TableGen/ASTTableGen.cpp:15: /Users/rohanraman/CompApps/clang-10.0.0.src/utils/TableGen/ASTTableGen.h:12:10: fatal error: 'llvm/TableGen/Record.h' file not found #include "llvm/TableGen/Record.h" ^~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. make[2]: *** [utils/TableGen/CMakeFiles/obj.clang-tblgen.dir/ASTTableGen.cpp.o] Error 1 make[1]: *** [utils/TableGen/CMakeFiles/obj.clang-tblgen.dir/all] Error 2

@TellowKrinkle
Copy link

@Firebirdnj8 You want to compile the custom clang that comes in the crossover source, not normal clang 10
(If you were wondering, I would guess your error is because the clang 10 source is meant to be compiled along with LLVM so if you don't it probably fails)

Copy link

ghost commented Jun 6, 2020

Ok, thank you. Another thing is that I downloaded LLVM and Clang from the official websites, and compiled separately. Maybe that is why. I will try again.

Copy link

ghost commented Jun 6, 2020

It compiled, now I get wine32on64: could not locate the Wine build tree and also wine: could not locate the Wine build tree

Copy link

ghost commented Jun 6, 2020

I do have a Linux server available, should I build on that and copy the files?

@ryandesign
Copy link

I downloaded LLVM and Clang from the official websites, and compiled separately

That cannot compile Crossover's wine with the win32on64 feature. Only Crossover's specially modified clang and llvm can do that.

could not locate the Wine build tree

I haven't heard of that before. Search Google?

I do have a Linux server available, should I build on that and copy the files?

I don't see how that would help. If you want to run this on macOS, compile it on macOS. Cross compilation is a major additional headache.

@michaeldam
Copy link

Ok, thank you. Another thing is that I downloaded LLVM and Clang from the official websites, and compiled separately. Maybe that is why. I will try again.

It's literally at the top of this post 😁
"Go to CodeWeavers CrossOver FOSS version Source and download the source."
This wine build tree comes with the right LLVM and Clang.

Copy link

ghost commented Jun 7, 2020

Ok, thank you. Another thing is that I downloaded LLVM and Clang from the official websites, and compiled separately. Maybe that is why. I will try again.

It's literally at the top of this post 😁
"Go to CodeWeavers CrossOver FOSS version Source and download the source."
This wine build tree comes with the right LLVM and Clang.

As you can see in my replies, I did compile the included LLVM and Clang once specified. Since the website did not list those two as included sources, I did not think that they were custom compilers. Giving me answers to questions that have already been solved does not help.

@michaeldam
Copy link

michaeldam commented Jun 9, 2020

I compiled the bits and pieces from others and myself into a step-by-step that should work

Getting the source code

Get Codeweaver's Wine FOSS here:

https://www.codeweavers.com/products/more-information/source

untar it

Installing build prerequisites

To install brew packet manager issue (from the Brew site):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Next install the following packages:

brew install bison

The following PATH extension is required to make sure the latest bison is used over macOS' default:

export PATH=/usr/local/Cellar/bison/3.6.2/bin:$PATH
edit: ...probable better like this. Credits to @TellowKrinkle:
export PATH=$(brew --prefix bison):$PATH

brew install mingw-w64
brew install freetype

Compiling LLVM

Go to llvm directory and create build directory with command mkdir build.
cd build to go there and run cmake ../ to configure build directory.
When cmake is done, you can run make to compile.
This will take a long time... Take your time and have a break.
(Build Time: 1h 25m 45s on 2018 Macbook Pro with intel Core i9 Processor)
now cd bin and add binaries to PATH via export PATH="$(pwd):$PATH".

Compiling Clang

Go to clang directory and create build directory with command mkdir build. (PATH setup from llvm required!!)
cd build to go there and run cmake ../ to configure build directory.
When cmake is done, you can run make to compile.
This will take some time... Take your time and have a break.
(Build Time: 34m 36s on 2018 Macbook Pro with intel Core i9 Processor)
now cd bin and add binaries to PATH via export PATH="$(pwd):$PATH".

Compiling Wine

Go to wine directory

The custom build of wine by codeweavers have special flag called --enable-win32on64.
Use that too when you setup with ./configure.
Use command

CC="clang" CXX="clang++" MACOSX_DEPLOYMENT_TARGET=10.14 ./configure --enable-win32on64 -disable-winedbg --without-x --without-vulkan --disable-mscms

Then compile with

make

Cleanup

To cleanup ./configure targets issue:

make distclean

To clean up wine targets issue:

make clean

Allowing Windows apps to run

In the directory of the Windows executable issue:

sudo xattr -d com.apple.quarantine *

@AgentRG
Copy link

AgentRG commented Jun 10, 2020

@michaeldam How does disabling Mac's SIP differentiate from removing quarantine on an exe?

@TellowKrinkle
Copy link

export PATH=/usr/local/Cellar/bison/3.6.2/bin:$PATH

You can use export PATH=$(brew --prefix bison):$PATH so that even if Homebrew's bison gets updated to something higher than 3.6.2 the command will still work

How does disabling Mac's SIP differentiate from removing quarantine on an exe?

SIP prevents all applications running on your Mac from doing specific dangerous things (e.g. modifying system files)

Quarantine prevents unsigned applications downloaded from the internet from running at all. Unsurprisingly, windows applications aren't signed in a way macOS recognizes, so macOS prevents them from running. Removing the quarantine flag allows them to run. This is normally done by right-clicking, choosing Open, and then okaying the "OMG this thing could be dangerous" prompt, but since you can't run the windows application by right-clicking and choosing Open, you have to manually remove the quarantine flag.

@HarukaMa
Copy link

A few points:

For LLVM, you may add -DLLVM_TARGETS_TO_BUILD=X86 to cmake command line as most probably you only need x86 target when using this version.

For both LLVM and Clang, you may add -DCMAKE_BUILD_TYPE=Release to cmake command line to build an optimized version. Compiling those two components could be slower, but the actual compiling process should be much faster.

@kiding
Copy link

kiding commented Dec 4, 2020

Just to note: 20.0.1, 20.0.2 (and possibly later versions) do not contain the clang/llvm source codes. Use 20.0.0 or older versions.

@Molanda
Copy link

Molanda commented Dec 10, 2020

For me, brew --prefix bison returns /usr/local/opt/bison, so I had to use...

export PATH=$(brew --prefix bison)/bin:$PATH

@Molanda
Copy link

Molanda commented Dec 10, 2020

It seems the compiler is now picky about missing extern in the C code. I had to alter the configure statement to...

CROSSCFLAGS="-g -O2 -fcommon" CC="clang" CXX="clang++" MACOSX_DEPLOYMENT_TARGET=10.14 ./configure --enable-win32on64 -disable-winedbg --without-x --without-vulkan --disable-mscms

@firefinchdev
Copy link

Go to llvm directory and create build directory with command mkdir build.
cd build to go there and run cmake ../ to configure build directory.

Which one is the LLVM directory?

@ryandesign
Copy link

Which one is the LLVM directory?

The directory called "llvm" that is inside the the directory that is created when you decompress the crossover 20.0.0 tarball. As noted above, 20.0.1 and later no longer include the llvm directory so they cannot be used for this step.

@firefinchdev
Copy link

The directory called "llvm" that is inside the the directory that is created when you decompress the crossover 20.0.0 tarball. As noted above, 20.0.1 and later no longer include the llvm directory so they cannot be used for this step.

Thanks. I was using 20.0.2 (latest) and llvm directory was not there. Using 20.0.0 now.

@GabLeRoux
Copy link

GabLeRoux commented Dec 21, 2020

Based on related gists, I created this repository:
https://github.com/GabLeRoux/macos-crossover-cloud-build

The CI build fails, but script works fine (still getting build issues). There's a couple issues which you can contribute to if you want. I find it more convenient to use repositories instead of gists as it's easier to contribute.

@sarimarton
Copy link

It's a great idea, thanks @GabLeRoux

@cutie-lyta
Copy link

I may be late, but you can add something really important for speed
Instead of make
make -j4or another number, it's the number of core that make uses
It really speed up the process a lot, it take the normal time, divided by the number, almost

@Alex4386
Copy link
Author

I may be late, but you can add something really important for speed
Instead of make
make -j4or another number, it's the number of core that make uses
It really speed up the process a lot, it take the normal time, divided by the number, almost

I thought it was kind of obvious of using -j`nproc` or equivalent but kudos for you. Next time, I will add that in the future build guide.

By the way, this gist is deprecated.
Please visit the updated gist on top of this gist. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment