Build QGIS with Oracle Spatial support

Here's how to build QGIS with Oracle support on Debian based systems (this means also Ubuntu).

I'm using Debian Testing which at the time of writing this article has the codename Buster.

First, you need to install the QGIS build dependencies. One way of doing that is to get the dependencies that are written in the https://github.com/qgis/QGIS/blob/master/INSTALL.

Sometimes, there's an updating lag for the dependencies written in the INSTALL document so I tend to use the apt-get build-dep command.

In order to do that, you need to configure the QGIS software repositories on your linux box if you haven't done it already. See https://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu

Depending on what version of QGIS you want to compile, add your corresponding repositories.

For QGIS 3 (master) on my box (Buster is not available yet in the QGIS repos, but Stretch works).
So I added to the /etc/apt/sources.list the following lines:

deb http://qgis.org/debian-nightly stretch main
deb-src http://qgis.org/debian-nightly stretch main

Don't forget to add the qgis.org repository public key to your apt keyring as specified in the above qgis.org link.

After you add the repositories do an sudo apt-get update to get the latest lists of packages.

Now you can install the dependencies by doing sudo apt-get build-dep qgis. For the oracle build you also need to do a sudo apt-get install qtbase5-private-dev qt5-default

Now let's install the Oracle dependencies:

mkdir -p ~/dev/oracle && cd ~/dev/oracle

In order to download the dependencies from Oracle (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) you need to register an account.
After you made your account you need to download the following files in the ~/dev/oracle directory:

http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm

http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm

http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-odbc-12.2.0.1.0-2.x86_64.rpm

http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-tools-12.2.0.1.0-1.x86_64.rpm

From what I can recall, not all of these are needed but at the time when I took the notes I wanted to do some extra stuff, you have it all.

To install the rpm files on a debian system:

sudo apt-get install alien libaio1 -y
# Create the deb files from the rpm ones:
sudo alien oracle-instantclient12.2-*
# install the deb files
sudo dpkg -i oracle-instantclient12.2-*.deb
# setup the libraries
sudo sh -c 'echo "/usr/lib/oracle/12.2/client64/lib" > /etc/ld.so.conf.d/oracle.conf'
sudo ldconfig
# check that the libraries are loaded with
sudo ldconfig -p | grep oracle

Setup the Oracle variables that many programs lool for by adding to the /etc/profile.d/oracle.sh file:

export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_INCLUDEDIR=${ORACLE_HOME}/include
export ORACLE_LIBDIR=${ORACLE_HOME}/lib

Fix SDK (.h files) finding if there is no include directory under ORACLE_HOME, and it is located over in /usr/include/oracle/, by creating a symbolic link to assist packages looking for these header files:

sudo ln -s /usr/include/oracle/12.2/client64 /usr/lib/oracle/12.2/client64/include
sudo mount --bind /usr/include/oracle/12.2/client64 /usr/lib/oracle/12.2/client64/include

See also https://help.ubuntu.com/community/Oracle Instant Client for more info.

mkdir -p ~/dev/cpp && cd ~/dev/cpp
git clone https://github.com/qgis/QGIS.git qgis
mkdir qgis/build-master && cd qgis/build-master

If you want to look at the compile options graphically you should first do a sudo apt-get install cmake-curses-gui.
Now that the ccmake command is installed you can play around with it by doing a ccmake -G Ninja .. that should first output something like this:

EMPTY CACHE

EMPTY CACHE:
Press [enter] to edit option Press [d] to delete an entry       

CMake Version 3.9.5
Press [c] to configure
Press [h] for help           Press [q] to quit without generating
Press [t] to toggle advanced mode (Currently Off)

By pressing c at least one time you can get an automatic configuration. Most of the options are automatically configured but some need to be specified.

Some options that are important (for me at least)
Config OptionConfigured option
CMAKE_BUILD_TYPEDebug
CMAKE_INSTALL_PREFIX$HOME/qgis-master
WITH_CUSTOM_WIDGETSON
WITH_QWTPOLARON
WITH_INTERNAL_QWTPOLARON
WITH_ORACLEON
OCI_INCLUDE_DIR/usr/lib/oracle/12.2/client64/include
OCI_LIBRARY/usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1

Keep in mind that some of the options appear after configuring others and pressing c again. If it looks ok to you, and you have the press g option, press it and then start the build.

I personally don't use ccmake anymore since I'm using the cmake arguments to configure my build:

cmake \
-G Ninja \
-D CMAKE_BUILD_TYPE=Debug \
-D CMAKE_INSTALL_PREFIX=$HOME/qgis-master \
-D WITH_ASTYLE=ON \
-D WITH_APIDOC=ON \
-D WITH_CUSTOM_WIDGETS=ON \
-D WITH_QWTPOLAR=ON -D WITH_INTERNAL_QWTPOLAR=ON \
-D WITH_SERVER=ON -D SERVER_SKIP_ECW=ON \
-D WITH_ORACLE=ON \
-D OCI_INCLUDE_DIR=/usr/lib/oracle/12.2/client64/include \
-D OCI_LIBRARY=/usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1 \
..

If you want to install it instead of running QGIS from the output directory you need to do:

sudo ninja install
sudo chown -R $USER:$USER $HOME/qgis-master

You need root privileges for the install if you have built WITH_CUSTOM_WIDGETS, otherwise, the installer won't have installing rights in the QT folders. The above command restores the rights in the $HOME folder to its user.

In order to run QGIS from the install dir, we create the $HOME/qgis-master/bin/start-qgis-master.sh file with the following content:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HOME}/qgis-master/lib/:${HOME}/dev/cpp/oracle-client/instantclient_12_1

${HOME}/qgis-master/bin/./qgis

Rnning sh $HOME/qgis-master/bin/start-qgis-master.sh should start QGIS with ORACLE support.W

Related Article