[ekg2-devel] Kompilacja pod Solarisem

Wojciech Szymak szymak w gmail.com
Sob, 8 Wrz 2007, 15:34:49 CEST


Witam

Przed wami kolejny odcinek perypetii na Solarisie. ;)

Na początek pewne uzupełnienie informacji odnośnie opisywanego _POSIX_PATH_MAX.
Makro _XOPEN_SOURCE (i dwa pozostałe makra także) w xmalloc.h musi być
zadeklarowane przed wszystkimi nagłówkami, gdyż jeśli będzie
zadeklarowane po jakimkolwiek nagłówku inkludującym <sys/types.h> (a
łaściwie <sys/feature_tests.h>) to tak jakby tego makra nie było w
ogóle. Oczywiście w takiej sytuacji inkludowane "ekg/xmalloc.h" po
jakimkolwiek innym pliku nagłówkowym mija się z celem
(plugin/xmsg/xmsg.c).


Definiowanie _POSIX_SOURCE jest niedozwolone przy -std=c99, czego
powodem plugin jogger nie kompiluje. Należy zmienić _POSIX_SOURCE na
_POSIX_C_SOURCE=200112L.


Kolejny problem jest niekoniecznie stricte Solarisowy.
Błąd jest przy linkowaniu pluginu python.
Log kompilacji (UWAGA: plik ma 3.9MB!) umieściłem tu:
http://home.elka.pw.edu.pl/~wszymak/comp.log
Co ciekawsze, kiedy zamiast linkować plugin do pliku .so, linkuje go
razem z ekg2 (oczywiście odpowiednio modyfikując ładowanie pluginu) i
dodam libtk, libtcl i libpython (kiedy python jest na liście
STATIC_PLUGINS nie ma ich w LDFLAGS) ptrzy linkowaniu problemu nie ma
i plugin działa poprawnie (poza pewną niedokończoną rzeczą, o czym
zaraz).
Oczywiście, kiedy usunę opcje -shared -Wl,-h -Wl,python, przy
linkowaniu krzyczy tylko o funkcje z ekg2, nie ma takiej długiej
listy.
Pytanie brzmi, co zrobić, aby -shared nie pluł takiej listy błędów


Kolejna rzecz, jest informacją dla osób które nie zaglądają na
bugs.ekg2.org (dla pewności, że wszyscy wiedzą podam). Nie jest
dozwolone przekazywanie wartości null dla *printf przy wyświetlaniu
łańcuchów tekstowych (%s).
printf("%s", NULL) == SIGSEGV.


No a teraz ta niedokończona rzecz z pluginu python, lub z części ekg2
odpowiedzialnej za obsługę pluginów skryptów. Sam błąd opisałem tu:
http://bugs.ekg2.org/task/96
Teraz go rozwinę i podam przykładowe rozwiązanie/obejście.

w pliu ekg/scripts.c jest taki fragment:
        else CHECK("protocol-status")       { NEXT_ARG(QUERY_ARG_CHARP);
                                              NEXT_ARG(QUERY_ARG_CHARP);
                                              NEXT_ARG(QUERY_ARG_CHARP);

NEXT_ARG(QUERY_ARG_CHARP);        }

Powinny zostać przekazane cztery agrumenty typu char *. Problem w tym,
że jeden  nich jest tak naprawdę typu int. Zmiana typu na int nie
pomoże, gdyż ten parametr to status (avail, away, ...). W pluginie
python jest on potrzebny właśnie jako tekst z powodu tekstowej
reprezentacji stałych ekg.STATUS_AWAY,...
Na pierwszy rzut oka, można by było dodać stałą QUERY_ARG_STATUS,
która reprezentowałaby tylko i wyłącznie statusy. Za ich translacje z
licz na łańcuchy mogłaby odpowiadać wtedy funkcja python_query z
plugins/python/python.c. Nie wiem jak to się  ma do innych pluginów
skryptowych, gdyż nie kompilowałem perla z powodów błędów kompilacji
(o tym w jednym z kolejnych odcinków;).

-- 
Dziękuję za uwagę i zapraszam na kolejne odcinki ;-)
Pozdrawiam
Wojciech Szymak


Więcej informacji o liście dyskusyjnej ekg2-devel