tpp 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,406 @@
1
+ --title autoconf und automake
2
+ --author Andreas Krennmair
3
+ --date today
4
+ Praktisch jede Software unter Linux wird mit ./configure ; make ; make
5
+ install konfiguriert, compiliert und installiert. Ich m�chte heute
6
+ zeigen, wie man selbst mit Autoconf und Automake den Konfigurations- und
7
+ �bersetzungsprozess automatisieren kann, und was das f�r portable
8
+ Software bringen kann.
9
+ --newpage agenda
10
+ --heading Agenda
11
+
12
+ * Einf�hrung
13
+
14
+ * Makefiles
15
+
16
+ * Autoconf alleine
17
+
18
+ * Autoconf und Automake
19
+ --newpage intro
20
+ --heading Einf�hrung: Geschichte der automatisierten Compilierung unter Unix
21
+
22
+ * Anfangs: Shellskripte namens make im Sourceverzeichnis (bis Unix V6)
23
+ * Ab Unix V7: Programm make, Information aus Datei makefile
24
+ * makefile enth�lt Informationen, welchen Dateien (Targets) aus welchen
25
+ Dateien (Dependencies) erzeugt werden, und welche Kommandos dazu
26
+ aufgerufen werden m�ssen.
27
+ * Makefiles funktionierten anfangs ganz gut, bis die ersten Unix-
28
+ Varianten erschienen, die subtil anders als die bisherigen Unixe waren.
29
+ Software sollte aber portabel bleiben.
30
+ * Einfache L�sung: ein Target pro Zielplattform.
31
+ * Nachteil: bei mehr Plattformen ansteigender Wartungsaufwand
32
+ --newpage intro-conf
33
+ --heading Einf�hrung: erste automatisierte Konfiguration
34
+
35
+ * Makefile-L�sung h�rte auf zu skalieren, als immer mehr und immer
36
+ obskurere Unix-Varianten auftauchten, auf die die Entwickler von
37
+ Software noch dazu keinen Zugriff mehr hatten.
38
+ * Erste L�sung Mitte bis Ender der 80er Jahre: Configure
39
+ * Larry Wall wollte, dass seine Software (insbesondere Perl) portabel
40
+ auf m�glichst vielen Unix-Plattformen l�uft.
41
+ * Schreib Shellskript Configure, das Informationen �ber das System
42
+ sammelte, und aus *.SH-Dateien dementsprechende Dateien generierte
43
+ (Makefile.SH -> Makefile)
44
+ * Vorteil: Perl konnte ohne grossen Portierungsaufwand auf vielen,
45
+ tewilweise recht obskuren Unix-Systemen betrieben werden.
46
+ --newpage intro-gnu
47
+ --heading Einf�hrung: Konfiguration f�r GNU
48
+
49
+ * GNU-Software sollte m�glichst portabel sein
50
+ * GNU-Projekt griff Larry Wall's Idee auf, und realisierte im
51
+ wesentlichen zwei Frameworks, um das Konfigurieren und �bersetzen von
52
+ GNU-Software m�glichst portabel und einfach wartbar zu halten.
53
+ * Konfiguration: autoconf
54
+ * �bersetzung: automake
55
+ * Status heute: Autoconf und Automake sind ein Quasi-Standard bei Freier
56
+ Software/Open Source
57
+ --newpage makefiles
58
+ --heading Einfache Makefiles
59
+
60
+ Makefiles bestehen im wesentlichen aus zwei Bereichen:
61
+
62
+ * Variablendefinitionen
63
+ * Zieldefinitionen
64
+
65
+ Variablen werden verwendet, um gleiche "Textbausteine", die �fters im
66
+ Makefile vorkommen, zusammenzufassen und parametrisierbar zu machen, z.B.
67
+ Compilerkommandos, Compilerflags, Ausgabedatei, ...
68
+
69
+ Zieldefinitionen geben an, welche Datei erzeugt werden soll, von welchen
70
+ Dateien diese Datei abh�ngig ist, und mit welchem Kommando die Datei aus
71
+ diesen Abh�ngigkeiten erzeugt wird. Diese Zieldefinition definiert ein
72
+ sog. "Target". Wird ein Target aufgerufen, so wird das Kommando nur
73
+ ausgef�hrt, wenn die zu generierende Datei noch nicht existiert, oder wenn
74
+ eine der Abh�ngigkeiten erst generiert werden muss, oder wenn eine der
75
+ Abh�ngigkeiten neuer ist als die bestehende Datei So werden unn�tige
76
+ Compile-Vorg�nge vermieden.
77
+ --newpage example1
78
+ --heading Beispiel 1: einfaches Makefile
79
+
80
+ --beginoutput
81
+ # Kommentar
82
+ LATEX=pdflatex # Variablendefinition
83
+
84
+ ac-am.pdf: ac-am.tex # Zieldefinition
85
+ $(LATEX) ac-am.tex # <Tabulator>Kommando
86
+ --endoutput
87
+ --newpage example2
88
+ --heading Beispiel 2: gleichartige Targets zusammenfassen
89
+
90
+ --beginoutput
91
+ LATEX=pdflatex
92
+ RM=rm -f
93
+ PDFFILES=ac-am.pdf
94
+
95
+ all: $(PDFFILES)
96
+
97
+ %.pdf: %.tex
98
+ $(LATEX) $<
99
+
100
+ clean:
101
+ $(RM) $(PDFFILES) *.aux *.log
102
+ --endoutput
103
+ --newpage
104
+ --heading Beispiel 3: modulares C-Programm �bersetzen
105
+
106
+ --beginoutput
107
+ CC=gcc
108
+ CFLAGS=-Os -Wall
109
+ OBJS=foo.o bar.o baz.o quux.o
110
+ OUTPUT=xyzzy
111
+
112
+ all: $(OUTPUT)
113
+ $(OUTPUT): $(OBJS)
114
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $(OUTPUT) $(OJBS) $(LIBS)
115
+
116
+ %.o: %.c
117
+ $(CC) $(CFLAGS) $(DEFINES) -c $<
118
+
119
+ clean:
120
+ $(RM) $(OBJS) $(OUTPUT) core *.core
121
+ .PHONY: all clean
122
+ --endoutput
123
+ --newpage limitations
124
+ --heading Limtationen von Makefiles
125
+
126
+ Makefiles funktionieren zwar bei kleineren, einfachen Programmen, wer
127
+ jedoch gr��ere, portable Software schreiben will, st��t mit make und
128
+ Makefiles schnell an Grenzen.
129
+
130
+ Die Unterschied zwischen den einzelnen Unix-Systemen sind z.B. folgende:
131
+
132
+ * Strukturen unterscheiden sich
133
+ * Funktionen sind unterschiedlich deklariert
134
+ * #defines sind anders benannt oder existieren nicht
135
+ * Manche Funktionen sind nicht mehr in der libc, sondern in externe
136
+ Libraries ausgelagert (z.B. Sockets nach libsocket).
137
+
138
+ Auf diese Unterschiede kann make nicht eingehen. Deswegen muss man einen
139
+ Konfigurationsmechanismus einf�hren, der dies kann.
140
+ --newpage autoconf1
141
+ --heading Autoconf, Schritt 1: configure-Skript erzeugen
142
+
143
+ Autoconf bietet die M�glichkeit, auf eine gro�e Anzahl von Kommandos und
144
+ Tests zur�ckzugreifen, um m�glichst alle relevanten Systemparameter
145
+ abzurufen. Diese Tests werden in einer Datei configure.in abgelegt, aus
146
+ dem dann mit dem Kommando autoconf die Datei configure erzeugt wird. Mit
147
+ dem Kommando autoheader wird die Datei config.h.in erzeugt.
148
+
149
+ Ruft man ./configure auf, so sammelt das configure-Skript die
150
+ Konfigurationsinformationen, und generiert aus config.h.in die Datei
151
+ config.h sowie alle in configure.in angegebenen zu konfigurierenden
152
+ Dateien, das ist meistens Makefile.in, aus der Makefile erzeugt wird.
153
+
154
+ Die configure.in-Datei l�sst sich �brigens erzeugen, indem man autoscan
155
+ aufruft, und die resultierende Datei configure.scan in configure.in
156
+ umbenennt.
157
+ --newpage autoconf2
158
+ --heading Autoconf, Schritt 2: Makefile.in erstellen
159
+
160
+ Die Datei Makefile.in wird wie ein normales Makefile geschrieben,
161
+ mit dem Unterschied, dass f�r bestimmte Variablen, deren Wert vom
162
+ configure-Skript bestimmt werden, spezielle Platzhalter eingef�gt
163
+ werden. Das sieht dann z.B. so aus:
164
+ --beginoutput
165
+ CC=@CC@
166
+ CFLAGS=@CFLAGS@ @DEFS@
167
+ LDFLAGS=@LDFLAGS@
168
+ LIBS=@LIBS@
169
+ --endoutput
170
+
171
+ Der Rest des Makefile sieht wie ein normales Makefile aus. Um auf
172
+ s�mtliche ermittelten Parameter zugreifen zu k�nnen, m�ssen die
173
+ einzelnen C-Sourcefiles nur noch die Datei config.h inkludieren.
174
+ Damit ist Autoconf vollst�ndig integriert und das Buildsystem darauf
175
+ angepasst.
176
+ --newpage autoconf3
177
+ --heading Autoconf, Zusammenfassung
178
+
179
+ In einer Minute zur Sourcekonfiguration mit Autoconf:
180
+ --beginshelloutput
181
+ $ autoscan && mv configure.scan configure.in
182
+ ---
183
+ $ $EDITOR configure.in
184
+ ---
185
+ $ autoconf
186
+ ---
187
+ $ autoheader
188
+ ---
189
+ $ $EDITOR Makefile.in
190
+ --endshelloutput
191
+
192
+ Fertig!
193
+ --newpage confex1
194
+ --heading Beispiel f�r configure.in (1)
195
+
196
+ --beginoutput
197
+ AC_PREREQ(2.57)
198
+ AC_INIT(akpop3d, 0.7.7, ak@synflood.at)
199
+ AC_CONFIG_SRCDIR([authenticate.c])
200
+ AC_CONFIG_HEADER([config.h])
201
+
202
+ # Checks for programs.
203
+ AC_PROG_CC
204
+ AC_PROG_INSTALL
205
+ --endoutput
206
+ --newpage confex2
207
+ --heading Beispiel f�r configure.in (2)
208
+
209
+ --beginoutput
210
+ # Checks for header files.
211
+ AC_HEADER_STDC
212
+ AC_HEADER_SYS_WAIT
213
+ AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h
214
+ netinet/in.h shadow.h stdlib.h string.h sys/file.h
215
+ sys/socket.h sys/time.h syslog.h unistd.h])
216
+
217
+ # Checks for typedefs, structures, and compiler
218
+ # characteristics.
219
+ AC_C_CONST
220
+ AC_TYPE_UID_T
221
+ AC_TYPE_OFF_T
222
+ AC_TYPE_PID_T
223
+ AC_TYPE_SIZE_T
224
+ AC_HEADER_TIME
225
+ --endoutput
226
+ --newpage confex3
227
+ --heading Beispiel f�r configure.in (3)
228
+ --beginoutput
229
+ # Checks for library functions.
230
+ AC_FUNC_ALLOCA
231
+ AC_FUNC_FORK
232
+ AC_FUNC_REALLOC
233
+ AC_FUNC_SELECT_ARGTYPES
234
+ AC_FUNC_STAT
235
+ AC_CHECK_FUNCS([atexit dup2 getspnam inet_ntoa
236
+ memchr memset select socket strchr strerror
237
+ strncasecmp strrchr])
238
+
239
+ AC_CONFIG_FILES([Makefile])
240
+ AC_OUTPUT
241
+ --endoutput
242
+ --newpage functions
243
+ --heading Weitere n�tzliche Autoconf-Funktionen
244
+
245
+ * AC_CHECK_LIB(library,symbol): wenn symbol in Library library
246
+ gefunden wird, wird -llibrary zu den LDFLAGS hinzugef�gt und
247
+ HAVE_LIBLIBRARY=1 in config.h definiert.
248
+ * AC_DEFINE([KEY],[VALUE]): in config.h wird #define KEY VALUE
249
+ eingetragen.
250
+ * AC_ARG_WITH(option,[beschreibung]): das configure-Skript um
251
+ eine --with-option Option erweitern.
252
+ * AC_ARG_ENABLE(option,[beschreibung]): das configure-Skript um
253
+ eine --enable-option Option erweitern.
254
+ --newpage funcex1
255
+ --heading Beispiele zu n�tzlichen Autoconf-Funktionen
256
+
257
+ --beginoutput
258
+ AC_ARG_WITH(openssl, [ --with-openssl use OpenSSL])
259
+ if test "$with_openssl" != "no" ; then
260
+ AC_CHECK_LIB(crypto,BIO_new)
261
+ AC_CHECK_LIB(ssl,SSL_new)
262
+ fi
263
+ AC_ARG_ENABLE(rfc2449, [ --enable-rfc2449 enable RFC 2449 support])
264
+ if test "$enable_rfc2449" != "no" ; then
265
+ AC_DEFINE([ENABLE_RFC2449],[1],[rfc2449])
266
+ fi
267
+ --endoutput
268
+ --newpage funcauto
269
+ --heading Funktionsweise von Autoconf
270
+
271
+ * Vorgefertige Tests in Form von m4-Makros verf�gbar
272
+ * Autoconf l�sst configure.in durch m4 laufen, daraus entsteht
273
+ configure-Skript, was nicht anders als ein Shellskript ist.
274
+ * -> man kann durch Einf�gen von eigenem Shellcode eigene Tests
275
+ durchf�hren.
276
+ * -> oder man greift auf http://ac-archive.sourceforge.net/ zur�ck,
277
+ einem umfangreichen Archiv von hunderten Autoconf-Macros.
278
+
279
+ --beginoutput
280
+ if test x`uname -s` = "xDarwin" ; then
281
+ AC_DEFINE([HAVE_DARWIN],[1],[define whether we have Darwin])
282
+ fi
283
+ --endoutput
284
+ --newpage macroself
285
+ --heading Autoconf-Makros selbst schreiben
286
+
287
+ Autoconf-Makros sind ein Mischmasch aus m4-Skript und Shellskript.
288
+
289
+ --beginoutput
290
+ AC_DEFUN([AC_C_LONG_LONG],
291
+ [AC_CACHE_CHECK(for long long int, ac_cv_c_long_long,
292
+ [if test "$GCC" = yes; then
293
+ ac_cv_c_long_long=yes
294
+ else
295
+ AC_TRY_COMPILE(,[long long int i;],
296
+ ac_cv_c_long_long=yes,
297
+ ac_cv_c_long_long=no)
298
+ fi])
299
+ if test $ac_cv_c_long_long = yes; then
300
+ AC_DEFINE(HAVE_LONG_LONG)
301
+ fi
302
+ ])
303
+ --endoutput
304
+ --newpage automake1
305
+ --heading Automake: Einf�hrung
306
+
307
+ Automake ist daf�r gedacht, den eigentlichen �bersetzungsprozess so weit
308
+ wie m�glich zu vereinfachen, und dem User das Schreiben von eigenen
309
+ Makefile.in's abzunehmen. Automake setzt Autoconf voraus.
310
+
311
+ Die Makefile.am-Datei besteht wie ein Makefile aus Targets, die quasi
312
+ beliebig benannt werden k�nnen, und alle Kommandos enthalten wie auch
313
+ ein Target in einem Makefile oder Makefile.in.
314
+
315
+ Zus�tzlich existieren eine Reihe von speziellen Variablen, mit denen das
316
+ �bersetzen von Software einfacher wird.
317
+
318
+ --beginoutput
319
+ bin_PROGRAMS = hello
320
+ hello_SOURCES = hello.c main.c
321
+ EXTRA_DIST = hello.h
322
+ --endoutput
323
+ --newpage autocmd
324
+ --heading Automake: mehr Kommandos
325
+
326
+ --beginshelloutput
327
+ $ $EDITOR Makefile.am
328
+ ---
329
+ $ autoscan && mv configure.scan configure.in
330
+ ---
331
+ $ autoheader
332
+ ---
333
+ $ aclocal
334
+ ---
335
+ AM_INIT_AUTOMAKE(programname,version) in configure.in eintragen.
336
+ ---
337
+ $ automake -a
338
+ ---
339
+ $ autoconf
340
+ ---
341
+ $ ls -l Makefile.in configure
342
+ -rw-r--r-- 1 ak staff 16048 16 Mar 20:03 Makefile.in
343
+ -rwxr-xr-x 1 ak staff 123354 16 Mar 20:03 configure
344
+ $
345
+ --endshelloutput
346
+ --newpage primaries
347
+ --heading Automake: Primaries
348
+
349
+ Die _PROGRAMS; _SOURCES, etc. Suffixe, die vorher gesehen haben, nennen
350
+ sich �brigen "Primaries". Weitere Primaries sind z.B.:
351
+
352
+ * DATA: gibt Datendateien an, die 1:1 mitinstalliert, ansonsten aber
353
+ ignoriert werden.
354
+ * HEADER: damit werden Headerfiles spezifiziert, die zusammen mit
355
+ Libraries installiert werden sollen.
356
+ * SCRIPTS: ausf�hrbare Skripte, die ebenfalls installiert werden,
357
+ jedoch nicht compiliert oder gestripped werden.
358
+ * MANS: gibt Manpages an, die ebenfalls mitinstalliert werden.
359
+
360
+ Die Grundbed�rfnisse f�r einfache und problemlose Konfigurations-,
361
+ �bersetzungs- und Installationsroutinen w�re damit gedeckt.
362
+ --newpage recam
363
+ --heading Rekursives Automake
364
+
365
+ Um den Inhalt von Unterverzeichnissen in den Automake-Vorgang
366
+ miteinzubeziehen, muss man lediglich alle relevanten Unterverzeichnisse
367
+ �ber die SUBDIRS-Variable angeben.
368
+
369
+ --beginoutput
370
+ SUBDIRS = m4 src doc
371
+ --endoutput
372
+
373
+ In jedem Unterverzeichnis muss nat�rlich wiederum eine Makefile.am
374
+ angelegt und daraus eine Makefile.in erzeugt werden. Ausserdem muss das
375
+ dann zu erzeugende Makefile in der configure.in angegeben werden, und
376
+ zwar via AC_CONFIG_FILES.
377
+ --newpage resumee
378
+ --heading Res�mee
379
+
380
+ * make mag veraltet und eingerostet wirken (wird seit Ende der
381
+ 1970er eingesetzt), bietet aber ein m�chtiges System, um
382
+ Abh�ngigkeiten zu �berpr�fen, und unn�tige Compilevorg�nge zu
383
+ minimieren.
384
+ * Autoconf bietet ein m�chtiges System, um vielerlei systemabh�ngige
385
+ Konfigurationspunkte in Erfahrung zu bringen, was wiederum einen
386
+ Eckpfeiler f�r systemnahe und portable Programmierung bildet.
387
+ * Automake macht es f�r Entwickler besonders einfach, Softwarepakete
388
+ in eine Form zu bringen, dass sie �bersetzt und installiert werden
389
+ k�nnen.
390
+ * Autoconf und Automake m�gen suboptimale L�sungen sein
391
+ (./configure dauert lange, configure und Makefile.in sind
392
+ bei Automake extrem gross), stellen jedoch eine frei verf�gbare,
393
+ einfach anzuwendende und vor allem weit verbreitete L�sung dar.
394
+ --newpage literacy
395
+ --heading Literaturempfehlungen
396
+
397
+ * Das "Autobook": Autoconf, Automake and Libtool
398
+ http://sources.redhat.com/autobook/autobook/autobook_toc.html
399
+ * Autoconf Dokumentation:
400
+ http://www.delorie.com/gnu/docs/autoconf/autoconf_toc.html
401
+ * Automake Dokumentation:
402
+ http://www.delorie.com/gnu/docs/automake/automake_toc.html
403
+ --newpage end
404
+ --heading Und jetzt...
405
+
406
+ --huge Zum praktischen Teil!
@@ -0,0 +1,15 @@
1
+ --author Nico Golde
2
+ --title Testing Orientation
3
+ --footer and this is the footer line
4
+ --header and this is the header line
5
+ This is oriented left.
6
+ ---
7
+ --center This is centered.
8
+ ---
9
+ --right This is oriented right.
10
+ ---
11
+ --beginoutput
12
+ It works even here
13
+ --center as you can see
14
+ --right in these three lines.
15
+ --endoutput
@@ -0,0 +1,40 @@
1
+ --author Andreas Krennmair
2
+ --title Boldtest
3
+ --newpage
4
+ This is normal text.
5
+ --boldon
6
+ This should be bold.
7
+ --boldoff
8
+ This should be normal again.
9
+ --revon
10
+ --center This should be reverse.
11
+ --revoff
12
+ This should be normal.
13
+
14
+ jjjjjjjjjjjjjjjjjjjjjjjjjjj
15
+ --revon
16
+ asdf jkl�
17
+ --boldon
18
+ asdf jkl�
19
+ --boldoff
20
+ asdf jkl�
21
+ --revoff
22
+ jjjjjjjjjjjjjjjjjjjjjjjjjjj
23
+ --newpage
24
+ --heading This is the heading
25
+
26
+ This should be normal
27
+ --ulon
28
+ This should be underlined
29
+ --revon
30
+ This should be underlined and reverse
31
+ --boldon
32
+ This should be underlined, reverse and bold
33
+ --center This should be underlined, reverse, bold and centered
34
+ --uloff
35
+ This should be reverse and bold
36
+ --revoff
37
+ This should be bold
38
+ --boldoff
39
+ This should be normal again
40
+ --huge This Is Huge!