2013-08-16 12 views
6

Il mio progetto viene compilato utilizzando gli autotools GNU (aclocal && autoconf && ./configure && make). Mi piacerebbe usare Boost e mi piacerebbe che anche altre persone potessero compilarlo.Come includere Boost nel progetto GNU Autotools?

  1. Devo inserire Boost nella directory del mio progetto, o fare affidamento sul sistema Boost?
  2. Come devo dire agli autotools di utilizzare Boost? Ho cercato su Google e ho trovato molti file m4 che affermano di farlo, ma dove dovrei mettere quei file m4? Posso metterne uno nella mia directory /usr/share/aclocal, ma ciò non aiuta qualcuno che voglia compilare il progetto usando ./configure && make.

risposta

0
  1. avrei sicuramente si affidano installazione Boost del sistema. IIRC, l'ultima volta che ho costruito Boost richiedeva strumenti non standard (per gli strumenti portatili richiesti per autoconf) per la creazione di Boost. Ci è voluto anche molto tempo.
  2. AC_CONFIG_MACRO_DIR è dove quei file .m4 vanno

    AC_CONFIG_MACRO_DIR([m4]) 
    

dove le macro si trovano nella directory "m4". Mi aspetto che i vari macro di .mp4 di Boost abbiano un modo per dire a configure quale pacchetto Boost deve cercare (per più installazioni Boost) e dove si trova (installazioni non standard).

+0

Grazie. Puoi dare un esempio di come usare 'AC_CONFIG_MACRO_DIR' - Trovo le perplessioni dell'AC. Inoltre: se l'utente installa Boost secondo le indicazioni del sito web, AC sarà in grado di trovarlo? Mi piacerebbe che il messaggio di errore dicesse cosa fare "Errore: è richiesto Boost. Installa come indicato su http: // ..." – SRobertJames

+0

Il Boost del sistema potrebbe essere obsoleto e/o incompatibile, quindi potresti dover installa una versione diversa nella tua home directory (quando non hai accesso root). – DanielKO

+0

In questo caso, probabilmente cercherò una versione preinstallata Boost che funzionerebbe. In caso contrario, è possibile patchare il sorgente per la versione Boost installata o scaricare Boost dal sorgente e crearlo. – ldav1s

1

C'è una macro eccellente boost.m4 che è possibile includere nel progetto nella sottodirectory m4. Queste macro si trovano con AC_CONFIG_MACRO_DIR([m4]) in configure.ac.

Aggiungi ACLOCAL_AMFLAGS = -I m4 --install al livello superiore Makefile.am, utilizzato da automake.

Ecco perché è una buona macro quali:

BOOST_REQUIRE([1.54],[ACTION-IF-NOT-FOUND]) 

Questo definirà BOOST_CPPFLAGS quale è possibile aggiungere a CPPFLAGS, utilizzare in un AC_SUBST, ecc

Per i singoli componenti Boost, è possibile specificare build di debug, statica costruisce, ecc Ma il (tipicamente) multi-thread, librerie dinamiche sono migliori, ad esempio,

BOOST_FILESYSTEM([mt]) 

definirà BOOST_FILESYSTEM_LIBS e BOOST_FILESYSTEM_LDFLAGS. Come un altro bonus, se la libreria si basa su, diciamo, Boost.System, allora queste dipendenze delle librerie vengono aggiunti automaticamente al LIBS, LDFLAGS, ecc


Si dovrebbe solo specificare che un impianto Boost è necessario, piuttosto che cercando di distribuirlo. È facilmente costruito e installato dal sorgente, o da pacchetti precompilati. Il primo richiede molto tempo, ma è meglio avere una build 'ottimizzata' sul sistema. C'è un sacco di software che può utilizzare un'implementazione Boost (robusta e ottimizzata).

Quindi utilizzare il messaggio di errore BOOST_REQUIRE se non è disponibile una versione accettabile.

15

The Archive ha AX_BOOST_*.

Sono passato a boost.m4 per un po 'di tempo, ma è così dolorosamente lento che ho potuto modificare un Makefile con il percorso di Boost completo a mano in vim prima che boost.m4 abbia completato i test per la seconda libreria.

Sono tornato in archivio ed ero felice di apprendere che i macro boost vengono attivamente mantenuti; quindi ho proceduto a eliminare boost.m4 da ognuno dei miei progetti.

estratti pertinenti, relativi a un caso d'uso (assumendo che l'ax_boost _ * file m4 sono in sottodirectory m4.):

./bootstrap

aclocal -I m4 --install 
... 

./configure.ac

... 
AC_CONFIG_MACRO_DIR([m4]) 
... 
AX_BOOST_BASE([1.48],, [AC_MSG_ERROR([libfoo needs Boost, but it was not found in your system])]) 
AX_BOOST_SYSTEM 
AX_BOOST_FILESYSTEM 
... 

./Makefile.am

ACLOCAL_AMFLAGS = -I m4 
EXTRA_DIST = bootstrap ... 
SUBDIRS = ... src ... 
... 

./src/Makefile.am

AM_CPPFLAGS = \ 
    ... \ 
    $(BOOST_CPPFLAGS) \ 
    ... 

... 

AM_LDFLAGS = ... \ 
    $(BOOST_LDFLAGS) 

... 

lib_LTLIBRARIES = libFoo.la 

... 

libFoo_la_LIBADD = \ 
    ... \ 
    $(BOOST_FILESYSTEM_LIB) \ 
    $(BOOST_SYSTEM_LIB) \ 
    ... 
+0

Grazie, ho appena avuto problemi con la virgola in AC_MSG_ERROR' ha bisogno di Boost, ma esso', rimuovendo la virgola risolto. – aberaud

+0

Quindi non lo stai citando correttamente (i caratteri '[' e ']'.) – DanielKO

Problemi correlati