2015-06-25 33 views
6

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?

Odpowiedz

3
  1. Dodaj AC_CONFIG_MACRO_DIR([m4]) do configure.ac i znajdzie gnulib makr w m4 katalogu
  2. Dodaj AM_INIT_AUTOMAKE
  3. AC_CONFIG_FILES powinien zawierać nie tylko gnulib Makefile, ale twój Makefile zbyt
  4. można zregenerować wszystkie rzeczy z jednego połączenia do autoreconf