anjuta r4311 - in trunk: . manuals manuals/anjuta-build-tutorial manuals/anjuta-build-tutorial/C manuals/anjuta-build-tutorial/C/figures
- From: sgranjoux svn gnome org
- To: svn-commits-list gnome org
- Subject: anjuta r4311 - in trunk: . manuals manuals/anjuta-build-tutorial manuals/anjuta-build-tutorial/C manuals/anjuta-build-tutorial/C/figures
- Date: Mon, 29 Sep 2008 20:36:08 +0000 (UTC)
Author: sgranjoux
Date: Mon Sep 29 20:36:07 2008
New Revision: 4311
URL: http://svn.gnome.org/viewvc/anjuta?rev=4311&view=rev
Log:
* configure.in,
manuals/Makefile.am,
(added) manuals/anjuta-build-tutorial/anjuta-build-tutorial-C.omf,
(added) manuals/anjuta-build-tutorial/Makefile.am,
(added) manuals/anjuta-build-tutorial/C/anjuta-build-tutorial.xml,
(added) manuals/anjuta-build-tutorial/C/autotools-process.dia,
(added) manuals/anjuta-build-tutorial/C/configure-process.dia,
(added) manuals/anjuta-build-tutorial/C/compilation-stages.dia,
(added) manuals/anjuta-build-tutorial/C/figures/new-project-basic.png,
(added) manuals/anjuta-build-tutorial/C/figures/configure-process.png,
(added) manuals/anjuta-build-tutorial/C/figures/configure-dialog.png,
(added)
manuals/anjuta-build-tutorial/C/figures/new-project-message.png,
(added)
manuals/anjuta-build-tutorial/C/figures/library-add-pkgconfig.png,
(added) manuals/anjuta-build-tutorial/C/figures/build_preferences.png,
(added)
manuals/anjuta-build-tutorial/C/figures/compilation-stages.png,
(added)
manuals/anjuta-build-tutorial/C/figures/library-add-properties.png,
(added) manuals/anjuta-build-tutorial/C/figures/autotools-process.png,
(added)
manuals/anjuta-build-tutorial/C/figures/new-project-options.png,
(added)
manuals/anjuta-build-tutorial/C/figures/new-project-summary.png,
manuals/anjuta-build-tutorial/C/figures/new-project-select.png:
Update and improve old Anjuta Advanced Tutorial
Added:
trunk/manuals/anjuta-build-tutorial/
trunk/manuals/anjuta-build-tutorial/C/
trunk/manuals/anjuta-build-tutorial/C/anjuta-build-tutorial.xml
trunk/manuals/anjuta-build-tutorial/C/autotools-process.dia (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/compilation-stages.dia (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/configure-process.dia (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/
trunk/manuals/anjuta-build-tutorial/C/figures/autotools-process.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/build_preferences.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/compilation-stages.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/configure-dialog.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/configure-process.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/library-add-pkgconfig.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/library-add-properties.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/new-project-basic.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/new-project-message.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/new-project-options.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/new-project-select.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/C/figures/new-project-summary.png (contents, props changed)
trunk/manuals/anjuta-build-tutorial/Makefile.am
trunk/manuals/anjuta-build-tutorial/anjuta-build-tutorial-C.omf
Modified:
trunk/ChangeLog
trunk/configure.in
trunk/manuals/Makefile.am
Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in (original)
+++ trunk/configure.in Mon Sep 29 20:36:07 2008
@@ -1106,6 +1106,7 @@
manuals/reference/libanjuta/version.xml
manuals/anjuta-manual/Makefile
manuals/anjuta-faqs/Makefile
+manuals/anjuta-build-tutorial/Makefile
mime/Makefile
])
echo " "
Modified: trunk/manuals/Makefile.am
==============================================================================
--- trunk/manuals/Makefile.am (original)
+++ trunk/manuals/Makefile.am Mon Sep 29 20:36:07 2008
@@ -2,4 +2,4 @@
# Add a document module as a subdir here #
##########################################
-SUBDIRS = reference anjuta-manual anjuta-faqs
+SUBDIRS = reference anjuta-manual anjuta-faqs anjuta-build-tutorial
Added: trunk/manuals/anjuta-build-tutorial/C/anjuta-build-tutorial.xml
==============================================================================
--- (empty file)
+++ trunk/manuals/anjuta-build-tutorial/C/anjuta-build-tutorial.xml Mon Sep 29 20:36:07 2008
@@ -0,0 +1,1808 @@
+<?xml version="1.0"?>
+<!DOCTYPE manual PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" >
+
+<!-- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+ <!ENTITY date "March 2004">
+ <!ENTITY app "anjuta"> -->
+<!-- =============Document Header ============================= -->
+<book id="index">
+ <bookinfo>
+ <title>Anjuta build tutorial</title>
+ <edition>v0.2</edition>
+
+ <copyright>
+ <year>2004</year>
+ <holder>Olivier PinÃon</holder>
+ </copyright>
+ <copyright>
+ <year>2008</year>
+ <holder>SÃbastien Granjoux</holder>
+ </copyright>
+
+<!-- translators: uncomment this:
+ <copyright>
+ <year>2001</year>
+ <holder>ME-THE-TRANSLATOR </holder>
+ </copyright>
+-->
+
+ <legalnotice>
+ <para>
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the <citetitle>GNU Free Documentation
+ License</citetitle>, Version 1.1 or any later version published
+ by the Free Software Foundation with no Invariant Sections, no
+ Front-Cover Texts, and no Back-Cover Texts. You may obtain a copy
+ of the <citetitle>GNU Free Documentation License</citetitle> from
+ the Free Software Foundation by visiting <ulink type="http"
+ url="http://www.fsf.org">their Web site</ulink> or by writing to:
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ </para>
+ <para>
+ Many of the names used by companies to distinguish their products and
+ services are claimed as trademarks. Where those names appear in any
+ GNOME documentation, and those trademarks are made aware to the members
+ of the GNOME Documentation Project, the names have been printed in caps
+ or initial caps.
+ </para>
+ </legalnotice>
+
+ <!-- this is the version of manual, not application -->
+ <releaseinfo>
+ This is version 0.2 of <application>Anjuta</application> build tutorial
+ </releaseinfo>
+ </bookinfo>
+ <!-- Document Body -->
+ <!-- Introduction -->
+<chapter id="intro">
+ <title>Introduction</title>
+ <para>
+ If you come from the Windows world, when you first launched <application>Anjuta</application>,
+ you can told yourself : "Hey, that looks like MS Visual C++, as I know it pretty well,
+ understanding <application>Anjuta</application> will be a piece of cake.".
+ <application>Anjuta</application> looks like <application>Microsoft Visual Studio</application>
+ or <application>Borland's C++ Builder</application>.
+ but it has some significative differences essentially in its build system.
+ </para>
+ <para>
+ If you are starting programming directly on GNU/Linux, you have probably already heard
+ of the <application>Autotools</application>. They are a major and probably a bit
+ intimidating part of the development environment.
+ </para>
+ <para>
+ The goal of <application>Anjuta</application> is to make it easier to use the already
+ existing development tools. <application>Anjuta</application> main build system uses
+ the standard Linux build system: <application>Autotools</application>.
+ This tutorial is an updated version of the <application>Anjuta</application> advanced
+ tutorial from Olivier PinÃon.
+ It explains how the build system is working without <application>Anjuta</application>
+ and how to use it within <application>Anjuta</application>.
+ It assumes that you have only a basic understanding of C or C++ and have been written using
+ <application>Anjuta 2.6 (September 2008)</application>.
+ </para>
+ <para>
+ If you find errors, need more explanations or have any idea for improvements on this tutorial
+ or <application>Anjuta</application> in general, you can:
+ <itemizedlist>
+ <listitem>
+ Fill a bug in <ulink url="http://bugzilla.gnome.org/enter_bug.cgi?product=anjuta">
+ <application>Anjuta</application> bugzilla database</ulink>.
+ </listitem>
+ <listitem>
+ Send a message to <application>Anjuta</application> developer mailing list
+ <email>anjuta-devel lists sourceforge net</email>
+ </listitem>
+ <listitem>
+ Join <application>Anjuta</application> IRC channel
+ <ulink url="irc://irc.gnome.org/anjuta">#anjuta on irc.gnome.org</ulink>
+ </listitem>
+ </itemizedlist>
+ </para>
+</chapter>
+
+ <!-- Build -->
+<chapter id="build">
+ <title>Building a project</title>
+ <para>
+ This chapter explains how to build a program starting from the most basic tool: the
+ compiler. This order is important to understand how is it working because
+ each tool adds a new layer on top of the previous ones.
+ </para>
+ <sect1 id="build-gcc">
+ <title>Using <application>GCC</application></title>
+ <para>
+ Here is a typical command to generate an executable from C source files
+ using <application>GCC</application>:
+ </para>
+ <screen>
+<prompt>$</prompt><userinput>gcc -g -Wall -I/usr/include/libxml2/libxml -lxml2 main.c aux.c -o tut_prog</userinput></screen>
+ <para>
+ This command tells <application>GCC</application> to compile the source files main.c and aux.c, and
+ produce a binary called 'tut_prog' (this stands for 'tutorial program').
+ The various switches have the following meaning :
+ </para>
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term><parameter>-g</parameter></term>
+ <listitem>
+ tells <application>GCC</application> to include debug information into the binary.
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>-Wall</parameter></term>
+ <listitem>Warning all : print every warning. This switch is used by the C compiler only.</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>-Idir <replaceable>dir</replaceable></parameter></term>
+ <listitem>Look for included header files (like in #include <myheader.h>) in directory
+ <replaceable>dir</replaceable>.
+ This switch is used by the C preprocessor only.</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>-llib <replaceable>lib</replaceable></parameter></term>
+ <listitem>
+ Link to library <replaceable>lib</replaceable>; here <application>libxml2</application>,
+ used by the linker.
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <para>
+ In fact, <application>GCC</application> does not do the compilation itself.
+ It gets all arguments from the user and calls other programs passing them
+ the needed arguments with some default one to do the four stages
+ involved in the compilation.
+ </para>
+ <figure>
+ <title><application>GCC</application> compilation stage</title>
+ <imageobject>
+ <imagedata fileref="figures/compilation-stages.png" format="PNG"></imagedata>
+ </imageobject>
+ </figure>
+ <sect2 id="build-gcc-cpp">
+ <title>Preprocessor</title>
+ <para>
+ Each C source file goes through the preprocessor, named
+ <application>cpp</application>. In this stage, all include files
+ and macros are expanded to get preprocessed C source code. The resulting
+ file .i is rarely generated but it could be interesting to see how complex
+ macros are expanded. You can do this by calling <application>cpp</application>
+ directly or using the <userinput>-E</userinput> switch of
+ <application>GCC</application>. The later option is better as it allows to run
+ the preprocessor with all default options.
+ </para>
+ </sect2>
+ <sect2 id="build-gcc-cc">
+ <title>Compiler</title>
+ <para>
+ In this stage each file is compiled into assembler code. The compiler
+ depends on the language of the source file, C here.
+ It is a complex program because there is not a one to one
+ correspondence between C instructions and assembler instructions.
+ By example, requesting the fastest
+ or the smallest program will generate different sequences of assembler
+ instructions. The assembler is the language of your computer, the most common
+ one is called x86.
+ The output is a, human readable, assembler source file ending with '.s'.
+ Like the preprocessor output, the assembler code is not normally written
+ on the hard disk. You can stop the compilation at this stage to look at it
+ by running <application>GCC</application> with the <userinput>-S</userinput>
+ switch.
+ </para>
+ </sect2>
+ <sect2 id="build-gcc-as">
+ <title>Assembler</title>
+ <para>
+ In this stage each file is assembled: the assembler code is transformed to
+ an object file with .o extension. It is much easier than the compilation
+ as each assembler instruction corresponds to an unique code. The object file
+ contains additional information for debugging or linking the program.
+ The object file is a binary format, called ELF on recent Linux machine,
+ you need to use special program to look
+ in it like <application>objdump</application>.
+ It is possible to write directly assembler code and assemble it using the
+ assembler ,<application>as</application>, or <application>GCC</application>
+ if your source file has a .s extension.
+ These object files are commonly written on your hard disk because it depends
+ only of theirs corresponding C source file (with all files included).
+ If you modify only one source file, you need to regenerate only the
+ corresponding object file. You can stop at this stage, without linking by
+ using <userinput>-c</userinput> switch with <application>GCC</application>.
+ </para>
+ </sect2>
+ <sect2 id="build-gcc-ld">
+ <title>Linker</title>
+ <para>
+ This stage is used to combine all the object files and libraries into one
+ executable file. The result is a binary file in a format close to the object
+ file, on Linux it is even the same format.
+ </para>
+ </sect2>
+ </sect1>
+ <sect1 id="build-make">
+ <title>Using <application>make</application></title>
+ <para>
+ When a program is composed of lots of sources files, it is much faster
+ to keep the object files and recompile each source files only when needed.
+ This can be automated using <application>make</application>.
+ It executes a program written in a makefile, normally named
+ <filename>Makefile</filename>. A sample makefile for
+ the previous tutorial program could be :
+ </para>
+ <example>
+ <title>A simple Makefile file</title>
+ <programlisting>
+CC=gcc # the C compiler is gcc
+CFLAGS=-g -Wall -I/usr/include/libxml2
+LIBS=-lxml2
+
+tut_prog: main.o aux.o # what we need to have 'tut_prog'...
+ $(CC) $(LIBS) main.o aux.o -o tut_prog # ...and how to get it from the ingredients.
+
+main.o: main.c
+ $(CC) -c $(CFLAGS) main.c
+
+aux.o: aux.c
+ $(CC) -c $(CFLAGS) aux.c</programlisting>
+ </example>
+ <para>
+ Makefiles are a kind of program but instead of writing what should be done
+ sequentially to get the result, you define some rules and
+ <application>make</application> uses these rules in whatever order
+ to achieve the result.
+ </para>
+ <sect2 id="build-make-vars">
+ <title>Variables</title>
+ <para>
+ Like in any programming language, you can define variables in a make
+ file. All variables contains a string or a list of strings
+ separated by whitespace. A variable is defined using the following syntax:
+ <replaceable>name</replaceable>=<replaceable>value</replaceable>.
+ You can get its value by writing $(<replaceable>name</replaceable>) or
+ ${<replaceable>name</replaceable>}.
+ In the sample above, three variables are defined CC, CFLAGS and LIBS.
+ </para>
+ <para>
+ Variables can be redefined when calling <application>make</application>
+ in the command line or using values from environment.
+ Moreover <application>make</application> includes
+ some default rules using predefined variables. Here is a list of
+ the most common ones:
+ <variablelist>
+ <varlistentry>
+ <term><envar>CC</envar></term>
+ <listitem>Program for compiling C programs, default 'cc'</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>CXX</envar></term>
+ <listitem>Program for compiling C++ programs, default 'g++'</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>CPP</envar></term>
+ <listitem>Program for running C preprocessor, default '$(CC) -E'</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>FC</envar></term>
+ <listitem>Program for running Fortran compiler, default 'f77'</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>RM</envar></term>
+ <listitem>Command to remove a file, default 'rm -f'</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>CFLAGS</envar></term>
+ <listitem>Extra flags for the C compiler</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>CXXFLAGS</envar></term>
+ <listitem>Extra flags for the C++ compiler</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>CPPFLAGS</envar></term>
+ <listitem>Extra flags for the C++ compiler</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>CXXFLAGS</envar></term>
+ <listitem>Extra flags for the C preprocessor</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>FFLAGS</envar></term>
+ <listitem>Extra flags for the Fortran compiler</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><envar>LDFLAGS</envar></term>
+ <listitem>Extra flags for the linker</listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </sect2>
+ <sect2 id="build-make-rules">
+ <title>Rules</title>
+ <para>
+ The basic syntax for make rules is:
+ </para>
+ <programlisting>
+<replaceable>target</replaceable>: <replaceable>prerequisites</replaceable>
+ <replaceable>commands</replaceable>
+ <replaceable>…</replaceable></programlisting>
+ <para>
+ The <replaceable>target</replaceable> and the
+ <replaceable>prerequisites</replaceable> are normally files but they could be
+ actions.
+ The rule is interpreted as in order to make the target or update
+ it if it is older than its prerequisites, you need
+ to make all prerequisites and then run all commands.
+ <para>
+ </para>
+ <application>make</application> starts with the first target of the
+ makefile or the one given in the command line and looks for a rule.
+ If this rules has no prerequisites, the associated commands are run
+ and that's all. Else before running the commands, for each prerequisite,
+ <application>make</application> looks for a rule having it as target and
+ repeats the same process.
+ </para>
+ <para>
+ In the sample above, if you run <userinput>make</userinput> or
+ <userinput>make tut_prog</userinput>. <application>make</application>
+ does the following:
+ <programlisting>
+Search a rule with tut_prog as target
+Found with prerequisites main.o aux.o
+ Search a rule with main.o as target
+ Found with prequisite main.c
+ Search a rule with main.c as target
+ Not found (main.c is a source file)
+ If main.o does not exist or is older than main.c
+ Compile main.c, do not link (-c switch)
+ Search a rule with aux.o as target
+ Found with prequisite aux.c
+ Search a rule with aux.c as target
+ Not found (aux.c is a source file)
+ If aux.o does not exist or is older than aux.c
+ Compile aux.c, do not link (-c switch)
+If tut_prog is older than main.o or aux.o
+ Link main.o, aux.o and libxml2</programlisting>
+ </para>
+ <para>
+ Like for variables, several target names are commonly defined:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term><parameter>all</parameter></term>
+ <listitem>Do everything</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>check</parameter></term>
+ <listitem>Perform some self test after building the program</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>clean</parameter></term>
+ <listitem>Delete all files created by <application>make</application></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>distclean</parameter></term>
+ <listitem>Delete more files than clean, could delete the Makefile itself</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>dist</parameter></term>
+ <listitem>Create a distribution package, a compressed tarball by example</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>install</parameter></term>
+ <listitem>Install target created by <application>make</application>,
+ need to be run as root to install in system directories</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>uninstall</parameter></term>
+ <listitem>Remove files installed by <application>make</application></listitem>
+ </varlistentry>
+ </variablelist>
+ <note>
+ Programs compiled from sources are installed by default in <filename class="directory">
+ /usr/local</filename>.
+ If you want to install (or uninstall) a program in such system directory, you normally
+ need to log as root using <userinput>su</userinput> or
+ <userinput>sudo</userinput> before running <userinput>make install</userinput>.
+ </note>
+ </sect2>
+ </sect1>
+ <sect1 id="build-autotools">
+ <title>Using <application>Autotools</application></title>
+ <para>
+ If you want to build your program on another system, using
+ <application>make</application> only could be quite difficult. The C compiler
+ could be different. Some common C functions could be missing, have another name,
+ declared in a different header and so on. This can be handled by enabling
+ difference piece of code in your sources using preprocessor directive #if, #ifdef
+ and others. But the user will have to define himself all these tuning
+ which is not easy as there is a lots of systems with a lots of variations.
+ </para>
+ <para>
+ Free softwares are mainly distributed as sources. It is crucial to be
+ able to recompile them on various system without much technical knowledge.
+ <application>Autotools</application> is designed to solve this and you
+ probably have already use it using the magic combination <userinput>
+ "./configure; make; make install"</userinput>.
+ You may have noticed that many files are involved in this build process;
+ globally all that stuff seems very complicated.
+ So what's happening when you compile such software ?
+ </para>
+ <sect2 id="build-autotools-inputs">
+ <title>Input files</title>
+ <para>
+ An <application>Autotools</application> project comes at least with
+ a configure script, named <filename>configure</filename>, and a
+ makefile template named <filename>Makefile.in</filename>. There is
+ normally, one <filename>Makefile.in</filename> in each directory
+ of the project. There are several other files used by an
+ <application>Autotools</application> project but they are not
+ stricly necessary or are generated automatically.
+ </para>
+ <tip>
+ If you look inside these files, you will see that they are quite complex.
+ Do not worry, these files are generated by <application>Autotools</application>
+ from other templates easier to write as explained in <xref linkend="create-autotools"/>.
+ For the moment, we do not care, we consider these files exist as it is the case
+ when you get a source package.
+ </tip>
+ </sect2>
+ <sect2 id="build-autotools-configure">
+ <title>Configure</title>
+ <para>
+ In fact, you don't need <application>Autotools</application> to build an
+ autotools package, <application>configure</application> is a shell script
+ running on the most basic shell: <filename>sh</filename>.
+ It probes your system checking each characteristic and writes
+ makefiles from the templates.
+ </para>
+ <important>
+ In order to build a project using a library, you need more information about it,
+ so additional files. For a library used in a C program, you need the
+ corresponding header files. This has to be installed on your system and is
+ typically found in a so called development package. By example for the
+ library <application>libxml2</application>, there are two packages:
+ <itemizedlist>
+ <listitem><filename>libxml2</filename> necessary to run a program
+ using it and installed automatically as a dependency of such
+ program.
+ </listitem>
+ <listitem>
+ <filename>libxml2-devel</filename> necessary to build a program
+ using it. If you don't have it <application>configure</application>
+ will display an error message.
+ </listitem>
+ </itemizedlist>
+ </important>
+ <figure>
+ <title>Configure process</title>
+ <imageobject>
+ <imagedata fileref="figures/configure-process.png" format="PNG"></imagedata>
+ </imageobject>
+ </figure>
+ <para>
+ <application>configure</application> creates all files in the directory where it is
+ called. This directory is the <emphasis>build directory</emphasis>. If you run it from
+ the source directory, using <userinput><emphasis>./</emphasis>configure</userinput>,
+ the build directory will be the same.
+ </para>
+ <para>
+ <application>configure</application> accepts several options in the command line.
+ They are used to install the files in different directories, to disable some parts of the
+ project in order to get a smaller executable or if you haven't one needed library or force
+ a value for some <application>make</application> variable (see <xref linkend="build-make-vars" />).
+ You can get a list of them by running <userinput>configure --help</userinput>.
+ Here is a list of the most common ones:
+
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term><parameter>--enable-maintainer-mode</parameter></term>
+ <listitem>Add extra rules useful when modifying the project source code</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>--help</parameter></term>
+ <listitem>List all available options</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>--host <replaceable>host</replaceable></parameter></term>
+ <listitem>Compile to run on another system (cross compilation)</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>--prefix <replaceable>dir</replaceable></parameter></term>
+ <listitem>Select the root directory for installing the project, default /usr/local</listitem>
+ </varlistentry>
+ </variablelist>
+ <note>
+ <application>configure</application> generates a few additional files which
+ are less important. <filename>config.log</filename> is a log file useful
+ when something goes wrong to get more details. <filename>config.status</filename>
+ is another shell script, it can be run to restore the current configuration.
+ <filename>config.h</filename> is a header file generated like <filename>Makefile</filename>
+ from a template <filename>config.h.in</filename> if it exists.
+ </note>
+ </sect2>
+ <sect2 id="build-autotools-make">
+ <title><application>make</application></title>
+ <para>
+ The makefiles generated by <application>configure</application> are quite
+ complex but are standard makefiles. They define all standard targets needed
+ by GNU standard.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <userinput>make</userinput> or <userinput>make all</userinput> builds the program.
+ </listitem>
+ <listitem>
+ <userinput>make install</userinput> installs the program.
+ </listitem>
+ <listitem>
+ <userinput>make distclean</userinput> removes all files generated by
+ <application>configure</application>, to let the project in the state
+ it was when unpacking the distribution package.
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+ <sect1 id="build-anjuta">
+ <title>Using <application>Anjuta</application></title>
+ <para>
+ Now, we will see the <application>Anjuta</application> interface allowing you to run all these commands
+ without using the command line.
+ </para>
+ <sect2 id="build-anjuta-configure">
+ <title>Configure</title>
+ <para>
+ As <application>Anjuta</application> is using <application>Autotools</application>,
+ the first step is similar, you need to run configure.
+ Select <menuchoice><guisubmenu>Build</guisubmenu>
+ <guimenuitem>Configure Project…</guimenuitem></menuchoice>, to get the
+ following dialog:
+ </para>
+ <figure>
+ <title>Configure dialog</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/configure-dialog.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ <para>
+ The <guilabel>Regenerate project</guilabel> checkbox will not be described
+ now as it is related to project creation (see in <xref linkend="create-autotools-generate"/>).
+ </para>
+ <para>
+ The <guilabel>Configuration</guilabel> field is an user name used to reference
+ this particular configuration to switch between different ones later. For
+ <application>Anjuta</application> each configuration corresponds to one build
+ directory and a set of configure options. <application>Anjuta</application> already
+ provides some default configurations that you can select here.
+ <note>
+ It is recommended to use the Debug configuration for debugging. It will
+ compile your program with all optimizations disabled.
+ When optimizations are enabled, some variables and functions are removed,
+ you will not be able to see them with the debugger. Moreover some lines in
+ your source code are re-ordered, so some steps will go backward.
+ </note>
+ </para>
+ <para>
+ The <guilabel>Build Directory</guilabel> field allow to select the directory
+ used to build the project. It must be different for each configuration.
+ </para>
+ <important>
+ If you build the project in the source directory (leaving the
+ <guilabel>Build Directory</guilabel> field empty), you cannot create a new
+ configuration. It is a limitation of <application>Autotools</application>.
+ You need to select <menuchoice><guisubmenu>Build</guisubmenu>
+ <guimenuitem>Remove Configuration</guimenuitem></menuchoice> that will run
+ <userinput>make distclean</userinput> in the source directory first.
+ </important>
+ <para>
+ The <guilabel>Configure Options</guilabel> field allow passing different options
+ to the configure script.
+ </para>
+ <para>
+ Clicking on <guibutton>Execute</guibutton> will run the configure script. All
+ the output will appears in the message view of <application>Anjuta</application>.
+ If the script runs without error, it will enable all other entries in the
+ <guisubmenu>Build</guisubmenu> menu.
+ </para>
+ </sect2>
+ <sect2 id="build-anjuta-menu">
+ <title>Menu items</title>
+ <para>
+ The build operations in <application>Anjuta</application>, rely on
+ <application>make</application> only like <application>Autotools</application>.
+ It is working for non <application>Autotools</application> project too.
+ The compile command is even working with only a C source file because
+ <application>make</application> has some builtin rules to compile them.
+ Here is the correspondence between the <application>Anjuta</application> menu
+ item and <application>make</application> commands.
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Compile</guimenu></menuchoice></term>
+ <listitem>make <replaceable>current_file</replaceable></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Build</guimenu></menuchoice></term>
+ <listitem>cd <userinput>current_file_directory</userinput>; make</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Build Project</guimenu></menuchoice></term>
+ <listitem>cd <userinput>project_directory</userinput>; make</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Build Tarball</guimenu></menuchoice></term>
+ <listitem>cd <userinput>project_directory</userinput>; make dist</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Install</guimenu></menuchoice></term>
+ <listitem>cd <userinput>current_file_directory</userinput>; make install</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Install Project</guimenu></menuchoice></term>
+ <listitem>cd <userinput>project_directory</userinput>; make install</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Clean</guimenu></menuchoice></term>
+ <listitem>cd <userinput>current_file_directory</userinput>; make clean</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Clean Project</guimenu></menuchoice></term>
+ <listitem>cd <userinput>project_directory</userinput>; make clean</listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><menuchoice><guisubmenu>Build</guisubmenu><guimenu>Remove Configuration</guimenu></menuchoice></term>
+ <listitem>cd <userinput>project_directory</userinput>; make distclean</listitem>
+ </varlistentry>
+ </variablelist>
+ <para>
+ The last menu entry not described above ,<menuchoice><guisubmenu>Build</guisubmenu>
+ <guimenuitem>Select Configuration</guimenuitem></menuchoice>, allows you
+ to switch easily between different configurations and so between different build
+ directories.
+ </para>
+ </sect2>
+ <sect2 id="build-anjuta-options">
+ <title>Options</title>
+ <para>
+ A few common build options are available in the preferences page that you can
+ get by selecting <menuchoice><guisubmenu>Edit</guisubmenu>
+ <guimenuitem>Preferences</guimenuitem><guimenuitem>Build autotools</guimenuitem>
+ </menuchoice>.
+ </para>
+ <figure>
+ <title>Build preferences</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/build_preferences.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ </sect2>
+ </sect1>
+
+</chapter>
+
+
+ <!-- Create -->
+<chapter id="create">
+ <title>Creating a project</title>
+ <para>
+ This chapter explains how to create a new project.
+ Like the previous, it starts with <application>Autotools</application>
+ before looking at <application>Anjuta</application>.
+ </para>
+ <sect1 id="create-autotools">
+ <title>Using <application>Autotools</application></title>
+ <para>
+ In the first chapter, we have not really used the <application>Autotools</application>.
+ It is not need to compile a project from the sources. But all files in the build process
+ are not written by hand but generated from templates using <application>Autotools</application>.
+ </para>
+ <para>
+ <application>Autotools</application> is composed of
+ several tools: <filename>aclocal</filename>, <filename>autoconf</filename>,
+ <filename>automake</filename> and other that we will not see here,
+ belonging to two packages: <application>Automake</application> and
+ <application>Autoconf</application>.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <application>Autoconf</application> is used to generate the configure script, from
+ a template named <filename>configure.ac</filename>. The configure script
+ will check all characteristics of the host system and generate the makefiles from
+ Makefile.in templates.
+ </listitem>
+ <listitem>
+ <application>Automake</application> is used to generate complete Makefile.in
+ templates, following GNU standards from very simple Makefile.am templates.
+ </listitem>
+ </itemizedlist>
+ <figure>
+ <title><application>Autotools</application> process</title>
+ <imageobject>
+ <imagedata fileref="figures/autotools-process.png" format="PNG"></imagedata>
+ </imageobject>
+ </figure>
+ <para>
+ Now let's see a minimal example to start grasping the relationships between the various
+ files.
+ </para>
+ <sect2 id="create-autotools-source">
+ <title>Write sources</title>
+ <orderedlist>
+ <listitem>
+ Create an empty directory called <filename>tut_prog</filename> and enter in it.
+ </listitem>
+ <listitem>
+ In this new directory, create a new file named <filename>main.c</filename>
+ containing:
+ </listitem>
+ </orderedlist>
+ <example>
+ <title>main.c:</title>
+ <programlisting role="C">
+<![CDATA[#include <stdio.h> ]]>
+
+int main()
+{
+ printf("Hello world!\n");
+ return 0;
+}</programlisting>
+ </example>
+ </sect2>
+ <sect2 id="create-autotools-autoconf">
+ <title>Run <application>Autoconf</application></title>
+ <orderedlist continuation="continues">
+ <listitem>
+ Write the following in a file named <filename>configure.ac</filename>:
+ </listitem>
+ </orderedlist>
+ <example>
+ <title>minimal configure.ac:</title>
+ <programlisting>
+AC_INIT([Tutorial Program], 1.0)
+AM_INIT_AUTOMAKE
+AC_PROG_CC
+AC_CONFIG_FILES(Makefile)
+AC_OUTPUT</programlisting>
+ </example>
+ <note>
+ The configure template script could be named <filename>configure.in</filename>.
+ It is the name used in older version (before 2001) of <application>Autoconf</application>.
+ Nevertheless, it is recommended to use <filename>configure.ac</filename> because the
+ <filename>.in</filename> extension
+ is already used by files processed by <application>configure</application> and
+ generated by <application>Automake</application>:
+ <filename>Makefile.in</filename> and <application>autoheader</application>:
+ <filename>config.h.in</filename>.
+ </note>
+ <para>
+ AC_INIT, AM_INIT_AUTOMAKE, etc... are <application>M4</application> macros.
+ <application>M4</application> is a macro expanding software
+ used by <application>Autotools</application>; we don't need to know about it. When
+ <application>Autoconf</application> will process
+ this configure.in, the macros will be expanded and we will get a fresh huge configure script.
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>AC_INIT</term>
+ <listitem>
+ <para>
+ Is the first mandatory macro. We need to indicate
+ the name of the project and its version.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AM_INIT_AUTOMAKE</term>
+ <listitem>
+ <para>
+ Initialize environment for <application>Automake</application>.
+ It is needed in all projects using <application>Automake</application>.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_PROG_CC</term>
+ <listitem>
+ <para>
+ Determine the C compiler to use.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_CONFIG_FILES</term>
+ <listitem>
+ <para>
+ Create each file by copying the corresponding template file (with .in extension)
+ and substituting the output variable values.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_OUTPUT</term>
+ <listitem>
+ <para>
+ Marks the end of the configure template.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <note>
+ The use of some macros has changed between different versions of <application>Autoconf</application>:
+ <itemizedlist>
+ <listitem>
+ The package name and version was defined as arguments of
+ AM_INIT_AUTOMAKE instead of AC_INIT.
+ </listitem>
+ <listitem>
+ AC_OUTPUT was getting the list of generated files instead of
+ using the additional macro AC_CONFIG_FILES.
+ </listitem>
+ </itemizedlist>
+ </note>
+ <para>
+ <application>Autoconf</application> only knows its own macros but read additional
+ ones in a file named <filename>aclocal.m4</filename>. These macros are used to
+ extend <application>Autoconf</application>, it includes <application>Automake</application>
+ macro (starting with AM_) and other third party macros.
+ For instance, if you develop a library called foo, you might want to write an AC_CHECK_FOR_FOO
+ macro so that developers using your library can check for its presence using
+ <application>Autoconf</application>.
+ </para>
+ <para>
+ <application>aclocal</application> scans <filename>configure.ac</filename> and
+ create an <filename>aclocal.m4</filename> file which contains the macros mentioned
+ in <filename>configure.ac</filename>.
+ <application>aclocal</application> is part of the <application>Automake</application>
+ package and search by default in <application>Automake</application> macros and
+ in a system path typically <filename>/usr/share/aclocal</filename>.
+ </para>
+ <orderedlist continuation="continues">
+ <listitem>
+ Launch <userinput>aclocal</userinput>. It will create a new file named
+ <filename>aclocal.m4</filename> in the current directory.
+ </listitem>
+ <listitem>
+ Launch <userinput>autoconf</userinput>. It will create the configure
+ script <filename>configure</filename>.
+ </listitem>
+ </orderedlist>
+ <tip>
+ On my system, I actually get an extra directory called <filename>autom4te.cache</filename>.
+ That is for <application>Autoconf</application> internal purposes. You do not need
+ to care about it.
+ </tip>
+ </sect2>
+ <sect2 id="create-autotools-automake">
+ <title>Run <application>Automake</application></title>
+ <orderedlist continuation="continues">
+ <listitem>
+ Write the following in a file named <filename>Makefile.am</filename>:
+ </listitem>
+ </orderedlist>
+ <example>
+ <title>minimal Makefile.am:</title>
+ <programlisting>
+bin_PROGRAMS = tut_prog
+tut_prog_SOURCES = main.c</programlisting>
+ </example>
+ <para>
+ In Makefile.am are the very essential data needed to build the project:
+ the target program, called tut_prog, will be put in a $prefix/bin/ directory;
+ to build it we need main.c. Note that we don't specify <emphasis>how</emphasis>
+ that will be built: <application>Automake</application> will figure it out.
+ We haven't even mentioned the compiler in this pre-makefile.
+ </para>
+ <para>
+ Makefile.am will be processed by <application>Automake</application>;
+ the result will be a Makefile.in.
+ This Makefile.in is close to being a real makefile, but it contains variable names which
+ will be replaced when the configure script will run, resulting in a real makefile
+ (called Makefile). For instance, <filename>configure</filename> will write in the
+ final Makefile what compiler
+ to use (it is the compiler it found using the AC_PROG_CC macro).
+ </para>
+ <orderedlist continuation="continues">
+ <listitem>
+ Run the command <userinput>automake --add-missing --foreign</userinput>. It will create
+ a new file named <filename>Makefile.in</filename> as expected. Moreover, due to the
+ switch <parameter>--add-missing</parameter> you get a few
+ links to scripts necessary for building the project:
+ <filename>depcomp</filename>, <filename>install.sh</filename> and <filename>missing</filename>.
+ The other option <parameter>--foreign</parameter> tells to
+ <application>Automake</application> that you don't want to follow GNU standard and you
+ don't need mandatory documentation files: <filename>INSTALL</filename>,
+ <filename>NEWS</filename>, <filename>README</filename>, <filename>AUTHORS</filename>,
+ <filename>ChangeLog</filename> and <filename>COPYING</filename>. I have used it here
+ to keep the number of created file to a minimum but else it is a good idea to
+ provide these files, you can start with empty files.
+ </listitem>
+ </orderedlist>
+ </sect2>
+ <sect2 id="create-autotools-build">
+ <title>Build project</title>
+ <orderedlist continuation="continues">
+ <listitem>
+ Run now the new configure script: <userinput>./configure</userinput>. You get
+ the following output and it create the makefile for your program.
+ <screen>
+checking for a BSD-compatible install... /usr/bin/install -c
+checking whether build environment is sane... yes
+checking for a thread-safe mkdir -p... /bin/mkdir -p
+checking for gawk... gawk
+checking whether make sets $(MAKE)... yes
+checking for gcc... gcc
+checking for C compiler default output file name... a.out
+checking whether the C compiler works... yes
+checking whether we are cross compiling... no
+checking for suffix of executables...
+checking for suffix of object files... o
+checking whether we are using the GNU C compiler... yes
+checking whether gcc accepts -g... yes
+checking for gcc option to accept ISO C89... none needed
+checking for style of include used by make... GNU
+checking dependency style of gcc... gcc3
+configure: creating ./config.status
+config.status: creating Makefile
+config.status: executing depfiles commands</screen>
+ </listitem>
+ <listitem>
+ Run now <userinput>make</userinput>, to build your program. You get the following
+ output and a new tut_prog executable
+ <screen>
+gcc -DPACKAGE_NAME=\"Tutorial\ Program\" -DPACKAGE_TARNAME=\"tutorial-program\" \
+ -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"Tutorial\ Program\ 1.0\" \
+ -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"tutorial-program\" -DVERSION=\"1.0\" \
+ -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
+main.c: In function âmainâ:
+main.c:5: warning: return type of âmainâ is not âintâ
+mv -f .deps/main.Tpo .deps/main.Po
+gcc -g -O2 -o tut_prog main.o</screen>
+ </listitem>
+ <listitem>
+ Now, if you can write in <filename>/usr/local/bin</filename>, run
+ <userinput>make install</userinput> to install your program. Else you need to
+ log as root before or use <application>sudo</application> and run
+ <userinput>sudo make install</userinput>.
+ You should get.
+ <screen>
+make[1]: Entering directory `/home/seb/Projects/Tutorial'
+test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"
+ /usr/bin/install -c 'tut_prog' '/usr/local/bin/tut_prog'
+make[1]: Nothing to be done for `install-data-am'.
+make[1]: Leaving directory `/home/seb/Projects/Tutorial'</screen>
+ <para>
+ Then, if <filename>/user/local/bin</filename> is in your path, you can run
+ your program from everywhere.
+ </para>
+ </listitem>
+ </orderedlist>
+ </sect2>
+ <sect2 id="create-autotools-clean">
+ <title>Clean project</title>
+ <orderedlist continuation="continues">
+ <listitem>
+ The program is installed, so you can clean the build directory running
+ <userinput>make clean</userinput>. It removes all object files and the
+ program but not the makefiles.
+ <screen>
+test -z "tut_prog" || rm -f tut_prog
+rm -f *.o</screen>
+ <para>
+ You can still run the program installed in <filename>/user/local/bin</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ To remove the installed program, run <userinput>make uninstall</userinput>.
+ Like for the installation, you need to use have the writing right in the
+ directory or use <application>su</application> or <application>sudo</application>.
+ <screen>
+rm -f '/usr/local/bin/tut_prog'</screen>
+ </listitem>
+ </orderedlist>
+ </sect2>
+ <sect2 id="create-autotools-generate">
+ <title>Generate project</title>
+ <para>
+ Running <userinput>aclocal</userinput>, <userinput>automake</userinput> and
+ <userinput>autoconf</userinput> one by one is fine for a tutorial to
+ understand exactly what's happen. But, for a real work, it's a bit tedious
+ especially because there are other tools those could be needed like
+ <userinput>autoheader</userinput>, <userinput>autopoint</userinput>
+ or <userinput>libtoolize</userinput>. After creating the project, the
+ makefiles generated by <application>configure</application> should take
+ care of regenerating <filename>configure</filename> and all
+ <filename>Makefile.in</filename>. Anyway, this lets a room for improvement
+ and there are even two responses to this:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>autoreconf</term>
+ <listitem>
+ It is another tool part of the <application>Autoconf</application> package
+ which is running all scripts in the right order. To start a new project, you
+ can just run <userinput>autoreconf --install</userinput> and it will call
+ all necessary commands.
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>autogen.sh</term>
+ <listitem>
+ It is a script not part of <application>Autotools</application>, that it doing
+ the same thing. There is one named <filename>gnome-autogen.sh</filename> which
+ comes with GNOME common development package but other project can write their
+ own ones.
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+ </sect1>
+ <sect1 id="create-anjuta">
+ <title>Using <application>Anjuta</application></title>
+ <para>
+ Creating a project with <application>Anjuta</application> need just a few clicks but then we will
+ take a look at the created files.
+ </para>
+ <sect2 id="create-anjuta-new">
+ <title>Create a new project</title>
+ <orderedlist>
+ <listitem>
+ Click on <menuchoice><guisubmenu>File</guisubmenu><guisubmenu>New</guisubmenu>
+ <guimenuitem>Project</guimenuitem></menuchoice>. The new project assistant
+ appears.
+ </listitem>
+ <listitem>
+ Click on <guibutton>Forward</guibutton>. The project selection page appears:
+ <figure>
+ <title>Project selection page</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/new-project-select.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ </listitem>
+ <listitem>
+ Select <guilabel>Generic (minimal)</guilabel> project in the <guilabel>C</guilabel> page.
+ </listitem>
+ <listitem>
+ Click on <guibutton>Forward</guibutton>.
+ <figure>
+ <title>Project basic information page</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/new-project-basic.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ <para>
+ Change <guilabel>Project Name</guilabel> to <userinput>tutprog</userinput>, the
+ project name should contains only alpha numeric characters or underscore.
+ Fill the remaining field.
+ </para>
+ </listitem>
+ <listitem>
+ Click on <guilabel>Forward</guilabel>.
+ <figure>
+ <title>Project options page</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/new-project-options.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ <para>
+ Click on <guilabel>Destination</guilabel> and create a new directory named tutprog
+ for your new project. You need to avoid space in the directory name. Then, keep
+ all other options to their default value to get a minimal project.
+ </para>
+ </listitem>
+ <listitem>
+ Click on <guibutton>Forward</guibutton>.
+ <figure>
+ <title>Project summary page</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/new-project-summary.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ <para>
+ This is the final page of the assistant, check that everything is right.
+ </para>
+ </listitem>
+ <listitem>
+ Click on <guibutton>Forward</guibutton>. <application>Anjuta</application> will
+ create all needed files and directories, in the message window,
+ you will see the following:
+ <figure>
+ <title>Project creation messages</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/new-project-message.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ <para>
+ Then, autogen.sh is called and run the configure script. Finally <application>Anjuta</application>
+ open the new project.
+ You can directly build the project, as the main source contains a few lines of C and configure
+ has been run.
+ </para>
+ </listitem>
+ </orderedlist>
+ </sect2>
+ <sect2 id="create-anjuta-configure">
+ <title>Looking at configure.ac</title>
+ <example>
+ <title><application>Anjuta</application> minimal configure.ac:</title>
+ <programlisting>
+dnl Process this file with autoconf to produce a configure script.
+dnl Created by Anjuta application wizard.
+
+AC_INIT(tutprog, 0.1)
+
+AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
+AC_CONFIG_HEADERS([config.h])
+AM_MAINTAINER_MODE
+
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+AC_HEADER_STDC
+
+AC_OUTPUT([
+Makefile
+])</programlisting>
+ </example>
+ <para>
+ It is still quite simple with a bit more macros. Let's look at all
+ unknown ones:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>dnl</term>
+ <listitem>
+ <para>
+ It is not a macros, just the marker to start a comment in
+ <application>M4</application>, the language used to write <filename>configure.ac</filename>.
+ It is like '#' is scripts or '//' in C++.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AM_INIT_AUTOMAKE</term>
+ <listitem>
+ <para>
+ The AC_INIT macro uses the new form with package and version but
+ AM_INIT_AUTOMAKE keeps the old one. It is not needed anymore.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_CONFIG_HEADERS</term>
+ <listitem>
+ <para>
+ This tells <application>Autoconf</application> to pass all defines in a
+ file named <filename>config.h</filename>
+ instead of using several -Dxxxx flags on the command line (see
+ <xref linkend="create-autotools-build"/>). It is easier when there are lots
+ of them. A file named <filename>config.h.in</filename> is created automatically
+ from the <filename>configure.ac</filename> using <application>autoheader</application>.
+ Then <filename>config.h</filename> is created automatically like makefiles by
+ <application>configure</application>. So it is painless for the developer.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AM_MAINTAINER_MODE</term>
+ <listitem>
+ <para>
+ By default the makefiles created by <application>Automake</application> have rules to rerun
+ <application>Automake</application> or <application>Autoconf</application>
+ when needed: if <filename>configure.ac</filename> or <filename>Makefile.am</filename>
+ are modified. By using this macro, you disable this feature. So
+ <filename>configure.ac</filename> and all <filename>Makefile.am</filename> will
+ never be erased, even if you get a problem with the date of some files which
+ could be better for an user, someone compiling the project without modifying it. A
+ developer, someone modifying the project, needs these rules and has to
+ run configure with --enable-maintainer-mode to keep those.
+ The real interest of this macro is debatable.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_ISC_POSIX</term>
+ <listitem>
+ <para>
+ A bit obscure feature, adding one options to support posix compatibility on
+ some targets.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AM_PROG_CC_STDC</term>
+ <listitem>
+ <para>
+ Try to add an option to the C compiler in order to make it run as ANSI C.
+ I suppose that really few compiler need this, as ANSI C is really basic
+ nowadays. Moreover, this option is now implemented by AC_PROG_CC so it is not
+ needed anymore.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_HEADER_STDC</term>
+ <listitem>
+ <para>
+ Check for some standard C header files. Most C compilers provide this
+ now, so it's not really needed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AC_OUTPUT</term>
+ <listitem>
+ <para>
+ This is the old form of the AC_OUTPUT, where you specify all output files
+ instead of using AC_CONFIG_FILES.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+ <sect2 id="create-anjuta-makefile">
+ <title>Looking at Makefile.am</title>
+ <example>
+ <title><application>Anjuta</application> minimal Makefile.am:</title>
+ <programlisting>## Process this file with automake to produce Makefile.in
+## Created by Anjuta
+
+AM_CPPFLAGS = \
+ -DPACKAGE_DATA_DIR=\""$(datadir)"\"
+
+AM_CFLAGS =\
+ -Wall\
+ -g
+
+bin_PROGRAMS = tutprog
+
+tutprog_SOURCES = \
+ main.c
+
+tutprog_LDFLAGS =
+
+tutprog_LDADD =</programlisting>
+ </example>
+ <para>
+ Not much things in the <filename>Makefile.am</filename> neither:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>AM_CPPFLAGS</term>
+ <listitem>
+ <para>
+ It is used to give additional flags to the C preprocessor. Here
+ it defines an additional PACKAGE_DATA_DIR constant set by
+ <application>configure</application>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>AM_CFLAGS</term>
+ <listitem>
+ <para>
+ It defines some additional flags for the C compiler: all
+ warning and add debugging information that we have already
+ seen at the beginning of this tutorial (see <xref linkend="build-gcc"/>)
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tutprog_LDFLAGS</term>
+ <listitem>
+ <para>
+ It adds a places where you can put additional linker options for
+ the tutprog program.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tutprog_LDADD</term>
+ <listitem>
+ <para>
+ It adds a places where you can put additional libraries for
+ the tutprog program.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!-- Add library -->
+<chapter id="library">
+ <title>Adding a library</title>
+ <para>
+ This chapter explains how to add a new library to a project. It
+ starts with <application>Autotools</application> before looking at <application>Anjuta</application>.
+ </para>
+ <sect1 id="library-autotools">
+ <title>Using <application>Autotools</application></title>
+ <para>
+ Adding a new library in a autotools project could be more or less
+ easy depending on how the library is packaged. To take an example,
+ imagine that we want to read an xml file using <application>libxml2</application>
+ (see its <ulink type="http" url="www.xmlsoft.org">homepage at www.xmlsoft.org</ulink>)
+ </para>
+ <orderedlist>
+ <listitem>
+ Open the old tutorial project and replace <filename>main.c</filename> by the
+ following.
+ <example>
+ <title>main.c using <application>libxml2</application>:</title>
+ <programlisting role="C">
+#include <libxml/parser.h>
+#include <stdio.h>
+
+int main()
+{
+ xmlDocPtr doc;
+ doc = xmlParseFile ("testfile.xml");
+
+ if (doc == NULL) {
+ printf ("Document not parsed successfully. \n");
+ return -1;
+ }
+ else {
+ printf ("Document parsed successfully.\n");
+ xmlFreeDoc(doc);
+ return 0;
+ }
+}</programlisting>
+ </example>
+ </listitem>
+ </orderedlist>
+ <para>
+ Our goal is now to compile it and make it work correctly. For that purpose, we must
+ tell <application>GCC</application> two things: where to find libxml/parser.h
+ (that is to say, give <application>GCC</application>
+ the right include path) and what library (i.e. shared object) it should link
+ our project against. There are several ways to do that, I will start with the easiest.
+ </para>
+ <sect2 id="library-autotools-pkgconfig">
+ <title>With pkg-config</title>
+ <para>
+ <application>pkg-config</application> is tools for developers
+ providing a unified interface for querying installed libraries
+ with their version and all options needed to compile and link it.
+ It comes with an <application>Autoconf</application> macro
+ named PKG_CHECK_MODULES allowing to check the existence of
+ the library and set all necessary flags.
+ </para>
+ <orderedlist>
+ <listitem>
+ Add the following line in <filename>configure.ac</filename>.
+ <programlisting>PKG_CHECK_MODULES(XML, libxml-2.0 >= 2.4)</programlisting>
+ <para>
+ This macro will check the existence of <application>libxml2</application> with a version higher or
+ equal to 2.4 and create 2 variable XML_CFLAGS and XML_LIBS containing
+ respectively, the flags for the C compiler and the linker. <userinput>XML</userinput> is
+ an user defined name. <userinput>libxml-2.0</userinput> is the name of the library. You can
+ run <userinput>pkg-config --list-all</userinput> to get a list of
+ all installed libraries.
+ </para>
+ </listitem>
+ <listitem>
+ Add the following lines in <filename>Makefile.am</filename>.
+ <programlisting>tut_prog_CPPFLAGS = $(XML_CFLAGS)
+tut_prog_LDFLAGS= $(XML_LIBS)</programlisting>
+ <para>
+ This will use the options found by <application>configure</application>
+ when the macro PKG_CHECK_MODULES is executed for compiling your program.
+ </para>
+ </listitem>
+ <listitem>
+ That's all. You can run <userinput>make</userinput> again.
+ <screen>
+cd . && /bin/sh /home/seb2008.1/Projects/tutprog/missing --run aclocal-1.10
+cd . && /bin/sh /home/seb2008.1/Projects/tutprog/missing --run automake-1.10 --foreign
+cd . && /bin/sh /home/seb2008.1/Projects/tutprog/missing --run autoconf
+/bin/sh ./config.status --recheck
+running CONFIG_SHELL=/bin/sh /bin/sh ./configure --enable-maintainer-mode --no-create --no-recursion
+checking for a BSD-compatible install... /usr/bin/install -c
+checking whether build environment is sane... yes
+checking for a thread-safe mkdir -p... /bin/mkdir -p
+checking for gawk... gawk
+checking whether make sets $(MAKE)... yes
+checking whether to enable maintainer-specific portions of Makefiles... yes
+checking for style of include used by make... GNU
+checking for gcc... gcc
+checking for C compiler default output file name... a.out
+checking whether the C compiler works... yes
+checking whether we are cross compiling... no
+checking for suffix of executables...
+checking for suffix of object files... o
+checking whether we are using the GNU C compiler... yes
+checking whether gcc accepts -g... yes
+checking for gcc option to accept ISO C89... none needed
+checking dependency style of gcc... gcc3
+checking for library containing strerror... none required
+checking for gcc... (cached) gcc
+checking whether we are using the GNU C compiler... (cached) yes
+checking whether gcc accepts -g... (cached) yes
+checking for gcc option to accept ISO C89... (cached) none needed
+checking dependency style of gcc... (cached) gcc3
+checking for gcc... (cached) gcc
+checking whether we are using the GNU C compiler... (cached) yes
+checking whether gcc accepts -g... (cached) yes
+checking for gcc option to accept ISO C89... (cached) none needed
+checking dependency style of gcc... (cached) gcc3
+checking how to run the C preprocessor... gcc -E
+checking for grep that handles long lines and -e... /bin/grep
+checking for egrep... /bin/grep -E
+checking for ANSI C header files... yes
+checking for pkg-config... /usr/bin/pkg-config
+checking pkg-config is at least version 0.9.0... yes
+checking for XML... yes
+configure: creating ./config.status
+ /bin/sh ./config.status
+config.status: creating Makefile
+config.status: creating config.h
+config.status: config.h is unchanged
+config.status: executing depfiles commands
+cd . && /bin/sh /home/seb2008.1/Projects/tutprog/missing --run autoheader
+rm -f stamp-h1
+touch config.h.in
+cd . && /bin/sh ./config.status config.h
+config.status: creating config.h
+config.status: config.h is unchanged
+make all-am
+make[1]: Entering directory `/home/seb/Projects/tutprog'
+gcc -DHAVE_CONFIG_H -I. -DPACKAGE_DATA_DIR=\""/usr/local/share"\" -I/usr/include/libxml2 \
+ -Wall -g -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
+mv -f .deps/main.Tpo .deps/main.Po
+gcc -Wall -g -g -O2 -o tutprog main.o -lxml2
+make[1]: Leaving directory `/home/seb/Projects/tutprog'</screen>
+ <para>
+ There is no need to rerun <application>Autoconf</application> or
+ <application>Automake</application> because the Makefile generated
+ by it already contains some rules to do it.
+ </para>
+ </listitem>
+ </orderedlist>
+ <tip>
+ When installed, each library supporting pkg-config copy a small text file,
+ with .pc extension, in a system directory; normally
+ <filename>/usr/lib/pkgconfig</filename>. If you install a library from
+ source it will be by default in <filename>/usr/local/lib/pkgconfig</filename>.
+ You can ask <application>pkg-config</application> to search in this
+ directory too, by defining the environment variable <userinput>
+ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig</userinput>.
+ </tip>
+ </sect2>
+ <sect2 id="library-autotools-m4">
+ <title>With an <application>Autoconf</application> macro</title>
+ <para>
+ If the library does not support <application>pkg-config</application>: it does not
+ appear in the list returned by <userinput>pkg-config --list-all</userinput>.
+ You need a <application>Autoconf</application> macro:
+ <itemizedlist>
+ <listitem>
+ Check if the library author shipped a <application>M4</application> macro, and use
+ it if present. It is a text file named like the library with a .m4 extension
+ often installed in <filename>/usr/share/aclocal</filename>.
+ </listitem>
+ <listitem>
+ If your library is a basic one, it might be checked
+ by the standard <application>Autoconf</application> macros (see the list
+ <ulink type="http" url="http://sources.redhat.com/autobook/autobook/autobook_283.html#SEC283">
+ here</ulink>).
+ </listitem>
+ <listitem>Perhaps the <application>M4</application> macro you need has already be programmed by someone
+ else. Look at the contributions <ulink type="http" url="http://www.gnu.org/software/ac-archive/">here</ulink>.
+ </listitem>
+ <listitem>
+ If all that fail, go deeper in <application>M4</application>, make your own macro, and
+ donate it to the library's author !
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ When, you have this macro, you can copy it in <filename>/usr/share/aclocal</filename>, so
+ <application>aclocal</application> will find it. Then, you just need to look in the
+ macro file to see how to use it. <application>libxml2</application> installs
+ a macro named AM_PATH_XML2 which is in <filename>/usr/share/aclocal/libxml.m4</filename>.
+ </para>
+ <orderedlist>
+ <listitem>
+ Add the following line in <filename>configure.ac</filename>.
+ <programlisting>AM_PATH_XML2(2.4.0)</programlisting>
+ <para>
+ This macro will check the existence of the library with a version higher or
+ equal to 2.4 and create 2 variable XML_CPPFLAGS and XML_LIBS containing
+ respectively, the flags for the C compiler and the linker. You get these
+ information from the comments in the macro file.
+ </para>
+ </listitem>
+ <listitem>
+ Add the following lines in <filename>Makefile.am</filename>.
+ <programlisting>tut_prog_CPPFLAGS = $(XML_CPPFLAGS)
+tut_prog_LDFLAGS= $(XML_LIBS)</programlisting>
+ <para>
+ This will use the options found by configure for compiling your program. Note that
+ the macro defined XML_CPPFLAGS instead of XML_CFLAGS with <application>pkg-config</application>.
+ Using CPPFLAGS makes more sense, because these flags are used by the C preprocessor,
+ most of the time only to setup the path of the include files.
+ </para>
+ </listitem>
+ <listitem>
+ That's all. You can run <userinput>make</userinput> again. The generated
+ <filename>Makefile</filename> is almost the same.
+ </listitem>
+ </orderedlist>
+ </sect2>
+ <sect2 id="library-autotools-lame">
+ <title>With hardcoded library path</title>
+ <para>
+ It is the approach one could naturally have: let's give <application>GCC</application> the stuff
+ it needs directly ! On my system, <filename>libxml/parser.h</filename>
+ is in <filename classs="directory">/usr/include/libxml2</filename>, and
+ the shared object is 'libxml.so', located in <filename>/usr/lib</filename>.
+ (I will assume it's all the same for you).
+ </para>
+ <orderedlist>
+ <listitem>
+ Add the following lines in <filename>Makefile.am</filename>.
+ <programlisting>tut_prog_CPPFLAGS = -I /usr/include/libxml2
+tut_prog_LDFLAGS= -lxml2</programlisting>
+ <para>
+ There is no need to change <filename>configure.ac</filename> because you don't
+ check anything and just assume that all host system will have the right
+ library in the same place than you.
+ </para>
+ </listitem>
+ <listitem>
+ You can run <userinput>make</userinput> and it should work if you have the same
+ system than me.
+ <screen>
+ cd . && /bin/sh /home/seb2008.1/Projects/tutprog/missing --run automake-1.10 --foreign Makefile
+ cd . && /bin/sh ./config.status Makefile depfiles
+config.status: creating Makefile
+config.status: executing depfiles commands
+make all-am
+make[1]: Entering directory `/home/seb/Projects/tutprog'
+gcc -DHAVE_CONFIG_H -I. -DPACKAGE_DATA_DIR=\""/usr/local/share"\" -I /usr/include/libxml2 \
+ -Wall -g -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
+mv -f .deps/main.Tpo .deps/main.Po
+gcc -Wall -g -g -O2 -o tutprog main.o -lxml2
+make[1]: Leaving directory `/home/seb/Projects/tutprog'</screen>
+ </listitem>
+ </orderedlist>
+ <para>
+ I have described this here to show that it is possible to do
+ simple thing using <application>Autotools</application>. But this
+ approach has several drawbacks:
+ <itemizedlist>
+ <listitem>
+ It is not portable to various linuxes: perhaps on other
+ distribution the include path is different.
+ </listitem>
+ <listitem>
+ If the next versions of libxml have different paths,
+ or different needed libraries, we will need to update the project.
+ </listitem>
+ <listitem>
+ We don't test whether the system of the packager/user has
+ the library.
+ </listitem>
+ <listitem>
+ We cannot check the version of the <application>libxml2</application> we use.
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect2>
+ </sect1>
+ <sect1 id="library-anjuta">
+ <title>Using <application>Anjuta</application></title>
+ <para>
+ With <application>Anjuta</application> adding a library supporting
+ <application>pkg-config</application> can be almost done without the keyboard.
+ </para>
+ <sect2 id="library-anjuta-pkgconfig">
+ <title>With pkg-config</title>
+ <orderedlist>
+ <listitem>
+ Open the file <filename>main.c</filename> of the <application>Anjuta</application>
+ project created in the previous chapter. Replace it with the following text:
+ <example>
+ <title>main.c using <application>libxml2</application>:</title>
+ <programlisting role="C">
+#include <libxml/parser.h>
+#include <stdio.h>
+
+int main()
+{
+ xmlDocPtr doc;
+ doc = xmlParseFile ("testfile.xml");
+
+ if (doc == NULL) {
+ printf ("Document not parsed successfully. \n");
+ return -1;
+ }
+ else {
+ printf ("Document parsed successfully.\n");
+ xmlFreeDoc(doc);
+ return 0;
+ }
+}</programlisting>
+ </example>
+ </listitem>
+ <listitem>
+ Select <menuchoice><guisubmenu>Project</guisubmenu>
+ <guimenuitem>Properties</guimenuitem><guilabel>Packages</guilabel></menuchoice>, to get the
+ package properties dialog.
+ </listitem>
+ <listitem>
+ Click on <guibutton>Add module</guibutton> button and Enter a name
+ in the <guilabel>Module/Package</guilabel> column, "XML" by example.
+ </listitem>
+ <listitem>
+ Click on <guibutton>Add Package</guibutton> button that should be enabled
+ now. You get the a dialog where you can select the library that you want to
+ use. This dialog list all libraries supporting <application>pkg-config</application>.
+ Select <userinput>libxml-2.0</userinput>. Then click on <guibutton>Add</guibutton> button.
+ </listitem>
+ <listitem>
+ <para>
+ The package properties dialog should look like the following:
+ </para>
+ <figure>
+ <title>Project package properties dialog</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/library-add-pkgconfig.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ <para>
+ The module XML contains one library named libxml-2.0. You can define a minimum version
+ required by clicking in the version column and writing <userinput>>= 2.4</userinput>.
+ All this operation add the necessary lines in the file <filename>configure.ac</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ Close the dialog and select <menuchoice><guisubmenu>Project</guisubmenu>
+ <guimenuitem>Refresh</guimenuitem></menuchoice>. This should not be needed but is
+ necessary with the current version of <application>Anjuta</application>.
+ This bug has already been reported (#541694) and will be fixed soon
+ </listitem>
+ <listitem>
+ In the project view, select the project target tutprog and click on right button to
+ get a context menu and select Properties. You will get the target properties dialog.
+ </listitem>
+ <listitem>
+ <para>
+ This dialog will list all modules available in your project, just check the XML
+ module. This will modify the file <filename>Makefile.am</filename> to use the
+ right library.
+ </para>
+ <figure>
+ <title>Target properties dialog</title>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/library-add-properties.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </screenshot>
+ </figure>
+ </listitem>
+ <listitem>
+ Click on <guibutton>Close</guibutton> and that's all. You can select
+ <menuchoice><guisubmenu>Build</guisubmenu>
+ <guimenuitem>Build</guimenuitem></menuchoice> to rebuild your project.
+ </listitem>
+ </orderedlist>
+ </sect2>
+ <sect2 id="library-anjuta-pkgconfig">
+ <title>Without pkg-config</title>
+ <para>
+ <application>Anjuta</application> has no real support for library not
+ using <application>pkg-config</application>.
+ You need to edit the <filename>configure.ac</filename> directly to add all necessary
+ macros. For passing flags to each target you can select the
+ <guibutton>Advanced</guibutton> button in the target properties dialog.
+ </para>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!-- Resources -->
+<chapter id="resources">
+ <title>Resources</title>
+ <para> Here are some links to reference documents dealing with <application>Autotools</application>
+ in general and <application>Autoconf</application> and <application>Automake</application> in particular.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>English</term>
+
+ <listitem>First, you can take a look at the
+ <ulink type="http" url="http://www.gnu.org/software/autoconf/manual/autoconf.html">
+ Autoconf</ulink>,
+ <ulink type="http" url="http://www.gnu.org/software/automake/manual/automake.html">
+ Automake</ulink>,
+ <ulink type="http" url="http://www.gnu.org/software/libtool/manual/libtool.html">
+ Libtool</ulink>,
+ <ulink type="http" url="http://www.gnu.org/software/make/manual/make.html">
+ make</ulink> and
+ <ulink type="http" url="http://www.gnu.org/software/m4/manual/m4.html">
+ M4</ulink>
+ manuals.
+ </listitem>
+
+ <listitem>
+ The <ulink type="http" url="http://sources.redhat.com/autobook/autobook/autobook_toc.html">
+ Autobook</ulink> explains in details how the <application>Autotools</application> work.
+ </listitem>
+
+ <listitem>
+ Amongst the various GNU development tools you are told about,
+ <ulink type="http" url="http://autotoolset.sourceforge.net/tutorial.html">
+ here</ulink> are <application>Autoconf</application> and <application>Automake</application>.
+ </listitem>
+
+ <listitem>
+ <ulink url="http://www.lrde.epita.fr/~adl/autotools.html">Here</ulink>
+ and <ulink url="http://seul.org/docs/autotut/">here</ulink>
+ are two other tutorials about <application>Autotools</application>.
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>French</term>
+ <listitem><para><ulink type="http" url="http://www.infres.enst.fr/~dax/polys/configure/slide1.html">
+ Here</ulink> are some slides by a teacher from Ecole Nationale SupÃrieure des TÃlecoms
+ about the <application>Autotools</application>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Japanese</term>
+ <listitem>
+ <ulink type="http" url="http://larse-gtk.hp.infoseek.co.jp/automake.html">
+ A tutorial about <application>Autoconf</application> and <application>Automake</application>
+ </ulink>.</listitem>
+ </varlistentry>
+ </variablelist>
+ <tip>
+ This tutorial uses <application>Autoconf 2.61 (November 2006)</application> and
+ <application>Automake 1.10.1 (January 2008)</application>.
+ Some of these documentations uses older versions. the syntaxes could have changed quite a bit.
+ These old syntaxes usually still work and are used in old project.
+ It is useful to know them but it is a bad idea to use them in a new project.
+ </tip>
+</chapter>
+</book>
Added: trunk/manuals/anjuta-build-tutorial/C/autotools-process.dia
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/compilation-stages.dia
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/configure-process.dia
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/autotools-process.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/build_preferences.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/compilation-stages.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/configure-dialog.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/configure-process.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/library-add-pkgconfig.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/library-add-properties.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/new-project-basic.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/new-project-message.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/new-project-options.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/new-project-select.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/C/figures/new-project-summary.png
==============================================================================
Binary file. No diff available.
Added: trunk/manuals/anjuta-build-tutorial/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/manuals/anjuta-build-tutorial/Makefile.am Mon Sep 29 20:36:07 2008
@@ -0,0 +1,17 @@
+include $(top_srcdir)/gnome-doc-utils.make
+dist-hook: doc-dist-hook
+DOC_MODULE = anjuta-build-tutorial
+DOC_ENTITIES = anjuta-build-tutorial.xml
+DOC_AM_CPPFLAGS =
+DOC_FIGURES = figures/autotools-process.png \
+ figures/configure-process.png \
+ figures/new-project-message.png \
+ figures/build_preferences.png \
+ figures/library-add-pkgconfig.png \
+ figures/new-project-options.png \
+ figures/compilation-stages.png \
+ figures/library-add-properties.png \
+ figures/new-project-select.png \
+ figures/configure-dialog.png \
+ figures/new-project-basic.png \
+ figures/new-project-summary.png
Added: trunk/manuals/anjuta-build-tutorial/anjuta-build-tutorial-C.omf
==============================================================================
--- (empty file)
+++ trunk/manuals/anjuta-build-tutorial/anjuta-build-tutorial-C.omf Mon Sep 29 20:36:07 2008
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<omf>
+ <resource>
+ <creator>opincon wanadoo fr (Olivier PinÃon)</creator>
+ <creator>(SÃbastien Granjoux)</creator>
+ <maintainer>(SÃbastien Granjoux)</maintainer>
+ <title>Anjuta Build Tutorial</title>
+ <date>2008-09-29</date>
+ <version identifier="0.2" date="2008-29-09" description=""/>
+ <subject category="GNOME|Development"/>
+ <description>
+ This document is an build tutorial for Anjuta.
+ </description>
+ <type>manual</type>
+ <format mime="text/xml" dtd="-//OASIS//DTD DocBook XML V4.1.2//EN"/>
+ <identifier url="anjuta-build-tutorial.xml"/>
+ <language code="C"/>
+ <relation seriesid="0e3fe6e2-8034-11d8-970e-88acdebde305"/>
+ <rights type="GNU FDL" license.version="1.1" holder="Naba Kumar"/>
+ </resource>
+</omf>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]