2015-06-25 64 views
6

Ho un codice C che è stato scritto per Linux e si basa su socket e arpa/inet.h e su libusb.h e voglio compilare questo per Windows sotto MinGW. (Si noti che il progetto corrente ha solo un Makefile molto semplice e non si basa affatto sugli autotools).Introduzione a gnulib su MinGW e non familiare (sufficiente) con gli autotools

Sembra che usare gnulib sia un buon modo per compilare questo per Windows sotto MinGW e ho iniziato in quella direzione, ma sembra che se non si ha molta familiarità con gli autotools si entra le erbacce profonde molto rapidamente.

Quindi, ecco che cosa ho provato:

$ gnulib-tool --import getsockname,getsockopt,setsockopt,socket,socketlib,sockets,socklen,sys_socket,arpa_inet,inet_ntop,inet_pton,netinet_in 

Corre e mi dà il seguente messaggio alla fine:

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, non avevo configure.ac né un Makefile. am, così ho creato nel modo seguente (secondo le istruzioni di cui sopra):

$ cat Makefile.am 
SUBDIRS = lib 
ACLOCAL_AMFLAGS = -I m4 
EXTRA_DIST = m4/gnulib-cache.m4 

E ...

0.123.
$ cat configure.ac 
AC_INIT([configure.ac]) 
AC_CONFIG_FILES([lib/Makefile]) 
AC_PROG_CC 
gl_EARLY 
gl_INIT 

Ora, a questo punto, i documenti di gnulib sembrano presumere che tu sia intimamente familiare con gli autotools, quindi lasciano fuori tutte le istruzioni per ciò che devi fare con gli autotools successivi.

Da quello che ho potuto capire dalla lettura vari forum, sembra che i prossimi passi sono per eseguire:

$ aclocal 
$ autoconf 
$ automake 
$ configure 

però ... quando mi sono imbattuto automake ho ottenuto:

$ 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: a configure.ac' and run autoconf' di nuovo.

Hmmm ... Ok probabilmente sono solo alcune cose che mi mancano nel mio Makefile.am (perché non sono del tutto sicuro di cosa dovrebbe andare in un Makefile.am) ... quindi tornando indietro di un passo .. . dovrei essere in grado di eseguire il file di configurazione che ha ottenuto creato in precedenza nel passaggio 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 

da quello che ho letto da googling intorno sembra che la gl_EARLY e gl_INIT dovrebbe essere prendersi cura dalla linea aggiunto al file Makefile.am (ACLOCAL_AMFLAGS = -I m4), ma a questo punto non sono completamente sicuro che sto facendo correttamente la parte degli autotools. Qualcuno può far notare cosa sto facendo male qui?

risposta

3
  1. Aggiungi AC_CONFIG_MACRO_DIR([m4]) al configure.ac e troverà le macro gnulib in m4 directory
  2. Aggiungi AM_INIT_AUTOMAKE
  3. AC_CONFIG_FILES dovrebbe contenere non solo gnulib Makefile, ma il vostro Makefile troppo
  4. Si può rigenerare tutta roba con singola chiamata a autoreconf