]>
Commit | Line | Data |
---|---|---|
e66439e3 KO |
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 | |
526954c5 | 8 | Licence: wxWindows Licence |
e66439e3 KO |
9 | ----------------------------------------------------------------------- |
10 | ||
72c1ea91 VS |
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 | |
0d61c167 | 22 | brief tutorial will take a look at how to do that. |
72c1ea91 VS |
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. | |
e66439e3 KO |
30 | |
31 | -- Getting Started -- | |
32 | ||
72c1ea91 | 33 | First, you'll need to install Bakefile. You can always find the latest version |
0d61c167 | 34 | for download online at http://www.bakefile.org. A binary installer is provided |
72c1ea91 | 35 | for Windows users, while users of Unix-based operating systems (OS) will need |
0d61c167 VZ |
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). | |
e66439e3 KO |
39 | |
40 | -- Setting Up Your wx Build Environment -- | |
41 | ||
72c1ea91 VS |
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: | |
e66439e3 KO |
49 | |
50 | On Windows | |
51 | ---------- | |
72c1ea91 VS |
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.) | |
e66439e3 KO |
56 | |
57 | On Unix | |
58 | ------- | |
72c1ea91 VS |
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.) | |
e66439e3 KO |
62 | |
63 | -- A Sample wx Project Bakefile -- | |
64 | ||
72c1ea91 VS |
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: | |
e66439e3 KO |
69 | |
70 | minimal.bkl | |
71 | ------------------------------------------------------------- | |
72 | <?xml version="1.0" ?> | |
e66439e3 KO |
73 | |
74 | <makefile> | |
75 | ||
76 | <include file="presets/wx.bkl"/> | |
77 | ||
92a93d46 | 78 | <exe id="minimal" template="wxgui"> |
e66439e3 KO |
79 | <debug-info>on</debug-info> |
80 | <runtime-libs>dynamic</runtime-libs> | |
0d61c167 | 81 | |
e66439e3 | 82 | <sources>minimal.cpp</sources> |
0d61c167 | 83 | |
e66439e3 KO |
84 | <wx-lib>core</wx-lib> |
85 | <wx-lib>base</wx-lib> | |
86 | </exe> | |
87 | ||
88 | </makefile> | |
89 | --------------------------------------------------------------- | |
90 | ||
72c1ea91 | 91 | It's a complete sample ready to be baked, so go into the directory mentioned |
0d61c167 | 92 | above and run the following command: |
e66439e3 KO |
93 | |
94 | On Windows: | |
95 | bakefile -f msvc -I.. minimal.bkl | |
96 | ||
97 | On Unix: | |
98 | bakefile -f gnu -I.. minimal.bkl | |
99 | ||
72c1ea91 VS |
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. | |
e66439e3 KO |
105 | |
106 | -- Project Types -- | |
107 | ||
a70abf19 | 108 | As mentioned earlier, Bakefile builds makefiles for many different |
72c1ea91 VS |
109 | development environments. The -f option accepts a list of formats that you |
110 | would like to build, separated by commas. Valid values are: | |
e66439e3 KO |
111 | |
112 | autoconf GNU autoconf Makefile.in files | |
113 | borland Borland C/C++ makefiles | |
e66439e3 KO |
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 | --------------------------- | |
72c1ea91 VS |
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 | |
0d61c167 | 140 | essentially does the same thing as automake. |
e66439e3 KO |
141 | ---------------------------- |
142 | ||
143 | -- Targets -- | |
144 | ||
72c1ea91 VS |
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: | |
e66439e3 | 148 | |
72c1ea91 | 149 | exe create an executable file |
3103e8a9 | 150 | dll create a shared library |
72c1ea91 VS |
151 | lib create a static library |
152 | module create a library that is loaded at runtime (i.e. a plugin) | |
e66439e3 | 153 | |
72c1ea91 VS |
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. | |
e66439e3 KO |
157 | |
158 | -- Adding Sources and Includes -- | |
159 | ||
72c1ea91 VS |
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: | |
e66439e3 KO |
165 | |
166 | <sources>minimal.cpp minimal2.cpp minimal3.cpp</sources> | |
167 | ||
72c1ea91 VS |
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. | |
e66439e3 KO |
172 | |
173 | -- Build Options -- | |
174 | ||
72c1ea91 VS |
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: | |
e66439e3 KO |
180 | |
181 | <option name="DEBUG"> | |
72c1ea91 VS |
182 | <default-value>1</default-value> |
183 | <values>0 1</values> | |
e66439e3 KO |
184 | </option> |
185 | ||
72c1ea91 VS |
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. | |
e66439e3 KO |
189 | |
190 | -- Bakefile Presets/Templates and Includes -- | |
191 | ||
72c1ea91 VS |
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 | |
0d61c167 | 197 | to create Bakefile templates, where you can store common settings. |
72c1ea91 VS |
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: | |
e66439e3 KO |
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 | ||
0d61c167 | 215 | To simplify the building of wxWidgets-based projects, wxWidgets contains a |
72c1ea91 VS |
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 | |
92a93d46 VS |
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. | |
e66439e3 | 224 | |
72c1ea91 VS |
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 | |
0d61c167 | 227 | wxpresets folder to Bakefile's search path. |
e66439e3 | 228 | |
72c1ea91 VS |
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. | |
e66439e3 | 233 | |
72c1ea91 VS |
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 | |
0d61c167 | 236 | options are: |
e66439e3 | 237 | |
72c1ea91 VS |
238 | Option Values Description |
239 | ------ ------ ------------- | |
0d61c167 | 240 | WX_MONOLITHIC 0(default),1 Set this to 1 if you built wx |
b41b09e2 | 241 | as a monolithic library |
72c1ea91 | 242 | WX_SHARED 0(default),1 Specify static or dynamic wx libs |
0d61c167 | 243 | WX_UNICODE 0(default),1 Use ANSI or UNICODE wx libs |
72c1ea91 VS |
244 | WX_DEBUG 0,1(default) Use release or debug wx libs |
245 | *WX_VERSION 25,26(default) Specify version of wx libs | |
e66439e3 | 246 | |
72c1ea91 | 247 | *Note: Any version of wx past 2.5 will be allowed here, so 25/26 is not a |
0d61c167 | 248 | complete list of values. |
e66439e3 | 249 | |
72c1ea91 VS |
250 | These options are not needed under Unix as wx-config can be used to specify |
251 | these options. | |
e66439e3 KO |
252 | |
253 | -- bakefile_gen - Automated Bakefile Scripts -- | |
254 | ||
72c1ea91 | 255 | If you have a large project, you can imagine that the calls to Bakefile would |
0d61c167 | 256 | get more and more complex and unwieldy to manage. For this reason, a script |
72c1ea91 VS |
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. | |
e66439e3 KO |
262 | |
263 | -- Conclusion -- | |
264 | ||
72c1ea91 VS |
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. | |
e66439e3 KO |
270 | |
271 | Enjoy using Bakefile! |