2015-06-10 30 views
5

Utilizziamo gli autotools come infrastruttura di build e usiamo clang e gcc come compilatori. Recentemente abbiamo raggiunto un avvertimento gcc che aveva bisogno diCome impostare i flag specifici del compilatore con gli autotools

--param max-vartrack-size=100000000 

al silenzio (senza vartracking completey di gcc disabilitazione). Clang non accetta tale opzione e produce

argument unused during compilation: '--param max-vartrack-size=100000000' 

al silenzio che, clang bisogno

-Qunused-arguments 

e che genera un errore sotto gcc:

unrecognized command line option ‘-Qunused-arguments’ 
  1. Qual è la modo migliore per definire i flag specifici del compilatore in configure.ac, dopo aver selezionato un compilatore, ad esempio AC_PROG_CXX? Abbiamo AC_SUBST(AM_CXXFLAGS) quindi suppongo che mi piacerebbe espandere una variabile specifica del compilatore all'interno di AM_CXXFLAGS.

  2. Qual è il modo corretto per abilitare un'opzione per target in un Makefile.am per un solo compilatore? Sto pensando di:

    if HAVE_GCC 
        SPECIFIC_CXXFLAGS = --param... 
    endif 
    if HAVE_CLANG 
        SPECIFIC_CXXFLAGS = -Q... 
    endif 
    libfoo_la_CXXFLAGS = $(AM_CXXFLAGS) $(SPECIFIC_CXXFLAGS) 
    

ma mi piacerebbe bisogno dei HAVE_* Vars subst'ed da configure.ac. AC_PROG_CXX/CC forse già definire qualcosa di simile?

risposta

2

AM_CXXFLAGS non è qualcosa che si dovrebbe AC_SUBST. È riservato per l'uso da automake. Se si guarda lo Makefile generato per un target C++, si troveranno le definizioni per CXXCOMPILE e LTCXXCOMPILE, che includono sempre la variabile AM_CXXFLAGS.

Si desidera aggiungere il flag del compilatore (condizionale) a AM_CXXFLAGS o a libfoo_la_CXXFLAGS. Il primo interesserà tutte le compilazioni C++ e le ultime solo le compilazioni per libreria. Quindi è solo questione di ottenere SPECIFIC_CXXFLAGS proprio nel configure.ac.

AC_PROG_CXX 
... 
FOO_SPECIFIC_CXXFLAGS=; 
if `$CXX -v 2>&1 | grep 'gcc version' >/dev/null 2>&1` ; then 
    FOO_SPECIFIC_CXXFLAGS="--param max-vartrack-size=100000000" 
fi 

AC_SUBST(FOO_SPECIFIC_CXXFLAGS, $FOO_SPECIFIC_CXXFLAGS) 

Il test GXX è insufficiente come autoconf solo test per la __GNUC__ macro (AFAIK), così clang ++ imposterà: GXX=yes

Il problema è, non v'è un modo portatile di rilevare opzioni linea di comando che sono sconosciuti. Intel icc -v riprodurrà anche la stringa gcc version.Così potrebbe essere necessario aggiungere un altro filtro, come: | grep -v 'icc'

Si potrebbe eventualmente controllare che le opere di bandiera come pubblicizzato prima AC_SUBST, ma questo non aiuta se il compilatore genera solo un avvertimento:

saved_CXXFLAGS="$CXXFLAGS" 
CXXFLAGS="$CXXFLAGS $FOO_SPECIFIC_CXXFLAGS" 

AC_LANG_PUSH([C++]) 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],,[FOO_SPECIFIC_CXXFLAGS=;]) 
AC_LANG_POP([C++]) 
CXXFLAGS="$saved_CXXFLAGS" 

Poi nel Makefile.am:

AM_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS) 

o:

libfoo_la_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS) 
+0

Sono perplesso dalla tua affermazione che non si dovrebbe "AC_SUBST" 'AM_CXXFLAGS'. In che modo è diverso dall'impostare 'AM_CXXFLAGS' in tutti i 15' Makefile.am's a mano? 'AC_SUBST'ing' AM_CXXFLAGS' è la soluzione perfetta per cose come abilitare gli avvisi per l'intero progetto di default, o scegliere il vecchio ABI con gcc 5.1 (che deve essere lo stesso per tutti gli oggetti). In quale altro modo potrei ottenere ciò, a meno dell'impostazione di 'AM_CXXFLAGS' in ciascuno dei' Makefile.am's? – Irfy

+0

Ho deciso di aggiungere due 'AM_CONDITIONAL's al mio configure.ac,' HAVE_GCC' e 'HAVE_CLANG' con il test condizionale equivalente al controllo' grep'. Grazie! – Irfy

+0

@Irfy: ecco a cosa serve "CXXFLAGS". Puoi passare i flag specifici del compilatore a 'configure' tramite' CXXFLAGS', o aggiungere/modificare i flag 'CXXFLAGS' in' configure.ac'. Questa variabile è anche inclusa nelle regole di compilazione C++. –

2

Se qualche indicatore produce un errore è facile scrivere una macro m4 per rilevare se il compilatore supporta questo flag.

Controllare ax_check_compile_flag dall'archivio autoconf.

+0

Sono sicuro che questo è il modo * giusto * per farlo, ma dal momento che si tratta di un progetto interno, non distribuito, ho optato per la cosa più semplice possibile, che si è rivelata essere due 'AM_CONDITIONAL's. – Irfy