2010-07-25 02:03:47 -06:00
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
2011-10-28 15:18:10 -06:00
< meta name = "generator" content = "Docutils 0.8.1: http://docutils.sourceforge.net/" / >
2011-07-30 21:50:37 -06:00
< title > Building DFHACK< / title >
2010-07-25 02:03:47 -06:00
< style type = "text/css" >
/*
:Author: David Goodger (goodger@python.org)
2011-07-30 21:50:37 -06:00
:Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $
2010-07-25 02:03:47 -06:00
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
2011-07-30 21:50:37 -06:00
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
2010-07-25 02:03:47 -06:00
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
2011-07-30 21:50:37 -06:00
text-align: inherit }
2010-07-25 02:03:47 -06:00
/* div.align-center * { */
/* text-align: left } */
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
2011-07-30 21:50:37 -06:00
pre.literal-block, pre.doctest-block, pre.math {
2010-07-25 02:03:47 -06:00
margin-left: 2em ;
margin-right: 2em }
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
< / style >
< / head >
< body >
2011-07-30 21:50:37 -06:00
< div class = "document" id = "building-dfhack" >
< h1 class = "title" > Building DFHACK< / h1 >
2010-07-25 02:03:47 -06:00
< div class = "contents topic" id = "contents" >
< p class = "topic-title first" > Contents< / p >
< ul class = "simple" >
2011-07-30 21:50:37 -06:00
< li > < a class = "reference internal" href = "#building-on-linux" id = "id2" > Building on Linux< / a > < ul >
2011-03-13 12:38:32 -06:00
< li > < a class = "reference internal" href = "#dependencies" id = "id3" > Dependencies< / a > < / li >
2011-07-30 21:50:37 -06:00
< li > < a class = "reference internal" href = "#build" id = "id4" > Build< / a > < / li >
2011-03-13 12:38:32 -06:00
< / ul >
< / li >
2011-07-30 21:50:37 -06:00
< li > < a class = "reference internal" href = "#building-on-windows" id = "id5" > Building on Windows< / a > < ul >
< li > < a class = "reference internal" href = "#id1" id = "id6" > Build< / a > < / li >
2011-03-13 12:38:32 -06:00
< / ul >
< / li >
2011-07-30 21:50:37 -06:00
< li > < a class = "reference internal" href = "#build-types" id = "id7" > Build types< / a > < / li >
< li > < a class = "reference internal" href = "#using-the-library-as-a-developer" id = "id8" > Using the library as a developer< / a > < ul >
< li > < a class = "reference internal" href = "#contributing-to-dfhack" id = "id9" > Contributing to DFHack< / a > < ul >
< li > < a class = "reference internal" href = "#coding-style" id = "id10" > Coding style< / a > < / li >
< li > < a class = "reference internal" href = "#how-to-get-new-code-into-dfhack" id = "id11" > How to get new code into DFHack< / a > < / li >
< li > < a class = "reference internal" href = "#memory-research" id = "id12" > Memory research< / a > < / li >
2011-03-13 12:38:32 -06:00
< / ul >
< / li >
< / ul >
< / li >
2010-07-25 02:03:47 -06:00
< / ul >
< / div >
2011-07-30 21:50:37 -06:00
< div class = "section" id = "building-on-linux" >
< h1 > < a class = "toc-backref" href = "#id2" > Building on Linux< / a > < / h1 >
< p > On Linux, DFHack acts as a library that shadows parts of the SDL API using LD_PRELOAD.< / p >
2010-07-25 02:03:47 -06:00
< div class = "section" id = "dependencies" >
2011-03-13 12:38:32 -06:00
< h2 > < a class = "toc-backref" href = "#id3" > Dependencies< / a > < / h2 >
2011-07-30 21:50:37 -06:00
< p > DFHack is meant to be installed into an existing DF folder, so get one ready.< / p >
< p > For building, you need a 32-bit version of GCC. For example, to build DFHack on
a 64-bit distribution like Arch, you'll need the multilib development tools and libraries.< / p >
< p > Before you can build anything, you'll also need < tt class = "docutils literal" > cmake< / tt > . It is advisable to also get
< tt class = "docutils literal" > ccmake< / tt > on distributions that split the cmake package into multiple parts.< / p >
2011-12-29 19:15:51 -07:00
< p > For the code generation parts, you need perl and the XML::LibXML and XML::LibXSLT perl packages.
You should be able to find them in your distro repositories (on Arch linux 'perl-xml-libxml' and 'perl-xml-libxslt').< / p >
2010-07-25 02:03:47 -06:00
< / div >
2011-07-30 21:50:37 -06:00
< div class = "section" id = "build" >
< h2 > < a class = "toc-backref" href = "#id4" > Build< / a > < / h2 >
< p > Building is fairly straightforward. Enter the < tt class = "docutils literal" > build< / tt > folder and start the build like this:< / p >
2010-07-25 02:03:47 -06:00
< pre class = "literal-block" >
cd build
2011-07-30 21:50:37 -06:00
cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=/home/user/DF
make install
2010-07-25 02:03:47 -06:00
< / pre >
2011-07-30 21:50:37 -06:00
< p > Obviously, replace the install path with path to your DF. This will build the library
along with the normal set of plugins and install them into your DF folder.< / p >
2011-03-13 12:38:32 -06:00
< p > Alternatively, you can use ccmake instead of cmake:< / p >
2011-07-30 21:50:37 -06:00
< pre class = "literal-block" >
2011-03-13 12:38:32 -06:00
cd build
ccmake ..
2011-07-30 21:50:37 -06:00
make install
< / pre >
2011-03-13 12:38:32 -06:00
< p > This will show a curses-based interface that lets you set all of the
extra options.< / p >
2011-03-17 23:07:13 -06:00
< p > You can also use a cmake-friendly IDE like KDevelop 4 or the cmake-gui
2010-07-25 02:03:47 -06:00
program.< / p >
2011-07-30 21:50:37 -06:00
< / div >
2010-07-25 02:03:47 -06:00
< / div >
< div class = "section" id = "building-on-windows" >
2011-07-30 21:50:37 -06:00
< h1 > < a class = "toc-backref" href = "#id5" > Building on Windows< / a > < / h1 >
< p > First, you need < tt class = "docutils literal" > cmake< / tt > . Get the win32 installer version from the official
2010-07-25 02:03:47 -06:00
site: < a class = "reference external" href = "http://www.cmake.org/cmake/resources/software.html" > http://www.cmake.org/cmake/resources/software.html< / a > < / p >
2011-07-30 21:50:37 -06:00
< p > It has the usual installer wizard. Make sure you let it add its binary folder
to your binary search PATH so the tool can be later run from anywhere.< / p >
2011-12-24 06:44:14 -07:00
< p > You'll need a copy of Microsoft Visual C++ 2010. The Express version is sufficient.
2011-07-30 21:50:37 -06:00
Grab it from Microsoft's site.< / p >
2011-12-29 19:15:51 -07:00
< p > For the code generation parts, you'll need perl and XML::LibXML. You can install them like this:< / p >
< ul class = "simple" >
< li > download and install strawberry perl from < a class = "reference external" href = "http://strawberryperl.com/" > http://strawberryperl.com/< / a > < / li >
< li > reboot so that the system can pick up the new binary path< / li >
< li > open a cmd.exe window and run " cpan XML::LibXML" (obviously without the quotes). This can take a while to complete.< / li >
< li > Same with " cpan XML::LibXSLT" .< / li >
< / ul >
2012-02-04 20:28:20 -07:00
< p > If you already have a different version of perl (for example the one from cygwin), you can run into some trouble. Either remove the other perl install from PATH, or install libxml and libxslt for it instead. Strawberry perl works though and has all the required packages.< / p >
2011-07-30 21:50:37 -06:00
< div class = "section" id = "id1" >
< h2 > < a class = "toc-backref" href = "#id6" > Build< / a > < / h2 >
2012-02-04 20:28:20 -07:00
< p > There are several different batch files in the < tt class = "docutils literal" > build< / tt > folder along with a script that's used for picking the DF path.< / p >
< p > First, run set_df_path.vbs and point the dialog that pops up at your DF folder that you want to use for development.
Next, run one of the scripts with < tt class = "docutils literal" > generate< / tt > prefix. These create the MSVC solution file(s):< / p >
< ul class = "simple" >
< li > < tt class = "docutils literal" > all< / tt > will create a solution with everything enabled (and the kitchen sink).< / li >
< li > < tt class = "docutils literal" > gui< / tt > will pop up the cmake gui and let you pick and choose what to build. This is probably what you want most of the time. Set the options you are interested in, then hit configure, then generate. More options can appear after the configure step.< / li >
< li > < tt class = "docutils literal" > minimal< / tt > will create a minimal solution with just the bare necessities - the main library and standard plugins.< / li >
< / ul >
< p > Then you can either open the solution with MSVC or use one of the msbuild scripts:< / p >
< ul class = "simple" >
< li > Scripts with < tt class = "docutils literal" > build< / tt > prefix will only build.< / li >
< li > Scripts with < tt class = "docutils literal" > install< / tt > prefix will build DFHack and install it to the previously selected DF path.< / li >
< li > Scripts with < tt class = "docutils literal" > package< / tt > prefix will build and create a .zip package of DFHack.< / li >
< / ul >
< p > When you open the solution in MSVC, make sure you never use the Debug builds. Those aren't
2011-07-30 21:50:37 -06:00
binary-compatible with DF. If you try to use a debug build with DF, you'll only get crashes.
So pick either Release or RelWithDebInfo build and build the INSTALL target.< / p >
2012-02-04 20:28:20 -07:00
< p > The < tt class = "docutils literal" > debug< / tt > scripts actually do RelWithDebInfo builds.< / p >
2010-07-25 02:03:47 -06:00
< / div >
< / div >
< div class = "section" id = "build-types" >
2011-07-30 21:50:37 -06:00
< h1 > < a class = "toc-backref" href = "#id7" > Build types< / a > < / h1 >
2010-07-25 02:03:47 -06:00
< p > < tt class = "docutils literal" > cmake< / tt > allows you to pick a build type by changing this
variable: < tt class = "docutils literal" > CMAKE_BUILD_TYPE< / tt > < / p >
< pre class = "literal-block" >
cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE
< / pre >
< p > Without specifying a build type or 'None', cmake uses the
< tt class = "docutils literal" > CMAKE_CXX_FLAGS< / tt > variable for building.< / p >
2011-07-30 21:50:37 -06:00
< p > Valid and useful build types include 'Release', 'Debug' and
'RelWithDebInfo'. 'Debug' is not available on Windows.< / p >
2010-07-25 02:03:47 -06:00
< / div >
2011-03-13 12:38:32 -06:00
< div class = "section" id = "using-the-library-as-a-developer" >
2011-07-30 21:50:37 -06:00
< h1 > < a class = "toc-backref" href = "#id8" > Using the library as a developer< / a > < / h1 >
< p > Currently, the only way to use the library is to write a plugin that can be loaded by it.
All the plugins can be found in the 'plugins' folder. There's no in-depth documentation
on how to write one yet, but it should be easy enough to copy one and just follow the pattern.< / p >
< p > The most important parts of DFHack are the Core, Console, Modules and Plugins.< / p >
< ul class = "simple" >
< li > Core acts as the centerpiece of DFHack - it acts as a filter between DF and SDL and synchronizes the various plugins with DF.< / li >
< li > Console is a thread-safe console that can be used to invoke commands exported by Plugins.< / li >
< li > Modules actually describe the way to access information in DF's memory. You can get them from the Core. Most modules are split into two parts: high-level and low-level. Higl-level is mostly method calls, low-level publicly visible pointers to DF's data structures.< / li >
< li > Plugins are the tools that use all the other stuff to make things happen. A plugin can have a list of commands that it exports and an onupdate function that will be called each DF game tick.< / li >
< / ul >
< p > Rudimentary API documentation can be built using doxygen (see build options with < tt class = "docutils literal" > ccmake< / tt > or < tt class = "docutils literal" > < span class = "pre" > cmake-gui< / span > < / tt > ).< / p >
< p > DFHack consists of variously licensed code, but invariably weak copyleft.
The main license is zlib/libpng, some bits are MIT licensed, and some are BSD licensed.< / p >
< p > Feel free to add your own extensions and plugins. Contributing back to
2011-03-13 12:38:32 -06:00
the dfhack repository is welcome and the right thing to do :)< / p >
< div class = "section" id = "contributing-to-dfhack" >
2011-07-30 21:50:37 -06:00
< h2 > < a class = "toc-backref" href = "#id9" > Contributing to DFHack< / a > < / h2 >
2011-03-13 12:38:32 -06:00
< p > Several things should be kept in mind when contributing to DFHack.< / p >
< div class = "section" id = "coding-style" >
2011-07-30 21:50:37 -06:00
< h3 > < a class = "toc-backref" href = "#id10" > Coding style< / a > < / h3 >
2011-03-13 12:38:32 -06:00
< p > DFhack uses ANSI formatting and four spaces as indentation. Line
endings are UNIX. The files use UTF-8 encoding. Code not following this
won't make me happy, because I'll have to fix it. There's a good chance
I'll make < em > you< / em > fix it ;)< / p >
< / div >
< div class = "section" id = "how-to-get-new-code-into-dfhack" >
2011-07-30 21:50:37 -06:00
< h3 > < a class = "toc-backref" href = "#id11" > How to get new code into DFHack< / a > < / h3 >
2011-03-13 12:38:32 -06:00
< p > You can send patches or make a clone of the github repo and ask me on
the IRC channel to pull your code in. I'll review it and see if there
are any problems. I'll fix them if they are minor.< / p >
< p > Fixes are higher in priority. If you want to work on something, but
don't know what, check out < a class = "reference external" href = "http://github.com/peterix/dfhack/issues" > http://github.com/peterix/dfhack/issues< / a > --
this is also a good place to dump new ideas and/or bugs that need
fixing.< / p >
< / div >
2011-07-30 21:50:37 -06:00
< div class = "section" id = "memory-research" >
< h3 > < a class = "toc-backref" href = "#id12" > Memory research< / a > < / h3 >
< p > If you want to do memory research, you'll need some tools and some knowledge.
In general, you'll need a good memory viewer and optionally something
to look at machine code without getting crazy :)< / p >
< p > Good windows tools include:< / p >
< ul class = "simple" >
< li > Cheat Engine< / li >
< li > IDA Pro (the free version)< / li >
< / ul >
< p > Good linux tools:< / p >
< ul class = "simple" >
2012-02-04 20:28:20 -07:00
< li > angavrilov's df-structures gui (visit us on IRC for details).< / li >
2011-07-30 21:50:37 -06:00
< li > edb (Evan's Debugger)< / li >
< li > IDA Pro running under wine.< / li >
< li > Some of the tools residing in the < tt class = "docutils literal" > legacy< / tt > dfhack branch.< / li >
< / ul >
< p > Using publicly known information and analyzing the game's data is preferred.< / p >
2011-03-13 12:38:32 -06:00
< / div >
< / div >
< / div >
< / div >
2010-07-25 02:03:47 -06:00
< / body >
< / html >