README.macos.md 6.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
# Compiling Linphone on MacOS X

## Dependencies

* Xcode (download from apple or using appstore application)
* Java SE
* [HomeBrew](http://brew.sh) or [Macports](http://www.macports.org/).

### Multiple MacOS version support

In order to enable generation of bundle for multiple MacOS version and 32 bit processors, it is recommended to:

1. Edit `/opt/local/etc/macports/macports.conf` to add the following line:

 > macosx_deployment_target 10.6

2. Edit `/opt/local/etc/macports/variants.conf` to add the following line:

 > +universal

### Build time dependencies

#### Using MacPorts

* Linphone core dependencies
 ```sh
 sudo port install automake autoconf libtool intltool wget cunit \
 antlr3 speex libvpx readline sqlite3 libsoup openldap libupnp \
 ffmpeg-devel -gpl2
 ```

* UI dependencies: install `GTK`. It is recommended to use the `quartz` backend for better integration.

 ```sh
 sudo port install gtk2 +quartz +no_x11
 sudo port install gtk-osx-application -python27
 sudo port install hicolor-icon-theme
 ```

 #### Using HomeBrew

 ```sh
brew install automake intltool libtool pkg-config coreutils \
yasm nasm wget imagemagick gettext gtk+ speex ffmpeg pygtk
brew link gettext --force

# Yet gtk-mac-integration is not available in main repository
wget https://raw.githubusercontent.com/guitorri/homebrew/794cb6f68dd92cffc60da86fc4b900bc9ce571ef/Library/Formula/gtk-mac-integration.rb
sudo mv gtk-mac-integration.rb /usr/local/Library/Formula/
brew install gtk-mac-integration
 ```

 ### Building Linphone

The next pieces need to be compiled manually.

* To ensure compatibility with multiple MacOS versions it is recommended to do:

 ```sh
 export MACOSX_DEPLOYMENT_TARGET=10.6
 export CFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5"
 export OBJCFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5"
 export CXXFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5"
 export LDFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5 -Wl,-headerpad_max_install_names -Wl,-read_only_relocs -Wl,suppress"
 ```

* Install libantlr3c (library used by belle-sip for parsing)

 ```sh
 git clone -b linphone git://git.linphone.org/antlr3.git
 cd antlr3/runtime/C
 ./autogen.sh
 ./configure --disable-static --prefix=/opt/local && make
 sudo make install
 ```

* Install polarssl (encryption library used by belle-sip)
 ```sh
 git clone git://git.linphone.org/polarssl.git -b linphone
 cd polarssl
 ./autogen.sh && ./configure --prefix=/opt/local && make
 sudo make install
 ```

* Install belle-sip (sip stack)

 ```sh
 git clone git://git.linphone.org/belle-sip.git
 cd belle-sip
 ./autogen.sh && ./configure --prefix=/opt/local && make
 sudo make install
 ```

* (Optional) Install srtp for call encryption

 ```sh
 git clone git://git.linphone.org/srtp.git
 cd srtp && autoconf && ./configure --prefix=/opt/local && make libsrtp.a
 sudo make install
 ```

* (Optional) Install zrtpcpp, for unbreakable call encryption

 ```sh
 sudo port install cmake
 git clone https://github.com/wernerd/ZRTPCPP.git
 cd ZRTPCPP
 cmake -DCORE_LIB=true -DSDES=false CMAKE_INSTALL_NAME_DIR=/usr/local/lib/ -DCMAKE_C_FLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5" -DCMAKE_CXX_FLAGS="-arch i386 -arch x86_64 --stdlib=libstdc++ -std=c++11 -lstdc++ -mmacosx-version-min=10.5"  -DCMAKE_C_COMPILER=`xcrun --find clang` -DCMAKE_CXX_COMPILER=`xcrun --find clang` .
 sudo make install
 ```

* (Optional) Install gsm codec

 ```sh
 git clone git://git.linphone.org/gsm.git
 cd gsm
 make CCFLAGS="$CFLAGS -c -O2 -DNeedFunctionPrototypes=1"
 sudo make install INSTALL_ROOT=/opt/local GSM_INSTALL_INC=/opt/local/include
 ```

* (Optional) libvpx-1.2 has a bug on MacOS resulting in ugly video. It is recommended to upgrade it manually to 1.3 from source.
The libvpx build isn't able to produce dual architecture files. To workaround this, configure libvpx twice and use lipo to create a dual architecture `libvpx.a`.

* (Optional, proprietary extension only) Compile and install the tunnel library

 If you got the source code from git, run `./autogen.sh` first.
 Then or otherwise, do:

 `./configure --prefix=/opt/local && make && sudo make install`

* Compile Linphone

 If you got the source code from git, run `./autogen.sh` first.

 Then or otherwise, do:

 `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --prefix=/opt/local --with-readline=/opt/local --disable-x11 --with-srtp=/opt/local --with-gsm=/opt/local --enable-zrtp --disable-strict && make`

* Install on the system

 `sudo make install`

You are done.

### Generate portable bundle

If you want to generate a portable bundle, then install `gtk-mac-bundler`:

 ```sh
 git clone https://github.com/jralls/gtk-mac-bundler.git
 cd gtk-mac-bundler && make install
 export PATH=$PATH:~/.local/bin
 #make this dummy charset.alias file for the bundler to be happy:
 sudo touch /opt/local/lib/charset.alias
 ```

The bundler file in `build/MacOS/linphone.bundle` expects some plugins to be installed in `/opt/local/lib/mediastreamer/plugins`.
If you don't need plugins, remove or comment out this line from the bundler file:

```xml
<binary>
${prefix:ms2plugins}/lib/mediastreamer/plugins/*.*.so
</binary>
```

Then run, inside Linphone source tree configure as told before but with `--enable-relativeprefix` appended.

 `make && make bundle`

The resulting bundle is located in Linphone build directory, together with a zipped version.

* For a better appearance, you can install `gtk-quartz-engine` (a GTK theme) that makes GTK application more similar to other Mac applications (but not perfect).

 ```sh
 git clone https://github.com/jralls/gtk-quartz-engine.git
 cd gtk-quartz-engine
 autoreconf -i
 ./configure --prefix=/opt/local CFLAGS="$CFLAGS -Wno-error" && make
 sudo make install
 ```

Generate a new bundle to have it included.

### libiconv hack

The `Makefile.am` rules used to generate the bundle fetch a `libiconv.2.dylib` from a Linphone download page.
This library adds some additional symbols so that dependencies requiring the `iconv` from `/usr/lib` and the ones requiring from the bundle are both satisfied.
In case this library needs to generated, here are the commands:

 ```sh
 wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
 cd libiconv-1.14
 patch -p1 < ../linphone/build/MacOS/libiconv-MacOS.patch
 ./configure --prefix=/opt/local --disable-static 'CFLAGS=-arch i386 -arch x86_64 -mmacosx-version-min=10.5' 'LDFLAGS=-arch i386 -arch x86_64 -mmacosx-version-min=10.5'  CXXFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5" && make
 make install DESTDIR=/tmp
 ```

The resulted library can be found in `/tmp/opt/local/lib`.