Mam trochę kodu napisanego dla Linuksa i bazującego na gniazdach i arpa/inet.h oraz libusb.h i chcę skompilować to dla Windows pod MinGW. (Zauważ, że bieżący projekt ma po prostu bardzo prosty plik Makefile i wcale nie polega na autotoolach).Pierwsze kroki z gnulib na MinGW i niezbyt dobrze znane z autotoolami
Wygląda na to, że używanie gnulib byłoby dobrym sposobem na skompilowanie tego dla Windows pod MinGW i zacząłem w tym kierunku, ale wydaje się, że jeśli nie znasz dobrze autotools głębokie chwasty bardzo szybko.
Więc oto co próbowałem:
$ gnulib-tool --import getsockname,getsockopt,setsockopt,socket,socketlib,sockets,socklen,sys_socket,arpa_inet,inet_ntop,inet_pton,netinet_in
To działa i daje mi się następujący komunikat na końcu:
Don't forget to
- add "lib/Makefile" to AC_CONFIG_FILES in ./configure.ac,
- mention "lib" in SUBDIRS in Makefile.am,
- mention "-I m4" in ACLOCAL_AMFLAGS in Makefile.am,
- mention "m4/gnulib-cache.m4" in EXTRA_DIST in Makefile.am,
- invoke gl_EARLY in ./configure.ac, right after AC_PROG_CC,
- invoke gl_INIT in ./configure.ac.
Ok, nie miałem configure.ac ani Makefile. am, więc stworzyłem je następująco (zgodnie z instrukcją powyżej):
$ cat Makefile.am
SUBDIRS = lib
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = m4/gnulib-cache.m4
I ...
$ cat configure.ac
AC_INIT([configure.ac])
AC_CONFIG_FILES([lib/Makefile])
AC_PROG_CC
gl_EARLY
gl_INIT
W tym momencie dokumentacja gnulib wydaje się zakładać, że doskonale znasz autotools, więc pomijają wszystkie instrukcje dotyczące tego, co musisz zrobić z autotoolami.
Z tego co udało mi się dowiedzieć od czytania różnych forach, wydaje się, że kolejne kroki w celu uruchomienia:
$ aclocal
$ autoconf
$ automake
$ configure
... Jednak kiedy wpadłem automake mam:
$ automake
configure.ac: no proper invocation of AM_INIT_AUTOMAKE was found.
configure.ac: You should verify that configure.ac invokes AM_INIT_AUTOMAKE,
configure.ac: that aclocal.m4 is present in the top-level directory,
configure.ac: and that aclocal.m4 was recently regenerated (using aclocal).
lib/Makefile.am:30: library used but `RANLIB' is undefined
lib/Makefile.am:30: The usual way to define `RANLIB' is to add `AC_PROG_RANLIB
' lib/Makefile.am: 30: to configure.ac' and run
autoconf' ponownie.
Hmmm ... Ok to pewnie jakieś rzeczy, których mi brakuje w moim pliku Makefile.am (ponieważ nie jestem całkowicie pewien, co powinienem zrobić w Makefile.am) ... więc cofając się o krok ... . Byłbym w stanie uruchomić plik konfiguracyjny, który został utworzony w kroku powyżej autoconf:
$ ./configure
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.exe
checking for suffix of executables... .exe
checking whether we are cross compiling... no
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
./configure: line 2497: gl_EARLY: command not found
./configure: line 2498: gl_INIT: command not found
rm: cannot lstat `conftest.exe': Permission denied
z tego co czytałem przez googling wokół wydaje się, że gl_EARLY i gl_INIT należy dbać o linię dodane do pliku Makefile.am (ACLOCAL_AMFLAGS = -I m4), ale w tym momencie nie jestem do końca pewien, czy robię to autotools poprawnie. Czy ktoś może wskazać, co robię źle?