Podczas kompilowania Apache 1.3.42 oraz 1.3.41 na Ubuntu 9.10 zauważyłem pewien problem i po krótkiej analizie okazało się, że Apache Foundation używa własnej wersji funkcji getline() do obsługi danych wejściowych od użytkownika. Gdy kompilacja odbywa się przy użyciu gcc (version 4.4.1 Ubuntu 4.4.1-4ubuntu9) występuje konflikt funkcji, pomiędzy getline() od Apache oraz getline() zdefiniowaną w stdio.h (man 3 getline).
SYNOPSIS
#define _GNU_SOURCE
#includessize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);CONFORMING TO
Both getline() and getdelim() are GNU extensions. They are available since libc 4.6.27.
Problem jest dokładnie z plikami:
- src/support/htdigest.c
- src/support/htpasswd.c
- src/support/logresolve.c
Podczas kompilacji błąd objawia się komunikatem:
make[2]: Entering directory '/home/jamzed/lab/apache_1.3.42/src/support'
gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED '../apaci` htpasswd.c
htpasswd.c:101: error: conflicting types for 'getline'
/usr/include/stdio.h:651: note: previous declaration of 'getline' was here
make[2]: *** [htpasswd.o] Error 1
make[2]: Leaving directory '/home/jamzed/lab/apache_1.3.42/src/support'
make[1]: *** [build-support] Error 1
make[1]: Leaving directory '/home/jamzed/lab/apache_1.3.42'
make: *** [build] Error 2
Najszybszym rozwiązaniem jest zmiana nazwy funkcji getline w tych plikach na inną, jeśli komuś nie chce robić się tego ręcznie, przygotowałem diff'a w formie patch'a (patch zmienia nazwy funkcji na jmz_getline).
pobierz plik "apache-getline.patch"
Aplikacja patch'a:
# wget http://www.varlog.pl/wp-content/uploads/2010/03/apache-getline.patch_.gz
# gzip -d apache-getline.patch.gz
# cp apache-getline.patch apache_1.3.42/ #kopiujemy plik patch'a do katalogu z rozpakowanymi źródłami
# cd apache_1.3.42 #wchodzimy do katalogu ze źródłami
# patch -p0 < apache-getline.patch #wykonujemy polecenie patch -p0 <
patching file src/support/htpasswd.c
patching file src/support/htdigest.c
patching file src/support/logresolve.c
i możemy spokojnie kompilować dalej ;-)