OGDF for OS X (El Capitan)

OGDF ist ein freiverfügbares Graph-Zeichen-Programmiergerüst. Auf dieser Seite wird kurz die Konfiguration, die für das OS X notwendig ist, um OGDF zu bauen, gezeigt.

Schritte:

  1. Herunterladen von OGDF und entpacken in das Installationsverzeichnis
  2. Installation von gcc 4.9 und Festlegung als Standard-gcc-Compiler
  3. Konfigurieren und bauen von OGDF

Standard-gcc-Compiler

Mithilfe von MacPorts kann der Compiler wie folgt installiert werden.

$ sudo port selfupdate 
$ sudo port upgrade outdated
$ sudo port install gcc49
$ sudo port select --set gcc mp-gcc49
$ gcc -v
  Using built-in specs.
  COLLECT_GCC=gcc
  COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin15/4.9.3/lto-wrapper
  Target: x86_64-apple-darwin15
  Configured with: /opt/local/var/macports/build/_opt_mports_dports_lang_gcc49/gcc49/work/gcc-4.9.3/configure --prefix=/opt/local --build=x86_64-apple-darwin15 --enable-languages=c,c++,objc,obj-c++,lto,fortran,java --libdir=/opt/local/lib/gcc49 --includedir=/opt/local/include/gcc49 --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/gcc-4.9 --with-local-prefix=/opt/local --with-system-zlib --disable-nls --program-suffix=-mp-4.9 --with-gxx-include-dir=/opt/local/include/gcc49/c++/ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --with-isl=/opt/local --disable-isl-version-check --with-cloog=/opt/local --disable-cloog-version-check --enable-stage1-checking --disable-multilib --enable-lto --enable-libstdcxx-time --with-as=/opt/local/bin/as --with-ld=/opt/local/bin/ld --with-ar=/opt/local/bin/ar --with-bugurl=https://trac.macports.org/newticket --with-pkgversion='MacPorts gcc49 4.9.3_0' --with-build-config=bootstrap-debug
  Thread model: posix
  gcc version 4.9.3 (MacPorts gcc49 4.9.3_0) 
$ sudo port select --list gcc
  Available versions for gcc:
          mp-gcc49 (active)
          mp-gcc5
          none

Konfiguration von OGDF

Im Hauptverzeichnis von OGDF befindet sich eine makeMakefile.config Datei, die aus vier Teilen besteht. Für die Konfiguration sind im Wesentlichen nur der [GENERAL] und [COIN] interessant. Erster legt fest mit welchem Compiler und welchen Compiler Optionen OGDF gebaut wird.

Dabei ist es empfehlenswert den gcc 4.9 zu verwenden, der unter /opt/local/bin/g++-mp-4.9 zufinden ist. Die Option -stdlib=… ist unter dem gcc 4.9 nicht verfügbar. Die Standardbibliothek von gcc 4.9 ist libstdc++.

Compiler: g++-mp-5, g++-mp-4.9
nicht compilierbar mit Apple LLVM version 7.3.0 (clang-703.0.31)

[GENERAL]
#**********************************************************

compilerCommand = /opt/local/bin/g++-mp-4.9
# MAC USERS: if building fails, try the following line:
#compilerCommand = g++ -stdlib=libstdc++

...

#* command used to create a shared library
sharedlibCommand = /opt/local/bin/g++-mp-4.9

...

OGDF ist nicht konfigurierbar mit clang und libc++. Dabei wird vom makeMakefile.sh folgender Fehler geworfen:

In file included from test/fileformats_test.cpp:44:
test/gtest/gtest.h:1561:13: fatal error: 'tr1/tuple' file not found
#   include <tr1/tuple>  // NOLINT
            ^
1 error generated.
Traceback (most recent call last):
  File "makeMakefile.py", line 360, in <module>
  objsTest = Walk('./test')
File "makeMakefile.py", line 277, in Walk
  targetAndDepend = subprocess.check_output(' '.join([compilerCommand, compilerFlags, ogdfFlags, '-MM', fullname]), shell=True)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 574, in check_output
  raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'clang  -I./include -I/Library/gurobi652/mac64/include  -MM test/fileformats_test.cpp' returned non-zero exit status 1

Weiterhin besteht die Möglichkeit, den externen Solver zu ändern. Wir verwenden beispielsweise Gurobi. Unter OS X ist das Standard-Installationsverzeichnisse /Library/gurobi<VERSION>/<OS>/.

[COIN]
#**********************************************************
...

#==========================================================
#* Select your solvers for OGDF and ABACUS
#*
#* internal solvers (always available):
#*   CLP:   Coin's CLP solver
#*   SYM:   Coin's Symphony
#*
#* external solvers (must be installed)
#*   CPX:   IBM ILOG CPLEX
#*   GRB:   Gurobi Optimizer
#*

#* Default solver (one of CLP, SYM, CPX, GRB)
defaultSolver = GRB

#* External solvers (separated by semicolon)
externalSolvers = GRB

#* Additional include directories (separated by semicolon) for external solvers
solverIncludes = /Library/gurobi<VERSION>/<OS>/include

Entweder man verwendet Gurobi mit libc++ als Standardbibliothek

#* Additional linker options to use an external default solver. Only needed to link test suite.
solverLDFlags = -L/Library/gurobi<VERSION>/<OS>/lib -lgurobi_c++ -lgurobi<VERSION>

oder Gurobi mit libstdc++ Standardbibliothek, welches seit Gurobi 6.5.0 existiert

solverLDFlags = -L/Library/gurobi<VERSION>/<OS>/lib -lgurobi_stdc++ -lgurobi<VERSION>

Am Ende muss dann noch das makeMakefile.sh Skript ausgeführt werden.

$ ./makeMakefile.sh

Bauen von OGDF

$ make

OGDF kann nicht mit clang und libstdc++ gebaut werden, da man ansonsten Linkerfehler bekommt. Dabei wird von make folgender Fehler geworfen (Compiler Ausgabe):

clang -stdlib=libstdc++ -o test/test-release _release/test/fileformats_test.o _release/test/generators_test.o _release/test/gtest/gtest-all.o _release/test/main.o _release/test/regression-tests/reg-energy-based.o _release/test/regression-tests/reg-lca.o _release/test/regression-tests/reg-main.o _release/test/regression-tests/reg-planar-layout.o _release/test/regression-tests/reg-planarity-test.o _release/test/regression-tests/reg-planarization-layout.o _release/test/regression-tests/reg-sugiyama.o _release/libCOIN.a _release/libOGDF.a -pthread -L_release -lOGDF -lCOIN -L/Library/gurobi652/mac64/lib -lgurobi_stdc++ -lgurobi65
...
Undefined symbols for architecture x86_64:
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [test/test-release] Error 1