Building Subsurface from Source =============================== Subsurface uses a few open source libraries and frameworks to do its job. The most important ones include libdivecomputer, Qt, Marble (more precisely libmarblewidget), libxml2, libxslt, libsqlite3, libzip, and libgit2. Below are instructions for building Subsurface under some popular Linux distributions, for building Subsurface using Homebrew on a Mac, and for cross-building Subsurface for Windows. The lack of a working package management system for Windows makes it really painful to build Subsurface natively under Windows, so we don't support that at all. All of the prebuilt binaries that we provide (right now Windows, Mac, Ubuntu/Debian/LinuxMint, and openSUSE/Fedora) are built using our own custom "flavors" of libdivecomputer and libmarblewidget. You can get these from git://git.subsurface-divelog.org/marble (in the Subsurface-4.4 branch) git://git.subsurface-divelog.org/libdc (in the Subsurface-4.4 branch) Both of these repositories also have a Subsurface-testing branch. That branch is explicitly marked as NOT STABLE and will receive force pushes. The rationale for this is that we have no intention of forking either of these two projects. We simply are adding a few patches on top of their latest versions and so those testing branches get frequently rebased. Also, all of the prebuilt binaries (with the exception of the Ubuntu 12.04 build) are now Qt5 based and Qt5 is considered the stable and supported framework to use for building Subsurface. The sources contain a best effort patch in packaging/ubuntu/0001-Make-build-with-Qt4.patch that attempts to continue to allow building with Qt4, but that is not officially supported and will result in missing functionality. Build options for Subsurface ---------------------------- The following options are recognized when passed to qmake: -config debug Create a debug build -config release Create a release build The default depends on how Qt was built. V=1 Disable the "silent" build mode LIBDCDEVEL=1 Search for libdivecomputer in ../libdivecomputer LIBMARBLEDEVEL=path Search for marble library and includes in path SPECIAL_MARBLE_PREFIX=1 Use libssrfmarblewidget as library name This is needed when building with our marble branch LIBGIT2DEVEL=path Search for libgit2 library and includes in path INCLUDEPATH+=xxx Add xxx to the include paths to the compiler (pass the actual path, without -I) LIBS+=xxx Add xxx to the linker flags. -l and -L options are recognized. DEFINES+=SHOW_PLOT_INFO_TABLE=1 Only available in debug builds, this creates a second window that shows all elements in the plot_info structure as a table - very useful when debugging issues with the profile The INCLUDEPATH and LIBS options are useful to tell the buildsystem about non-standard installation paths for the dependencies (such as Marble). They can be repeated as often as needed, or multiple arguments can be passed on the same switch, separated by a space. For example: qmake LIBS+="-L$HOME/marble/lib -L$HOME/libdivecomputer/lib" \ INCLUDEPATH+="$HOME/marble/include $HOME/libdivecomputer/include" Building Subsurface 4 under Linux --------------------------------- On Fedora you need sudo yum install git gcc-c++ make autoconf automake libtool cmake \ libzip-devel libxml2-devel libxslt-devel libsqlite3x-devel \ libgit2-devel libudev-devel libusbx-devel \ qt5-qtbase-devel qt5-qtdeclarative-devel qt5-qtscript-devel \ qt5-qtwebkit-devel qt5-qtsvg-devel qt5-qttools-devel Package names are sadly different on OpenSUSE sudo zypper install git gcc-c++ make autoconf automake libtool cmake libzip-devel \ libxml2-devel libxslt-devel sqlite3-devel libgit2-devel libusb-1_0-devel \ libqt5-linguist-devel libqt5-qttools-devel libQt5WebKitWidgets-devel \ libqt5-qtbase-devel libQt5WebKit5-devel libqt5-qtsvg-devel \ libqt5-qtscript-devel libqt5-qtdeclarative-devel On Debian Jessie this seems to work sudo apt-get install git g++ make autoconf libtool cmake pkg-config \ libxml2-dev libxslt1-dev libzip-dev libsqlite3-dev \ libusb-1.0-0-dev libgit2-dev \ qt5-default qt5-qmake qtchooser qttools5-dev-tools libqt5svg5-dev \ libqt5webkit5-dev libqt5qml5 libqt5quick5 libqt5declarative5 \ qtscript5-dev On PCLinuxOS you appear to need the following packages su -c "apt-get install -y autoconf automake cmake libtool gcc-c++ git \ lib64usb1.0-devel lib64zip-devel lib64qt5webkitwidgets-devel qttools5 \ qttranslations5 lib64qt5xml-devel lib64qt5test-devel lib64qtscript-devel \ lib64qt5svg-devel lib64qt5concurrent-devel" In order to build Subsurface, use the supplied build script. This should work on most systems that have all the prerequisite packages installed... You should have Subsurface sources checked out in a sane place, something like this: mkdir -p ~/src cd ~/src git clone -b v4.4.1 git://subsurface-divelog.org/subsurface ./subsurface/scripts/build.sh # <- this step will take quite a while as it # compiles a handful of libraries before # building Subsurface Now you can run Subsurface like this: cd ~/src/subsurface ./subsurface Building Subsurface under MacOSX (using Homebrew) ------------------------------------------------- 0) You need to have XCode installed. The first time (and possibly after updating OSX) you need to run $ xcode-select --install 1) Install Homebrew $ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)" 2) Install needed dependencies $ brew install asciidoc libzip sqlite cmake libusb pkg-config 3) Make the brew version of sqlite the default $ brew link --force sqlite 4) Download Qt from http://www.qt.io/download-open-source/ In the installer, chose an install folder (e.g., /home/username/Qt5), in "Select components" select the most recent version and be sure you also install the "Source Components". Build it (takes a long time) $ cd ~/Qt5/5.4/Src/ $ ./configure -prefix /usr/local -opensource $ make -j4 $ make install 5) Install custom subsurface Marble $ cd ~/src $ git clone -b Subsurface-4.4 git://subsurface-divelog.org/marble marble-source $ cd marble-source $ mkdir marble-build $ cd marble-build $ cmake -DCMAKE_BUILD_TYPE=Debug -DQTONLY=TRUE \ -DQT5BUILD=ON -DCMAKE_INSTALL_PREFIX=/usr/local ../../marble-source $ cd src/lib/marble $ make -j4 $ make install 5) Install Libdivecomputer $ brew install automake libtool $ cd ~/src $ git clone -b Subsurface-4.4 git://subsurface-divelog.org/libdc libdivecomputer # -> when not building a release version of Subsurface but the # latest master, it may be necessary to build against the # Subsurface-testing branch $ cd libdivecomputer $ autoreconf --install $ ./configure --disable-shared $ make -j4 $ make install 6) Compile Subsurface $ cd ~/src $ git clone git://subsurface-divelog.org/subsurface.git $ cd subsurface $ qmake SPECIAL_MARBLE_PREFIX=1 INCLUDEPATH+=/usr/local/include \ LIBS+=-L/usr/local/lib \ LIBS+='-L/usr/local/Cellar/libzip/0.11.2/lib -lzip -lz' \ INCLUDEPATH+=/usr/local/Cellar/libzip/0.11.2/include V=1 \ LIBMARBLEDEVEL=../marble-source/marble-build/ $ make -j4 $ make install_mac_bundle After the above is done, Subsurface will be installed to /Applications. Another option is to create a .dmg for distribution: $ qmake $ make $ make mac-create-dmg Cross-building Subsurface on Linux for Windows ---------------------------------------------- Subsurface builds nicely with MinGW - the official builds are done as cross builds under Linux (currently on Fedora 20). A shell script to do that (plus the .nsi file to create the installer with makensis) are included in the packaging/windows directory. On OpenSUSE, for mingw64 packages you should add the specific repository from their site. After that you can run the following command: sudo zypper install mingw64-cross-libqt5-qttools mingw64-mpc-devel \ mingw64-filesystem mingw64-pkg-config mingw64-cross-gcc \ mingw64-gcc-c++ mingw64-libusb-1_0-devel \ mingw64-cross-libqt5-qttools mingw64-libqt5-qtwebkit \ mingw64-libqt5-qtwebkit-devel mingw64-cross-libqt5-qmake \ mingw64-libqt5-qtscript mingw64-libqt5-qtscript-devel \ mingw64-libqt5-qtsvg mingw64-libqt5-qtsvg-devel \ mingw64-libqt5-qtdeclarative mingw64-libqt5-qtdeclarative-devel \ mingw64-libssh2-devel mingw64-libzip-devel \ mingw64-sqlite-devel mingw64-win_iconv-devel \ mingw64-libxslt-devel mingw64-libqt5-qttools [Observation] - Sometimes on OpenSUSE platform there is a problem with the mingw64-libzip-devel package(the zipconf header is not installed in the right place) and you have to create a symbolic link using the following command: sudo ln -s /usr/x86_64-w64-mingw32/sys-root/mingw/lib/libzip/include/zipconf.h \ /usr/x86_64-w64-mingw32/sys-root/mingw/include/zipconf.h Everywhere below the mingw64- prefix is used for the cross tools. If you really need a 32bit binary you need to use mingw32- as prefix and you may also run into issues creating an installable binary with Qt5 (i.e., you may have to go back to Qt4). The best way to get libdivecomputer to build appears to be $ mkdir -p ~/src $ cd ~/src $ git clone -b Subsurface-4.4 git://subsurface-divelog.org/libdc libdivecomputer # or -b Subsurface-testing to get the testing version - careful, # careful - this gets rebased and may be broken # -> when not building a release version of Subsurface but the # latest master, it may be necessary to build against the # Subsurface-testing branch $ cd libdivecomputer $ autoreconf --install $ mingw64-configure --disable-shared $ mingw64-make $ sudo mingw64-make install To compile Marble, use: $ cd ~/src $ git clone -b Subsurface-4.4 git://subsurface-divelog.org/marble marble-source # or -b Subsurface-testing to get the testing version - careful, # careful - this gets rebased and may be broken $ mkdir marble-build $ cd marble-build $ mingw64-cmake -DQTONLY=ON -DQT5BUILD=ON \ -DBUILD_MARBLE_APPS=OFF -DBUILD_MARBLE_EXAMPLES=OFF \ -DBUILD_MARBLE_TESTS=OFF -DBUILD_MARBLE_TOOLS=OFF \ -DBUILD_TESTING=OFF -DWITH_DESIGNER_PLUGIN=OFF \ -DBUILD_WITH_DBUS=OFF ../marble-source $ mingw64-make # <- this step will take quite a while... if you have more cores # try ming64-make -j8 or something like that $ sudo mingw64-make install To compile libgit2, use: $ git clone git://github.com/libgit2/libgit2 ~/src/libgit2 $ mkdir ~/src/libgit2/build $ cd ~/src/libgit2 $ git checkout v0.21.5 $ cd build $ mingw64-cmake .. $ mingw64-make $ sudo mingw64-make install To compile Subsurface, use: $ cd ~/src $ git clone git://subsurface-divelog.org/subsurface.git $ cd subsurface $ git checkout v4.4-branch # this get's you the last release # skip this step to build the latest development # version $ packaging/windows/mingw-make.sh Qt5-64 $ packaging/windows/mingw-make.sh install $ packaging/windows/mingw-make.sh installer The last step assumes that you have a link from packaging/windows/dll to the correct directory in your MinGW installation. On my machine that is /usr/i686-w64-mingw64/sys-root/mingw/bin Similarly, the paths used in packaging/windows/mingw-make.sh may need to be adjusted according to your distributions layout Also, at least one version of Qt DLLs shipping with Fedora was self-inconsistent at caused random crashes at startup. Unless you have good reasons to build your own binaries, on Windows you may be better off with the pre-compiled binaries we provide. Building Subsurface on Windows ------------------------------ This is NOT RECOMMENDED. To the best of our knowledge there is one single person who regularly does this. The Subsurface team does not provide support for Windows binary build from sources...