[:en]We updated MegaMol to use cmake to build on Linux OS. This greatly improved the build process on Linux. But this also makes some more uncommon scenarios difficult to realize. For example, cmake usually automatically detects required dependencies. But, in some scenarios you need to override this magic.
In this article I show how to compile a second MegaMol on a system on which a MegaMol already has been compiled and installed. This is useful when working with experimental versions.
VISlib and visglut
First off you build the visglut the usual way. I assume here, that the installed MegaMol uses a different visglut as the one you want to build now:
mkdir megamol_x2
cd megamol_x2
svn co https://svn.vis.uni-stuttgart.de/utilities/visglut/tags/forMegaMol11 visglut
cd visglut/build_linux_make
make
If everything worked you can find the following files:
in megamol_x1/visglut/include:
GL/freeglut_ext.h
GL/freeglut.h
GL/freeglut_std.h
GL/glut.h
visglut.h
visglutversion.h
and in megamol_x2/visglut/lib:
libvisglut64.a
libvisglut64d.a
If so, let’s continue with the VISlib:
cd megamol_x2
svn co https://svn.vis.uni-stuttgart.de/utilities/vislib/tags/release_2_0 vislib
cd vislib
Now, there is the first action which is different from the default build process. As usual we will use the script cmake_build.sh. This script, however, per default registers the build directories in the cmake package registry. This enables cmake to find this package in its build trees. In this scenario, however, we do not want this special build to be automatically found, because we do not want to get in the way of our system-installed MegaMol. We thus deactivate the package registry.
This command configures and builds the VISlib, both for debug and release version:
./cmake_build.sh -dcmn
As always, if you encounter build problems due to the multi-job make, reduce the number of compile jobs:
./cmake_build.she -dcmnj 1
Note that I do not specify an install directory. I do not plan to install this special MegaMol. I just want to build, for example for a bug hunt.
MegaMolCore
It’s now time for the core.
cd megamol_x2
svn co https://svn.vis.uni-stuttgart.de/projects/megamol/core/branches/v1.1rc core
cd core
We first test the configuration by only configuring release and not building anything:
./cmake_build.sh -cv ../vislib -C -DCMAKE_DISABLE_FIND_PACKAGE_MPI=TRUE
Note that I also disabled MPI-Support here. The system I am building on has MPI installed, but I don’t want this MegaMol to use it.
The output should contain this line:
-- Found vislib: /home/sgrottel/megamol20150726/vislib/build.release/libvislib.a
This points to the right vislib, the one we specified. So all is well. We can build MegaMol, again without registering it’s build trees in the cmake package repository:
./cmake_build.sh -dcmnv ../vislib -C -DCMAKE_DISABLE_FIND_PACKAGE_MPI=TRUE
When all worked you got yourself the binaries:
megamol_x2/core/build.debug/libMegaMolCored.so
megamol_x2/core/build.release/libMegaMolCore.so
MegaMolConsole
Get yourself a working copy of the console:
cd megamol_x2
svn co https://svn.vis.uni-stuttgart.de/projects/megamol/frontends/console/branches/v1.1rc console
cd console
Again, we test if everything works by only configuring release and not building:
./cmake_build.sh -c -f ../core
The Console does not register its build tree per default, since no other project depends on the console. So we are fine here.
The output should contain these lines:
-- Looking for MegaMolCore with hints: ../core;../core/build.release;../core/share/cmake/MegaMolCore
-- Found MegaMolCore: /home/sgrottel/megamol20150726/core/build.release/libMegaMolCore.so
-- MegaMolCore suggests vislib at: /home/sgrottel/megamol20150726/vislib/build.release
-- MegaMolCore suggests install prefix: /usr/local
-- Using MegaMolCore install prefix
-- Found vislib: /home/sgrottel/megamol20150726/vislib/build.release/libvislib.a
-- Found AntTweakBar: /home/sgrottel/AntTweakBar/lib/libAntTweakBar.so
-- Found visglut: /home/sgrottel/megamol20150726/visglut/lib/libvisglut64.a
If the directories for other libraries are wrong, for example the AntTweakBar or the visglut use the cmake-typical DIR variable to give a search hint. Remember, relative paths might be confusion. Better use absolute paths. I don’t:
./cmake_build.sh -c -f ../core -C -Dvisglut_DIR=~/megamol20150709/visglut -C -DAntTweakBar_DIR=../../AntTweakBar
But in my case the cmake-magic worked fine in the first place. So, I configure both build types again:
./cmake_build.sh -dc -f ../core
Double check the output. Make sure the core, the vislib and the visglut are found in all the right places. If they are, built it:
./cmake_build.sh -dm
At this point you can quickly test your MegaMol. First open the megamol.cfg configuration file in a text editor and adjust the paths in there to yours. Then run MegaMol:
cd build.release
./MegaMolCon
If this seems ok, and if you have a local graphics card you can run the demo renderer:
./MegaMolCon -i demospheres s
Some MegaMol Plugin
Finally we need a plugin. I go for the mmstd_moldyn:
cd megamol_x2
svn co https://svn.vis.uni-stuttgart.de/projects/megamol/plugins/mmstd_moldyn/branches/v1.1rc mmstd_moldyn
cd mmstd_moldyn
The process is now exactly the same as with the console:
./cmake_build.sh -dcf ../core
The double check the directories for the core and the VISlib. If they are good, build the plugin:
./cmake_build.sh -dm
To test this plugin we go back to the console, and adjust the config file to load the plugin:
cd megamol_x2/console/build.release
Include the following lines in the config file. Obviously adjust the paths to what you need:
<plugin path="/home/dude/megamol_x2/mmstd_moldyn/build.release" name="mmstd_moldyn.mmplg" action="include" />
<shaderdir path="/home/dude/megamol_x2/mmstd_moldyn/Shaders" />
If you now run MegaMol it will try to load your plugin and will report it. The output console should contain something like:
200|Plugin mmstd_moldyn loaded: 11 Modules, 0 Calls
200|Plugin "mmstd_moldyn" (/home/sgrottel/megamol20150726/mmstd_moldyn/build.release/mmstd_moldyn.mmplg) loaded: 11 Modules, 0 Calls registered
And that’s it.[:]