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