Compiling on Mac OS X

Contents

Compiling and developing OpenTTD on MacOSX

/File/en/Archive/Compilation and Ports/Terminal Mac OSX.png

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)

/File/en/Archive/Compilation and Ports/Compiling MacOSX 02-Xcode.png

Recent OSes

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.

/File/en/Notice.png
Note
By default, this will also install the iOS SDK, which you probably won't need. You can uncheck it in the final installation settings or just disagree with its license to save several gigabytes of disk space.

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:

Git is preinstalled on recent versions of macOS, but otherwise is installable using MacPorts.

SDL and fontconfig are not required on Mac. zlib comes with the OS so you don't need to install zlib.

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.

Using 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 lzo
brew install pkg-config
/File/en/Content.png
Warning
The homebrew pages contains advice concerning how to handle directories usually only writable by root (requiring the admin password) and claims as to which of these “could safely be deleted”. It cannot be recommended to follow any of this advice if you are not 100% sure of what you do. You may corrupt your system without possibility to recover it.

Using MacPorts

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
/File/en/Notice.png
Note
If you want to compile universal binaries to distribute, add " +universal" at the end of each line.

(Everything will need to be compiled first, so have patience.)

Install libpng, liblzma' (provided by xz package)',pkgconfig(required for lzma detection),lzo2andlibiconv(the requiredzlibwill 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

It might be worth to risk a look at the macports documentation. If you need for one or another reason an old(er) library version, a short walk-through is found here

/File/en/Notice.png
Note
There are issues with some gcc versions which are supplied by macports. Use one of the apple-supplied compilers if fails with illegal compiler arguments. You can switch the compiler being used by installing gcc_select package from macports, then using port select <version>

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.

Installing manually

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.

#!/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

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

After the compiler is done doing all it's stuff, you should find yourself a working OpenTTD.app in the bundles folder! /File/en/Manual/Smile 22px.png

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: Compiling on GNU∕Linux and 🟉BSD#applying-a-patch

Configure

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 (./configure --help)

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)

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.

Compiling

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 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

[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[1]: *** [openttd] Error 1
make: *** [all] Error 1

try downgrading 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.

ISO C++ forbids forward references to 'enum' types

try adding CFLAGS="-std=c++11" to the end of your configure call.

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

specify 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:
./configure --enable-universal

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