Project

General

Profile

Installation » History » Version 72

Tony Ciavarella, 11/30/2016 11:56 PM

1 1 Tony Ciavarella
h1. Installation
2
3 5 Tony Ciavarella
h2. Obtaining the Source Code
4 1 Tony Ciavarella
5 2 Tony Ciavarella
h3. Release Tarballs
6
7 4 Tony Ciavarella
Release source tarballs are available on the "Files":http://oss.squalllinesoftware.com/projects/disorder/files page.  This is what you want if you are looking for stability and something ready for production use.  You'll probably want to use the most recent version found on that page.
8 2 Tony Ciavarella
9
h3. SCM
10
11 72 Tony Ciavarella
The Disorder source code is hosted in a "Mercurial":https://www.mercurial-scm.org repository.  This is what you want if you are looking for the very latest bleeding edge of the code for contributing to Disorder, forking an evil fork, or whatever other reason you may have.
12 2 Tony Ciavarella
13 54 Tony Ciavarella
Read the "Mercurial Documentation":http://hgbook.red-bean.com/ if you aren't familiar with that and you want to go this route.
14 27 Tony Ciavarella
15 53 Tony Ciavarella
To clone the repository including the full history:
16 54 Tony Ciavarella
<pre>hg clone http://hg.squalllinesoftware.com/oss/disorder</pre>
17 2 Tony Ciavarella
18 1 Tony Ciavarella
h2. Prerequisites
19
20 38 Tony Ciavarella
Given the assumption that a somewhat sane build environment for C++ already exists on the build machine, the following third party things are required to build Disorder:
21 6 Tony Ciavarella
* "Boost":http://www.boost.org >= 1.49.0
22 8 Tony Ciavarella
* "Eigen":http://eigen.tuxfamily.org >= 3.0.5
23 66 Tony Ciavarella
* "Google Test/Mock":https://github.com/google/googletest >= 1.7.0
24 45 Tony Ciavarella
* C++ version of the "SEDRIS SRM":http://www.sedris.org/srm_4.4/srm_c_cpp.htm >= 4.4.0
25
** The SEDRIS SRM is optional but you will need some kind of sophisticated geospatial thing if you don't use the SEDRIS SRM and you'll have to implement your own version of disorder's geospatial Convertor interface.
26 71 Tony Ciavarella
* A "Python":http://www.python.org interpreter (needed to use the "waf":https://waf.io/ build system)
27 52 Tony Ciavarella
* A C++ compiler capable of understanding the "ISO C++ 2011 Standard":http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372
28
** "GCC":http://gcc.gnu.org >= 4.7.0
29
** "Clang++":http://clang.llvm.org >= 3.1.0
30 63 Tony Ciavarella
** Visual Studio = 2013 (version 12.x)
31
*** If you intend to use Visual Studio to build this thing on Windows, you're going to need 2013.  Visual Stupido is way behind in standards compliance.  They haven't even bothered to comply with the C99 standard yet.  Their C++11 support is not good in many areas so some things aren't as good as they could be when using disorder on Windows.
32
*** The express version may work, but using it to build an open source project may be a violation of Microsoft's silly license.
33 59 Tony Ciavarella
*** You can, of course, use gcc to build disorder on windows in a "cygwin":http://cygwin.org/ environment, but you should expect pain because SEDRIS won't build on cygwin out of the box.
34 1 Tony Ciavarella
35 13 Tony Ciavarella
Build and install these things in accordance with the instructions for your operating system provided by each vendor.  Some hints for certain platforms follow.
36 1 Tony Ciavarella
37 8 Tony Ciavarella
h3. Debian Linux and Derivatives
38
39 39 Tony Ciavarella
h4. Debian 6.x (Squeeze)
40
41 41 Tony Ciavarella
The binary packages for "Boost":http://www.boost.org and "Eigen":http://eigen.tuxfamily.org in the package system are way too old.  You'll have to download the source for them and build "Boost":http://www.boost.org yourself.
42 39 Tony Ciavarella
43
h4. Debian >= 7.x (Wheezy)
44 40 Tony Ciavarella
45 39 Tony Ciavarella
All the dependencies are available via the package system.  To install the Boost and Eigen build dependencies on Debian and maybe other derivatives:
46 8 Tony Ciavarella
<pre>sudo apt-get install libboost-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev libeigen3-dev</pre>
47 1 Tony Ciavarella
48
If you don't already have python, this will get the required bits of that:
49
<pre>sudo apt-get install python</pre>
50 13 Tony Ciavarella
51 33 Tony Ciavarella
h3. Sabayon Linux
52
53 42 Tony Ciavarella
To install boost via the entropy package system:
54 33 Tony Ciavarella
<pre>sudo equo install boost</pre>
55
56 37 Tony Ciavarella
As of 2/22/2013, the Eigen verison in entropy is a bit outdated (3.0.6).  You can use it, but you probably should download the latest version from "Eigen":http://eigen.tuxfamily.org which doesn't require any compilation.  Just extract the content of the archive somewhere and remember to tell Disorder where to find it with --eigen-root=<put actual path to eigen root here> during the configuration step.
57 33 Tony Ciavarella
58 35 Tony Ciavarella
If you don't already have python, this will get the required bits of that: <pre>sudo equo install python</pre>
59 34 Tony Ciavarella
60 13 Tony Ciavarella
h2. Configuration
61
62
If everything is setup properly, this step will be a breeze, but it is important to resolve any errors produced by the configuration step prior to attempting to compile Disorder.
63
64 46 Tony Ciavarella
h3. General
65
66
The basic idea of configuration is to allow disorder to learn enough about your build platform to be able to compile.  Disorder uses the 
67 47 Tony Ciavarella
"waf":https://code.google.com/p/waf/ build system to configure and compile. In general terms, you want to invoke waf with the configure target like this:
68 46 Tony Ciavarella
<pre>./waf configure</pre>
69
70 65 Tony Ciavarella
On linux-like systems, waf will attempt to find "Boost":http://www.boost.org, "Eigen":http://eigen.tuxfamily.org, and "GLUT":http://www.opengl.org/resources/libraries/glut/ but you can override this behavior in the event of non-standard installation location or fanciful whimsy.  You will always have to tell it where to find the SEDRIS SRM however.  The options for configuring disorder's dependencies can be found by issuing the following command:
71 46 Tony Ciavarella
<pre>./waf --help</pre>
72
73
Said options are thusly enumerated for your convenience:
74
75
h4. Boost
76 49 Tony Ciavarella
77 46 Tony Ciavarella
|_. Option |_. Argument |_. Description |
78
| --boost-includes | path to the Boost includes root (eg. /opt/boost_1_49_0) | Tells disorder where to find the include files for the Boost libraries. |
79 48 Tony Ciavarella
| --boost-libs | path to the directory where the compiled Boost libraries are (eg. /opt/boost_1_49_0/stage/lib) | Tells disorder where to find Boost's compiled library files. |
80 46 Tony Ciavarella
| --boost-mt | none | Links disorder against the multi-threaded versions of the Boost libraries. |
81
| --boost-abi | desired tags from dgsyp | Select Boost libraries with tags.  See Boost documentation ("Unixes":http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming, "windows":http://www.boost.org/doc/libs/1_53_0/more/getting_started/windows.html#library-naming) for more information. |
82
| --boost-toolset | desired toolset (eg. msvc, vc90, or gcc) | Overrides the automatic toolset detection as specified. |
83
84
h4. Eigen
85 49 Tony Ciavarella
86 46 Tony Ciavarella
|_. Option |_. Argument |_. Description |
87 50 Tony Ciavarella
| --eigen-root | path to the root of the Eigen library (eg. /opt/eigen-3.1.2) | Tells disorder where to find the Eigen library. |
88 46 Tony Ciavarella
89
h4. SEDRIS SRM
90 49 Tony Ciavarella
91 46 Tony Ciavarella
|_. Option |_. Argument |_. Description |
92 48 Tony Ciavarella
| --sedris-srm-root | path to the root of the SEDRIS SRM tree (eg. /opt/srm) | Tells disorder where to find the SEDRIS SRM.  This argument is *required*. |
93 46 Tony Ciavarella
| --sedris-srm-static | none | Links disorder against the static SEDRIS SRM library instead of the default dynamic one. |
94
| --sedris-srm-build-variant | build variant directory (eg. linux-3.5.0-sabayon-i386-gnu-/OPT) to find the compiled output files | Overrides the default selection of the first build variant found. |
95
96 69 Tony Ciavarella
h4. Google Test/Mock
97
98
|_. Option |_. Argument |_. Description |
99
| --gtest-src-root | path to the root of the Google Test source tree (eg. /usr/src/gtest) | Tells disorder where to find the Google Test source tree. |
100
| --gmock-src-root | path to the root of the Google Mock source tree (eg. /usr/src/gmock) | Tells disorder where to find the Google Mock source tree. |
101
102 64 Tony Ciavarella
h4. GLUT
103
104
|_. Option |_. Argument |_. Description |
105
| --glut-root | path to the root of the GLUT tree (eg. /opt/freeglut) | Tells disorder where to find GLUT. |
106
| --glut-lib | root name of the GLUT library | Tells disorder which GLUT library to link against.  For example, specify 'glut' for libglut.so on linux or freeglut for freeglut.lib on windows. |
107 69 Tony Ciavarella
108
h4. 0mq
109
110
|_. Option |_. Argument |_. Description |
111
| --zmq-root | path to the 0MQ root (eg. /opt/zeromq-4.0.4) | Tells disorder where to find 0MQ. |
112 64 Tony Ciavarella
113 15 Tony Ciavarella
h3. Linux
114 13 Tony Ciavarella
115
From inside the root of the Disorder tree do this in your favorite terminal emulator:
116 68 Tony Ciavarella
<pre>./waf configure --sedris-srm-root=<put the path to the SEDRIS SRM root here> --eigen-root=/opt/eigen</pre>
117
For example, if your SEDRIS SRM is in /opt/sedris/srm and your Eigen is in /opt/eigen:
118
<pre>./waf configure --sedris-srm-root=/opt/sedris/srm --eigen-root=/opt/eigen</pre>
119 1 Tony Ciavarella
120
That command will take several seconds and print a bunch of hopefully green stuff.  The output should end up looking something like this:
121
<pre>
122 68 Tony Ciavarella
Setting top to                           : /opt/disorder
123
Setting out to                           : /opt/disorder/bin
124
Checking for 'g++' (C++ compiler)        : /usr/bin/g++
125
Checking for program 'doxygen'           : not found
126
Checking for program 'tar'               : /bin/tar
127
Checking boost includes                  : 1.58.0
128
Checking boost libs                      : ok
129
Checking for boost linkage               : ok
130
Checking for header boost/asio.hpp       : yes
131
Checking for header boost/config.hpp     : yes
132
Checking for header boost/date_time/c_time.hpp : yes
133
Checking for header boost/detail/endian.hpp    : yes
134
Checking for header boost/filesystem/operations.hpp : yes
135
Checking for header boost/functional/factory.hpp    : yes
136
Checking for header boost/preprocessor.hpp          : yes
137
Checking for header boost/ptr_container/ptr_vector.hpp : yes
138
Checking for C++11 compiler support                    : yes
139
Checking for Eigen library                             : /opt/eigen
140
Checking for header Eigen/Dense                        : yes
141
Checking for SEDRIS SRM                                : /opt/srm
142
Checking for SEDRIS SRM include directory              : /opt/srm/src/include
143
Checking for SEDRIS SRM library directory              : /opt/srm/lib/linux-3.16.0-4-amd64-i386-gnu-/OPT
144
SEDRIS SRM library                                     : /opt/srm/lib/linux-3.16.0-4-amd64-i386-gnu-/OPT/libsrm.so
145
SEDRIS SRM library mode                                : dynamic
146
Checking for header srf_all.h                          : yes
147
Checking for library pthread                           : yes
148
Checking for header gtest/gtest.h                      : yes
149
gtest source directory                                 : /usr/src/gtest
150
gtest all source file                                  : /usr/src/gtest/src/gtest-all.cc
151
Checking for header gmock/gmock.h                      : yes
152
gmock source directory                                 : /usr/src/gmock
153
gmock all source file                                  : /usr/src/gmock/src/gmock-all.cc
154
gmock main source file                                 : /usr/src/gmock/src/gmock_main.cc
155
Checking for library GL                                : yes
156
Checking for library glut                              : yes
157
Checking GLUT sanity                                   : yes
158
Checking for 0MQ                                       : yes
159
Checking 0MQ sanity                                    : yes
160
Checking for sane chrono duration modulo               : yes
161
Checking for defaulted move functions                  : yes
162
Checking for array initializer lists                   : yes
163
Checking for sane std::chrono                          : yes
164
'configure' finished successfully (5.068s)
165 13 Tony Ciavarella
</pre>
166
167 18 Tony Ciavarella
If you get an error instead of that last line saying that 'configure' finished successfully, you must fix whatever is making it unhappy and try again.
168 13 Tony Ciavarella
169 19 Tony Ciavarella
h4. Clang++
170 16 Tony Ciavarella
171 32 Tony Ciavarella
To use the "Clang":http://clang.llvm.org/ C++ compiler instead of "GCC":http://gcc.gnu.org/, assuming clang++ is installed on the build system:
172 16 Tony Ciavarella
<pre>CXX=<put the path to clang++ here> ./waf configure --sedris-srm-root=<put the path to the SEDRIS SRM root here></pre>
173
174 19 Tony Ciavarella
For example:
175 16 Tony Ciavarella
<pre>CXX=/usr/bin/clang++ ./waf configure --sedris-srm-root=/opt/sedris/srm</pre>
176
177 13 Tony Ciavarella
h3. Windows
178
179
On windows, your $PATH environment variable needs to include the path to the Python interpreter.
180
181 30 Tony Ciavarella
The easiest way to configure Disorder on Windows is to use a modified version of the provided batch file to tell Disorder where your prerequisites live.  Copy the template from @tools/windows/configure.bat@ to the root of the Disorder tree.
182 1 Tony Ciavarella
183 30 Tony Ciavarella
This file contains some variables near the middle that must be set according to your system configuration.  An example is provided in the template for guidance.
184
185
Once you are finished editing configure.bat, it's time to execute it.  From the command line:
186
<pre>configure.bat</pre>
187
188
If everything is successful, you should get something that looks like this:
189
<pre>
190
C:\oss\disorder>python waf configure --boost-includes=c:\oss\boost_1_48_0 --boost-libs=c:\oss\boost_1_48_0\stage\lib --boost-mt --boost-static --eigen-root=c:\oss\eigen-3.0.4 --sedris-srm-root=c:\oss\sedris\srm --sedris-srm-static
191
Setting top to                           : C:\oss\disorder
192
Setting out to                           : C:\oss\disorder\bin
193
Checking for 'msvc' (c++ compiler)       : c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\amd64\CL.exe
194
Checking for program doxygen             : not found
195
Checking for Eigen library               : c:\oss\eigen-3.0.4
196
Checking for header Eigen/Dense          : yes
197
Checking for SEDRIS SRM                  : c:\oss\sedris\srm
198
Checking for SEDRIS SRM include directory : c:\oss\sedris\srm\src\include
199
Checking for SEDRIS SRM library directory : c:\oss\sedris\srm\lib\[Debug/Release]
200
Checking for header srf_all.h             : yes
201
Configuring boost libraries               : debug variant
202
Checking boost ABI tag                    : gd
203
Checking boost includes                   : 1_48
204
Checking boost libs                       : ok
205
Checking for boost linkage                : ok
206
Checking for header boost/asio.hpp        : yes
207
Checking for header boost/bind.hpp        : yes
208
Checking for header boost/date_time.hpp   : yes
209
Checking for header boost/detail/endian.hpp : yes
210
Checking for header boost/format.hpp        : yes
211
Checking for header boost/function.hpp      : yes
212
Checking for header boost/functional/factory.hpp : yes
213
Checking for header boost/ptr_container/ptr_vector.hpp : yes
214
Checking for header boost/scoped_ptr.hpp               : yes
215
Checking for header boost/static_assert.hpp            : yes
216
Checking for header boost/thread.hpp                   : yes
217
Configuring boost libraries                            : optimized variant
218
Checking boost ABI tag                                 :
219
Checking boost includes                                : 1_48
220
Checking boost libs                                    : ok
221
Checking for boost linkage                             : ok
222
Checking for header boost/asio.hpp                     : yes
223
Checking for header boost/bind.hpp                     : yes
224
Checking for header boost/date_time.hpp                : yes
225
Checking for header boost/detail/endian.hpp            : yes
226
Checking for header boost/format.hpp                   : yes
227
Checking for header boost/function.hpp                 : yes
228
Checking for header boost/functional/factory.hpp       : yes
229
Checking for header boost/ptr_container/ptr_vector.hpp : yes
230
Checking for header boost/scoped_ptr.hpp               : yes
231
Checking for header boost/static_assert.hpp            : yes
232
Checking for header boost/thread.hpp                   : yes
233
'configure' finished successfully (31.262s)
234
</pre>
235
236
If you don't see that last line that says @'configure' finished successfully@, then something is screwed up and it needs to be fixed.  Fix it and try again.
237 10 Tony Ciavarella
238 1 Tony Ciavarella
h2. Compiling
239
240 20 Tony Ciavarella
The basic strategy for building Disorder is to invoke the waf build system with the desired build variant.
241 1 Tony Ciavarella
242 20 Tony Ciavarella
Disorder has two build variants:
243 23 Tony Ciavarella
* debug: produces a library that contains debugging symbols and disables most compiler optimizations
244
* optimized: produces a library stripped of debugging symbols and enables compiler optimizations for performance
245 1 Tony Ciavarella
246 23 Tony Ciavarella
It might be reasonable to use the @debug@ variant in a development environment and the @optimized@ variant in a production environment.
247 1 Tony Ciavarella
248 23 Tony Ciavarella
The @debug@ variant is produced by the @build_debug@ build target and the @optimized@ variant is produced by the @build_optimized@ build target.
249
250 26 Tony Ciavarella
The results of the build are put in the @bin@ subdirectory under the name of the variant.  
251 23 Tony Ciavarella
252 26 Tony Ciavarella
Both variants can coexist peacefully in the tree at the same time.
253 23 Tony Ciavarella
254 20 Tony Ciavarella
h3. Linux
255 1 Tony Ciavarella
256 23 Tony Ciavarella
On Linux, to build the Disorder @debug@ variant:
257 20 Tony Ciavarella
<pre>./waf build_debug</pre>
258
259
h3. Windows
260
261 23 Tony Ciavarella
On Windows, the waf script is invoked indirectly.  To build the @optimized@ variant:
262
<pre>python.exe waf build_optimized</pre>
263 12 Tony Ciavarella
264 43 Tony Ciavarella
h2. Ensuring Build Correctness
265
266 44 Tony Ciavarella
Due to the complexity of varied compilers and build configurations, it is imperative that you preform the necessary testing on your build to ensure that it performs correctly.
267 43 Tony Ciavarella
268 67 Tony Ciavarella
Don't fret.  It's easy and is well worth the time it takes for the peace of mind you gain.  Just tell waf to run_unit_test_<variant> like this for the @optimized@ variant:
269
<pre>./waf run_unit_test_optimized</pre>
270 43 Tony Ciavarella
271 1 Tony Ciavarella
That should result in something like this:
272
<pre>
273 67 Tony Ciavarella
...
274
[----------] 5 tests from UtilityTimestampTest
275
[ RUN      ] UtilityTimestampTest.DefaultMode
276
[       OK ] UtilityTimestampTest.DefaultMode (0 ms)
277
[ RUN      ] UtilityTimestampTest.RelativeInitial
278
[       OK ] UtilityTimestampTest.RelativeInitial (0 ms)
279
[ RUN      ] UtilityTimestampTest.RelativeDelta
280
[       OK ] UtilityTimestampTest.RelativeDelta (0 ms)
281
[ RUN      ] UtilityTimestampTest.AbsoluteNearSimulationClock
282
[       OK ] UtilityTimestampTest.AbsoluteNearSimulationClock (0 ms)
283
[ RUN      ] UtilityTimestampTest.TimestampRejection
284
[       OK ] UtilityTimestampTest.TimestampRejection (0 ms)
285
[----------] 5 tests from UtilityTimestampTest (0 ms total)
286
287
[----------] Global test environment tear-down
288
[==========] 164 tests from 18 test cases ran. (1806 ms total)
289
[  PASSED  ] 164 tests.
290
*PASS*: All tests passed!  This silly thing actually works properly.  Hooray!
291
Waf: Leaving directory `/home/c/projects/sls/oss/disorder/bin/debug'
292
'run_unit_test_debug' finished successfully (1.821s)
293 43 Tony Ciavarella
</pre>
294
295
If you see
296
<pre>Something failed!  That's not good.  This build cannot be trusted until the damn thing is fixed.</pre>
297
in red at the bottom instead of a green "finished successfully" message, you need to file a bug report and/or fix it yourself and send in a patch.  Under no circumstances should you attempt to use a build that fails the test suite.  A test failure means disorder isn't working as expected for some reason and that reason needs to be resolved for your simulation to function properly.
298
299 1 Tony Ciavarella
h2. Building Against the Disorder Library
300 28 Tony Ciavarella
301
h3. Compiling
302
303
In order to compile your goodness against the Disorder library, you'll need to have the header files from the @src@ directory in the Disorder tree and Eigen's include directory in your compiler's include path.  You do not need anything from SEDRIS SRM in your include path.
304
305
h3. Linking
306
307 29 Tony Ciavarella
Just link your program against Disorder's static library that can be found in the @bin/<build variant>@ directory.