tpp 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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!