Compiling on Mac OS X
Compiling and developing OpenTTD on MacOSX
A quick guide to get started with OpenTTD development on OSX. Note: if you have not installed any of this, it will take a while and there will be a lot to download, but you will get access to a lot more software than just OpenTTD.
Compiling OpenTTD requires use of the command line, so before you start, you should make yourself familiar with the Terminal.app if you aren't already. A very brief terminal tutorial can be found here.
Getting the source
- Source is controlled with Git, and obtained via GitHub https://github.com/OpenTTD/OpenTTD
- Git is either pre-installed by Apple on your Mac, or is available by installing Apple's XCode Developer Tools, which can be found via Apple's Site or the Mac App store
Installing Developer Tools (Xcode)
If you have access to the Mac App Store, you will find Xcode there as a free download.
Older Mac OSes
First you need to install a compiler. You should do this by installing Xcode (Requires OSX 10.3+) They should be on the CD / DVD when you got your OS. You can also download it from the Apple Developer Connection web site (free registration required), although it is over 3gb in size. This includes, amongst many other things, gcc (in the UNIX Dev Support package), which is the compiler that are used by most opensource projects, including OpenTTD.
Installing required libraries
In order to build OpenTTD from source you need to have installed some libraries which it depends upon.
The minimum requirements for OpenTTD on mac are:
and optionally you want also:
For getting the openttd source, you will need:
All of the above are installable using MacPorts.
On OSX 10.6.1 it may also be necessary to install:
The easiest solution in order to obtain these libraries is to have either Homebrew or macports install them for you. Alternatively, you may compile and install it from source for yourself. As another alternative you may visit the pages of those libraries and see whether they provide ready-compiled binary versions. At least libpng does so.
Please refer to the Homebrew website for instructions on how to install Homebrew.
Homebrew is a very simple package management system for Mac OS X. If you have Homebrew installed, you can have it build OpenTTD for you with two simple commands:
brew tap homebrew/games brew install openttd
Or manually install the libraries with:
brew install xz brew install lzma brew install pkgconfig brew install lzo2 # may not be available, use the --without-liblzo2 configure option if this fails
The MacPorts Project is an open-source community initiative to design an easy-to-use system for compiling, installing, and upgrading either command-line, X11 or Aqua based open-source software on the Mac OS X operating system. As you will install libraries in your system directories, you'll need to do so as administrator via the command sudo - which will require you to enter the administrator password. Further information regarding
sudo can be found on wikipedia.
Installing libraries with MacPorts
Before installing any libraries, make sure you have access to the latest ports by updating the local repository:
sudo port selfupdate
(Everything will need to be compiled first, so have patience.)
Install libpng, liblzma' (provided by xz package)', pkgconfig (required for lzma detection), lzo2 and libiconv (the required zlib will be installed as dependency automatically).
sudo port install libpng sudo port install xz sudo port install pkgconfig sudo port install lzo2 sudo port install libiconv
At least in order to compile a static binary (for redistribution), but also for your convenience, you might want these as well:
sudo port install fontconfig sudo port install freetype sudo port install icu
Some further notes on MacPorts
Fun fact: if you have installed yourself libraries and build them for other architectures than x86_64 i386 ppc and ppc64 it might fail. Those four seem to be accepted, but macports might bitch, if others are found like ppc970.
If you want truly universal libraries it might be needed that you compile the libraries yourself, especially as newer versions (e.g. Snow Leopard) only support 'universal' binaries and libraries with the i386 and x86_64 architectures while OpenTTD's universal binaries can also include ppc, ppc64 and ppc970.
There's no build script to get the required universal libraries, but some steps which can be followed will get you there.
- get the source of the library
- make sure it compiles with your usual settings w/o modification
- build all different architectures. This short shell script gives you an idea how to do it analogously for all libraries, this is made to build libz 1.2.5, you might need to adopt it accordingly:
#!/bin/bash export archs="ppc ppc64 ppc970 i386 x86_64" #export archs="ppc" export sdk="/Developer/SDKs/MacOSX10.4u.sdk" export file="libz.1.2.5.dylib" for this in $archs; do echo "$this" flags="-arch $this -isysroot $sdk -I$sdk/usr/include -mmacosx-version-min=10.3" export CFLAGS="$flags" export CXXFLAGS="$flags" export CPPFLAGS="$flags" export LDFLAGS="$flags" make clean ./configure make cp $file $this.$file done lipo -create *.$file -output $file
- subsequently install the resulting libz.1.2.5.dylib into your library dir, either /usr/lib or /opt/local/lib
Repeat similar steps for the other libraries.
Compiling the source
For those just wanting a working copy for themselves, enter the following into a terminal window:
cd ~/Downloads/directory_containing_downloaded_sources ./configure make make bundle
For more detailed instructions, and options, read on...
Applying a patch
If you want to use a patch/diff file then you have to apply it before using configure. This is done in the same way as on Linux so you should read this: GNU/Linux#Applying_a_patch
There is a configure script. This is used to figure out what your system is like and generate a makefile to compile a binary designed for your system. To run it, just write
./configure and it will figure everything out on its own.
If you have a special request for your compilation, then you need to give arguments to configure. To see a full list of available settings, use the help system (
Example: if you want to make a static build (the binary will contain the needed parts of the libraries so they do not have to be installed on the computer playing the game), you will have to type
./configure --enable-static. This is recommended for Mac OS X builds. Multiple arguments can be added like
./configure --enable-static --enable-dedicated.
Configuring on Mavericks (and Yosemite)
- There is no liblzo2 in the package managers yet for Mavericks (as of 1 Nov 2013). To configure without this optional library, use
- Mac OS 10.9 has removed the method declarations related to palettes and 8-bit graphics from the CoreGraphics header files. You may either
#if 0those blocks out (in fullscreen.mm) or compile against the Mac OS 10.8 SDK.
- The version of Clang that ships with Xcode 5.0.1 uses a custom C++ library. To link OpenTTD, you must tell Clang to use the standard one.
All of the above can be achieved with this configure command:
./configure --enable-static --without-liblzo2 --without-osx-sysroot CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk" LDFLAGS="-stdlib=libstdc++"
Some users report linker failures with the configure command above. The following command may solve those failures:
./configure --enable-static --without-liblzo2 --without-freetype --without-osx-sysroot CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk" LDFLAGS="-stdlib=libstdc++"
October 2014 Update - applies to both Mavericks and Yosemite Apple released an Xcode update for Mavericks in October 2014, which appears to remove the 10.8 SDK. Following this update, OpenTTD compiles for at least some users with:
./configure --without-freetype LDFLAGS="-stdlib=libstdc++"
This also works on Yosemite.
If you can supply an appropriate version of Freetype, the --without-freetype flag might be unnecessary.
When configure has made a makefile for you, all you need to do to compile is to type
make. The binary is then placed in the "bin" subdirectory.
If needed, make can accept arguments as well. Commonly used arguments will be (all of them will start by compiling the game if needed):
make run: will start the game
make bundle: this will create a bundle inside the bundle directory (created if needed). This means that the game will be executable from finder and not only terminal
make bundle_dmg: as above, but will create a dmg
make help: lists all "targets" available (like make run and make bundle)
Make also accepts standard make arguments. The most interesting is the
-j option. By default GCC compiles one file at a time and it can only use one CPU/core to compile a single file. If you want to compile as fast as possible, you can tell it to compile more files at once with the
-j option. Example:
make bundle -j 4 will compile 4 files at once, making good use of a dualcore computer. Usually having two files compiling on each core is the fastest as one compile while the other one waits for read/write to the disk.
Note: the makefile dependencies has to be set up correctly for this to work. While they are for OpenTTD, don't assume this for other projects or nasty stuff can happen, like weird compilation errors.
If it comes to frequent compiles, it might be worth to look for alternative compilers. Newer OSX bring also llvm-gcc binaries which offer a speed gain during compilation for the cost of a bit slower binaries. In order to activate the set the environment variables CC=/Developer/usr/bin/llvm-gcc and CXX=/Developer/usr/bin/llvm-g++
When compiling fails
- If you get a linker error like the following,
[SRC] Linking openttd Undefined symbols for architecture x86_64: "_BZ2_bzDecompressInit", referenced from: _FT_Stream_OpenBzip2 in libfreetype.a(ftbzip2.o) _ft_bzip2_stream_io in libfreetype.a(ftbzip2.o) "_BZ2_bzDecompressEnd", referenced from: _ft_bzip2_stream_io in libfreetype.a(ftbzip2.o) _ft_bzip2_stream_close in libfreetype.a(ftbzip2.o) "_BZ2_bzDecompress", referenced from: _ft_bzip2_file_fill_output in libfreetype.a(ftbzip2.o) ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status make: *** [openttd] Error 1 make: *** [all] Error 1
freetype. For example, if you are using macports, you can achieve this by executing
sudo port activate freetype @<version number>
Or use the
--without-freetype configure option.
- If you get an error that starts with something like this:
ISO C++ forbids forward references to 'enum' types
CFLAGS="-std=c++11" to the end of your configure call.
- If your error looks like this:
Undefined symbols for architecture x86_64: "_iconv", referenced from: convert_tofrom_fs(void*, char const*) in unix.o "_iconv_open", referenced from: OTTD2FS(char const*) in unix.o FS2OTTD(char const*) in unix.o ld: symbol(s) not found for architecture x86_64
LDFLAGS="-liconv" (you may have to merge this with other used LDFLAGS).
Compiling universal binaries
Compiling a universal binary is done by adding
--enable-universal to configure:
This is all if your system is set up correctly. Make will then compile for intel, PPC and PPC970 (optimized for this particular CPU. Apple renamed it to G5), so setting G5 flags and such shouldn't be needed. Static is also enabled by default as it's assumed that the binary is to be moved to another computer.
For this to work, you will need universal libraries. For more info, read universal_libraries