Project

General

Profile

Installation » History » Version 55

Tony Ciavarella, 06/05/2013 06:09 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 55 Tony Ciavarella
The Disorder source code is hosted in a "Mercurial":http://mercurial.selenic.com 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 45 Tony Ciavarella
* C++ version of the "SEDRIS SRM":http://www.sedris.org/srm_4.4/srm_c_cpp.htm >= 4.4.0
24
** 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.
25 1 Tony Ciavarella
* A "Python":http://www.python.org interpreter (needed to use the "waf":https://code.google.com/p/waf/ build system)
26 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
27
** "GCC":http://gcc.gnu.org >= 4.7.0
28
** "Clang++":http://clang.llvm.org >= 3.1.0
29
** Visual Studio >= 2012
30
*** If you intend to use Visual Studio to build this thing on Windows, you'll need Visual Studio 2012 or later.  The Express version may work, but using it to build an open source project may be a violation of Microsoft's silly license.  You can, of course, use gcc or clang to build it on windows in a "cygwin":http://cygwin.org/ environment.
31 1 Tony Ciavarella
32 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.
33 1 Tony Ciavarella
34 8 Tony Ciavarella
h3. Debian Linux and Derivatives
35
36 39 Tony Ciavarella
h4. Debian 6.x (Squeeze)
37
38 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.
39 39 Tony Ciavarella
40
h4. Debian >= 7.x (Wheezy)
41 40 Tony Ciavarella
42 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:
43 8 Tony Ciavarella
<pre>sudo apt-get install libboost-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev libeigen3-dev</pre>
44 1 Tony Ciavarella
45
If you don't already have python, this will get the required bits of that:
46
<pre>sudo apt-get install python</pre>
47 13 Tony Ciavarella
48 33 Tony Ciavarella
h3. Sabayon Linux
49
50 42 Tony Ciavarella
To install boost via the entropy package system:
51 33 Tony Ciavarella
<pre>sudo equo install boost</pre>
52
53 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.
54 33 Tony Ciavarella
55 35 Tony Ciavarella
If you don't already have python, this will get the required bits of that: <pre>sudo equo install python</pre>
56 34 Tony Ciavarella
57 13 Tony Ciavarella
h2. Configuration
58
59
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.
60
61 46 Tony Ciavarella
h3. General
62
63
The basic idea of configuration is to allow disorder to learn enough about your build platform to be able to compile.  Disorder uses the 
64 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:
65 46 Tony Ciavarella
<pre>./waf configure</pre>
66
67
On linux-like systems, waf will attempt to find "Boost":http://www.boost.org and "Eigen":http://eigen.tuxfamily.org 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:
68
<pre>./waf --help</pre>
69
70
Said options are thusly enumerated for your convenience:
71
72
h4. Boost
73 49 Tony Ciavarella
74 46 Tony Ciavarella
|_. Option |_. Argument |_. Description |
75
| --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. |
76 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. |
77 46 Tony Ciavarella
| --boost-static | none | Links disorder against static Boost libraries instead of the default shared library linkage. |
78
| --boost-mt | none | Links disorder against the multi-threaded versions of the Boost libraries. |
79
| --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. |
80
| --boost-toolset | desired toolset (eg. msvc, vc90, or gcc) | Overrides the automatic toolset detection as specified. |
81
82
h4. Eigen
83 49 Tony Ciavarella
84 46 Tony Ciavarella
|_. Option |_. Argument |_. Description |
85 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. |
86 46 Tony Ciavarella
87
h4. SEDRIS SRM
88 49 Tony Ciavarella
89 46 Tony Ciavarella
|_. Option |_. Argument |_. Description |
90 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*. |
91 46 Tony Ciavarella
| --sedris-srm-static | none | Links disorder against the static SEDRIS SRM library instead of the default dynamic one. |
92
| --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. |
93
94 15 Tony Ciavarella
h3. Linux
95 13 Tony Ciavarella
96
From inside the root of the Disorder tree do this in your favorite terminal emulator:
97
<pre>./waf configure --sedris-srm-root=<put the path to the SEDRIS SRM root here></pre>
98
For example, if your SEDRIS SRM is in /opt/sedris/srm:
99
<pre>./waf configure --sedris-srm-root=/opt/sedris/srm</pre>
100
101
That command will take several seconds and print a bunch of hopefully green stuff.  The output should end up looking something like this:
102
<pre>
103
Setting top to                           : /opt/disorder 
104
Setting out to                           : /opt/disorder/bin 
105
Checking for 'g++' (c++ compiler)        : /usr/bin/g++ 
106
Checking for program doxygen             : /usr/bin/doxygen 
107
Checking for program tar                 : /bin/tar 
108
Checking boost ABI tag                   :  
109
Checking boost includes                  : 1_49 
110
Checking boost libs                      : ok 
111
Checking for boost linkage               : ok 
112
Checking for header boost/asio.hpp       : yes 
113
Checking for header boost/bind.hpp       : yes 
114
Checking for header boost/date_time.hpp  : yes 
115
Checking for header boost/detail/endian.hpp : yes 
116
Checking for header boost/format.hpp        : yes 
117
Checking for header boost/function.hpp      : yes 
118
Checking for header boost/functional/factory.hpp : yes 
119
Checking for header boost/ptr_container/ptr_vector.hpp : yes 
120
Checking for header boost/scoped_ptr.hpp               : yes 
121
Checking for header boost/static_assert.hpp            : yes 
122
Checking for header boost/thread.hpp                   : yes 
123
Checking for program pkg-config                        : /usr/bin/pkg-config 
124
Checking for 'eigen3'                                  : yes 
125
Checking for header Eigen/Dense                        : yes 
126
Checking for SEDRIS SRM                                : /opt/sedris/srm 
127
Checking for SEDRIS SRM include directory              : /opt/sedris/srm/src/include 
128
Checking for SEDRIS SRM library directory              : /opt/sedris/srm/lib/linux-3.1.0-1-amd64-i386-gnu-/OPT 
129
SEDRIS SRM library                                     : /opt/sedris/srm/lib/linux-3.1.0-1-amd64-i386-gnu-/OPT/libsrm.so 
130
Checking for header srf_all.h                          : yes 
131
'configure' finished successfully (25.518s)
132
</pre>
133
134 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.
135 13 Tony Ciavarella
136 19 Tony Ciavarella
h4. Clang++
137 16 Tony Ciavarella
138 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:
139 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>
140
141 19 Tony Ciavarella
For example:
142 16 Tony Ciavarella
<pre>CXX=/usr/bin/clang++ ./waf configure --sedris-srm-root=/opt/sedris/srm</pre>
143
144 13 Tony Ciavarella
h3. Windows
145
146
On windows, your $PATH environment variable needs to include the path to the Python interpreter.
147
148 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.
149 1 Tony Ciavarella
150 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.
151
152
Once you are finished editing configure.bat, it's time to execute it.  From the command line:
153
<pre>configure.bat</pre>
154
155
If everything is successful, you should get something that looks like this:
156
<pre>
157
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
158
Setting top to                           : C:\oss\disorder
159
Setting out to                           : C:\oss\disorder\bin
160
Checking for 'msvc' (c++ compiler)       : c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\amd64\CL.exe
161
Checking for program doxygen             : not found
162
Checking for Eigen library               : c:\oss\eigen-3.0.4
163
Checking for header Eigen/Dense          : yes
164
Checking for SEDRIS SRM                  : c:\oss\sedris\srm
165
Checking for SEDRIS SRM include directory : c:\oss\sedris\srm\src\include
166
Checking for SEDRIS SRM library directory : c:\oss\sedris\srm\lib\[Debug/Release]
167
Checking for header srf_all.h             : yes
168
Configuring boost libraries               : debug variant
169
Checking boost ABI tag                    : gd
170
Checking boost includes                   : 1_48
171
Checking boost libs                       : ok
172
Checking for boost linkage                : ok
173
Checking for header boost/asio.hpp        : yes
174
Checking for header boost/bind.hpp        : yes
175
Checking for header boost/date_time.hpp   : yes
176
Checking for header boost/detail/endian.hpp : yes
177
Checking for header boost/format.hpp        : yes
178
Checking for header boost/function.hpp      : yes
179
Checking for header boost/functional/factory.hpp : yes
180
Checking for header boost/ptr_container/ptr_vector.hpp : yes
181
Checking for header boost/scoped_ptr.hpp               : yes
182
Checking for header boost/static_assert.hpp            : yes
183
Checking for header boost/thread.hpp                   : yes
184
Configuring boost libraries                            : optimized variant
185
Checking boost ABI tag                                 :
186
Checking boost includes                                : 1_48
187
Checking boost libs                                    : ok
188
Checking for boost linkage                             : ok
189
Checking for header boost/asio.hpp                     : yes
190
Checking for header boost/bind.hpp                     : yes
191
Checking for header boost/date_time.hpp                : yes
192
Checking for header boost/detail/endian.hpp            : yes
193
Checking for header boost/format.hpp                   : yes
194
Checking for header boost/function.hpp                 : yes
195
Checking for header boost/functional/factory.hpp       : yes
196
Checking for header boost/ptr_container/ptr_vector.hpp : yes
197
Checking for header boost/scoped_ptr.hpp               : yes
198
Checking for header boost/static_assert.hpp            : yes
199
Checking for header boost/thread.hpp                   : yes
200
'configure' finished successfully (31.262s)
201
</pre>
202
203
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.
204 10 Tony Ciavarella
205 1 Tony Ciavarella
h2. Compiling
206
207 20 Tony Ciavarella
The basic strategy for building Disorder is to invoke the waf build system with the desired build variant.
208 1 Tony Ciavarella
209 20 Tony Ciavarella
Disorder has two build variants:
210 23 Tony Ciavarella
* debug: produces a library that contains debugging symbols and disables most compiler optimizations
211
* optimized: produces a library stripped of debugging symbols and enables compiler optimizations for performance
212 1 Tony Ciavarella
213 23 Tony Ciavarella
It might be reasonable to use the @debug@ variant in a development environment and the @optimized@ variant in a production environment.
214 1 Tony Ciavarella
215 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.
216
217 26 Tony Ciavarella
The results of the build are put in the @bin@ subdirectory under the name of the variant.  
218 23 Tony Ciavarella
219 26 Tony Ciavarella
Both variants can coexist peacefully in the tree at the same time.
220 23 Tony Ciavarella
221 20 Tony Ciavarella
h3. Linux
222 1 Tony Ciavarella
223 23 Tony Ciavarella
On Linux, to build the Disorder @debug@ variant:
224 20 Tony Ciavarella
<pre>./waf build_debug</pre>
225
226
h3. Windows
227
228 23 Tony Ciavarella
On Windows, the waf script is invoked indirectly.  To build the @optimized@ variant:
229
<pre>python.exe waf build_optimized</pre>
230 12 Tony Ciavarella
231 43 Tony Ciavarella
h2. Ensuring Build Correctness
232
233 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.
234 43 Tony Ciavarella
235
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 test_all_<variant> like this for the @optimized@ variant:
236
<pre>./waf test_all_optimized</pre>
237
238
That should result in something this:
239
<pre>
240
Waf: Entering directory `/opt/disorder/bin/optimized'
241
[PASS]: all 1 tests passed!
242
[PASS]: all 1192 tests passed!
243
[PASS]: all 75091 tests passed!
244
[PASS]: all 12 tests passed!
245
[PASS]: all 85 tests passed!
246
[PASS]: all 7659 tests passed!
247
[PASS]: all 46 tests passed!
248
[PASS]: all 536 tests passed!
249
Waf: Leaving directory `/opt/disorder/bin/optimized'
250
'test_all_optimized' finished successfully (1.184s)
251
</pre>
252
253
If you see
254
<pre>Something failed!  That's not good.  This build cannot be trusted until the damn thing is fixed.</pre>
255
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.
256
257 1 Tony Ciavarella
h2. Building Against the Disorder Library
258 28 Tony Ciavarella
259
h3. Compiling
260
261
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.
262
263
h3. Linking
264
265 29 Tony Ciavarella
Just link your program against Disorder's static library that can be found in the @bin/<build variant>@ directory.