]> git.saurik.com Git - wxWidgets.git/blame - build/bakefiles/wxpresets/bakefile_quickstart.txt
mac cleanup, cgcolor changes
[wxWidgets.git] / build / bakefiles / wxpresets / bakefile_quickstart.txt
CommitLineData
e66439e3
KO
1-----------------------------------------------------------------------
2Creating a Cross-Platform Build System Using Bakefile
3The 10-minute, do-it-yourself wx project baking guide (with free sample recipes!)
4
5Status: DRAFT
6Author: Kevin Ollivier
7Date: 2/13/04
8License: wxWidgets License
9-----------------------------------------------------------------------
10
72c1ea91
VS
11Supporting many different platforms can be a difficult challenge. The
12challenge for wxWidgets is especially great, because it supports a variety of
13different compilers and development environments, including MSVC, Borland C++,
14MinGW, DevCPP, GNU make/automake, among others. Maintaining such a large
15number of different project files and formats can quickly become overwhelming.
16To simplify the maintenance of these formats, one of the wxWidgets developers,
17Vaclav Slavik, created Bakefile, a XML-based makefile wrapper that generates
18all the native project files for wxWidgets. So now, even though wxWidgets
19supports all these formats, wxWidgets developers need only update one file -
20the Bakefile, and it handles the rest. But Bakefile isn't specific to
21wxWidgets in any way - you can use Bakefile for your own projects, too. This
22brief tutorial will take a look at how to do that.
23
24Note that this tutorial assumes that you are familiar with how to build
25software using one of the supported Bakefile makefile systems, that you have
26some basic familiarity with how makefiles work, and that you are capable of
27setting environment variables on your platform. Also note that the terms Unix
28and Unix-based refers to all operating systems that share a Unix heritage,
29including FreeBSD, Linux, Mac OS X, and various other operating systems.
e66439e3
KO
30
31-- Getting Started --
32
72c1ea91
VS
33First, you'll need to install Bakefile. You can always find the latest version
34for download online at http://bakefile.sf.net. A binary installer is provided
35for Windows users, while users of Unix-based operating systems (OS) will need
36to unpack the tarball and run configure && make && make install. (Packages for
37some distros are also available, check http://bakefile.sf.net for details.)
e66439e3
KO
38
39-- Setting Up Your wx Build Environment --
40
72c1ea91
VS
41Before you can build wxWidgets software using Bakefile or any other build
42system, you need to make sure that wxWidgets is built and that wxWidgets
43projects can find the wxWidgets includes and library files. wxWidgets build
44instructions can be found by going to the docs subfolder, then looking for the
45subfolder that corresponds to your platform (i.e. msw, gtk, mac) and reading
46"install.txt" there. Once you've done that, here are some extra steps you
47should take to make sure your Bakefile projects work with wxWidgets:
e66439e3
KO
48
49On Windows
50----------
72c1ea91
VS
51Once you've built wxWidgets, you should create an environment variable named
52WXWIN and set it to the home folder of your wxWidgets source tree. (If you use
53the command line to build, you can also set or override WXWIN at build time by
54passing it in as an option to your makefile.)
e66439e3
KO
55
56On Unix
57-------
72c1ea91
VS
58In a standard install, you need not do anything so long as wx-config is on
59your PATH. wx-config is all you need. (See the section of the book on using
60wx-config for more information.)
e66439e3
KO
61
62-- A Sample wx Project Bakefile --
63
72c1ea91
VS
64Now that everything is setup, it's time to take Bakefile for a test run. I
65recommend that you use the wx sample Bakefile to get you started. It can be
66found in the 'build/bakefiles/wxpresets/sample' directory in the wxWidgets
67source tree. Here is the minimal.bkl Bakefile used in the sample:
e66439e3
KO
68
69minimal.bkl
70-------------------------------------------------------------
71<?xml version="1.0" ?>
72<!-- $Id$ -->
73
74<makefile>
75
76 <include file="presets/wx.bkl"/>
77
78 <exe id="minimal" template="wx">
79 <app-type>gui</app-type>
80 <debug-info>on</debug-info>
81 <runtime-libs>dynamic</runtime-libs>
82
83 <sources>minimal.cpp</sources>
84
85 <wx-lib>core</wx-lib>
86 <wx-lib>base</wx-lib>
87 </exe>
88
89</makefile>
90---------------------------------------------------------------
91
72c1ea91
VS
92It's a complete sample ready to be baked, so go into the directory mentioned
93above and run the following command:
e66439e3
KO
94
95On Windows:
96bakefile -f msvc -I.. minimal.bkl
97
98On Unix:
99bakefile -f gnu -I.. minimal.bkl
100
72c1ea91
VS
101It should generate a makefile (makefile.vc or GNUmakefile, respectively) which
102you can use to build the software. Just build the software using the command
103"nmake -f makefile.vc" or "make -f GNUmakefile" respectively. Now let's take a
104look at some of the basic Bakefile concepts that you'll need to know to move
105on from here.
e66439e3
KO
106
107-- Project Types --
108
a70abf19 109As mentioned earlier, Bakefile builds makefiles for many different
72c1ea91
VS
110development environments. The -f option accepts a list of formats that you
111would like to build, separated by commas. Valid values are:
e66439e3
KO
112
113 autoconf GNU autoconf Makefile.in files
114 borland Borland C/C++ makefiles
e66439e3
KO
115 dmars Digital Mars makefiles
116 dmars_smake Digital Mars makefiles for SMAKE
117 gnu GNU toolchain makefiles (Unix)
118 mingw MinGW makefiles (mingw32-make)
119 msevc4prj MS eMbedded Visual C++ 4 project files
120 msvc MS Visual C++ nmake makefiles
121 msvc6prj MS Visual C++ 6.0 project files
122 watcom OpenWatcom makefiles
123
124TIP: autoconf Project Type
125---------------------------
72c1ea91
VS
126You may notice that in the sample folder, there is also a file called
127configure.in. That file is the input for autoconf, which creates the configure
128scripts that you often see when you build software from source on Unix-based
129platforms. People use configure scripts because they make your Unix makefiles
130more portable by automatically detecting the right libraries and commands to
131use on the user's machine and OS. This is necessary because there are many
132Unix-based operating systems and they all are slightly different in various
133small ways.
134
135Bakefile does not generate a configure or configure.in script, so if you want
136to use configure scripts with your Unix-based software, you will need to learn
137how to use autoconf. Unfortunately, this topic deserves a book all its own and
138is beyond the scope of this tutorial, but a book on the subject can be found
139online at: http://sources.redhat.com/autobook/. Note that you do not need to
140use automake when you are using Bakefile, just autoconf, as Bakefile
141essentially does the same thing as automake.
e66439e3
KO
142----------------------------
143
144-- Targets --
145
72c1ea91
VS
146Every project needs to have a target or targets, specifying what is to be
147built. In Bakefile, you specify the target by creating a tag named with the
148target type. The possible names for targets are:
e66439e3 149
72c1ea91 150 exe create an executable file
3103e8a9 151 dll create a shared library
72c1ea91
VS
152 lib create a static library
153 module create a library that is loaded at runtime (i.e. a plugin)
e66439e3 154
72c1ea91
VS
155Note the sample above is an "exe" target. Once you create the target, all the
156build settings, including flags and linker options, should be placed inside
157the target tag, as they are in the sample above.
e66439e3
KO
158
159-- Adding Sources and Includes --
160
72c1ea91
VS
161Obviously, you need to be able to add source and include files to your
162project. You add sources using the "<sources>" tag (as shown above), and add
163include directories using the "<include>" tag. You can add multiple <sources>
164and <include> tags to add multiple source files, or you can also add multiple
165sources and includes into one tag by separating them with a space, like so:
e66439e3
KO
166
167<sources>minimal.cpp minimal2.cpp minimal3.cpp</sources>
168
72c1ea91
VS
169If your sources are in a subfolder of your Bakefile, you use the slash "/"
170character to denote directories, even on Windows. (i.e. src/minimal.cpp) For
171more options and flags, please consult the Bakefile documentation in the 'doc'
172subfolder of Bakefile, or you can also find it on the Bakefile web site.
e66439e3
KO
173
174-- Build Options --
175
72c1ea91
VS
176What if you want to offer a DEBUG and a RELEASE build? Or a UNICODE/ANSI
177build? You can do this in Bakefile by creating options. To create an option,
178use the "<option>" tag. A typical option has three important parts: a name, a
179default value, and a comma-separated list of values. For example, here is how
180to create a DEBUG option which builds debug by default:
e66439e3
KO
181
182<option name="DEBUG">
72c1ea91
VS
183 <default-value>1</default-value>
184 <values>0 1</values>
e66439e3
KO
185</option>
186
72c1ea91
VS
187You can then test the value of this option and conditionally set build
188settings, flags, etc. For more information on both options and conditional
189statements, please refer to the Bakefile documentation.
e66439e3
KO
190
191-- Bakefile Presets/Templates and Includes --
192
72c1ea91
VS
193It is common that most projects will reuse certain settings, or options, in
194their makefiles. (i.e. DEBUG or static/dynamic library options) Also, it is
195common to have to use settings from another project; for example, any project
196that uses wxWidgets will need to build using the same flags and options that
197wxWidgets was built with. Bakefile makes these things easier by allowing users
198to create Bakefile templates, where you can store common settings.
199
200Bakefile ships with a couple of templates, found in the 'presets' subfolder of
201your Bakefile installation. The "simple.bkl" template adds a DEBUG option to
202makefiles so you can build in release or debug mode. To add this template to
203your project, simply add the tag "<include file="presets/simple.bkl"/>" to the
204top of your Bakefile. Then, when creating your target, add the
205"template="simple"" attribute to it. Now, once you build the makefile, your
206users can write commands like:
e66439e3
KO
207
208nmake -f makefile.vc DEBUG=1
209
210or
211
212make -f GNUmakefile DEBUG=1
213
214In order to build the software in debug mode.
215
72c1ea91
VS
216To simplify the building of wxWidgets-based projects, wxWidgets contains a a
217set of Bakefiles that automatically configure your build system to be
218compatible with wxWidgets. As you'll notice in the sample above, the sample
219project uses the wx template. Once you've included the template, your software
220will now build with wxWidgets support.
e66439e3 221
72c1ea91
VS
222But since the wx presets don't exist in the Bakefile presets subfolder,
223Bakefile needs to know where to find these presets. The "-I" command adds the
224wxpresets folder to Bakefile's search path.
e66439e3 225
72c1ea91
VS
226If you regularly include Bakefile presets in places other than the Bakefile
227presets folder, then you can set the BAKEFILE_PATHS environment variable so
228that Bakefile can find these Bakefiles and include them in your project. This
229way you no longer need to specify the -I flag each time you build.
e66439e3 230
72c1ea91
VS
231Lastly, it's important to note that the Win 32 wx project Bakefiles come with
232some common build options that users can use when building the software. These
233options are:
e66439e3 234
72c1ea91
VS
235 Option Values Description
236 ------ ------ -------------
b41b09e2
KO
237 WX_MONOLITHIC 0(default),1 Set this to 1 if you built wx
238 as a monolithic library
72c1ea91
VS
239 WX_SHARED 0(default),1 Specify static or dynamic wx libs
240 WX_UNICODE 0(defualt),1 Use ANSI or UNICODE wx libs
241 WX_DEBUG 0,1(default) Use release or debug wx libs
242 *WX_VERSION 25,26(default) Specify version of wx libs
e66439e3 243
72c1ea91
VS
244*Note: Any version of wx past 2.5 will be allowed here, so 25/26 is not a
245complete list of values.
e66439e3 246
72c1ea91
VS
247These options are not needed under Unix as wx-config can be used to specify
248these options.
e66439e3
KO
249
250-- bakefile_gen - Automated Bakefile Scripts --
251
72c1ea91
VS
252If you have a large project, you can imagine that the calls to Bakefile would
253get more and more complex and unwieldly to manage. For this reason, a script
254called bakefile_gen was created, which reads in a .bkgen file that provides
255all the commands needed to build all the makefiles your project supports. A
256discussion of how to use bakefile_gen is beyond the scope of this tutorial,
257but it deserves mention because it can be invaluable to large projects.
258Documentation on bakefile_gen can be found in the Bakefile documentation.
e66439e3
KO
259
260-- Conclusion --
261
72c1ea91
VS
262This concludes our basic tutorial of the cross-platform Bakefile build system
263management tool. From here, please be sure to take a good look at the Bakefile
264documentation to see what else it is capable of. Please post questions to the
265bakefile-devel@lists.sourceforge.net list, or if you have questions specific
266to the wx template Bakefile, send an email to wx-users@lists.wxwidgets.org.
e66439e3
KO
267
268Enjoy using Bakefile!