2012-07-04 16 views
6

Ho recentemente convertito il mio sistema di build in automake/autoconf. Nel mio progetto ho alcuni test unitari che richiedono alcuni file di dati di input nella directory da cui vengono eseguiti. Quando eseguo make distcheck e prova la build VPATH, questi test falliscono perché apparentemente non vengono eseguiti dalla directory in cui si trovano i file di input. Mi stavo chiedendo se c'è qualche soluzione rapida per questo. Per esempio, posso in qualche modo dire al sistema di non eseguire questi test sul make distcheck (ma li eseguo comunque su make check)? O fare un cd nella directory in cui si trovano i file prima di eseguire i test?make distcheck e test che necessitano di file di input

risposta

4

La soluzione tipica è scrivere i test in modo che guardino nella directory di origine per i file di dati. Ad esempio, è possibile fare riferimento a $srcdir nel test oppure convertire test in test.in e fare riferimento a @[email protected].

Se i test sono tutti nella directory di origine, è possibile eseguire tutte le prove in quella directory impostando TESTS_ENVIRONMENT in Makefile.am:

TESTS_ENVIRONMENT = cd $(srcdir) && 

Questo fallirà se alcuni dei vostri test sono creati da configure e quindi vivere solo nella directory di compilazione, nel qual caso è possibile selettivamente cd con qualcosa di simile:

TESTS_ENVIRONMENT = { test $${tst} = mytest && cd $(srcdir); true; } && 

cercando di utilizzare TESTS_ENVIRONMENT come questo è fragile nella migliore delle ipotesi, e sarebbe meglio scrivere i test in modo che guarda nella fonte terribile ctory per i file di dati.

+0

I miei test sono in src/some/path e i file di dati si trovano nella stessa directory. Ho provato il trucco TESTS_ENVIRONMENT = cd $ (srcdir) && ma non ha funzionato perché ora non trova più il test eseguibile. Anche la copia dei file di dati richiesti nella directory corrente non funziona perché, in una build VPATH, apparentemente non si dispone delle autorizzazioni di scrittura per la directory in cui vengono eseguiti i test. –

+0

@ Martin, non si ha accesso in scrittura alla directory di origine, ma si ha accesso in scrittura alla directory di build. Come stai copiando il file? Semplicemente aggiungendo 'EXTRA_DIST = datafile' a Makefile.am e' cp $ {srcdir}/datafile .' in test.in dovrebbe funzionare. Tuttavia, se il test è in esecuzione dalla directory di origine, il tentativo di copia fallirà a causa delle autorizzazioni di scrittura. Ho il sospetto che tu abbia alcuni test che vengono eseguiti dalla directory di build e alcuni che vengono eseguiti dalla directory di origine. (I test chiamati '* .in' sono (probabilmente) eseguiti dalla directory build, mentre altri test vengono eseguiti dalla directory di origine.) –

+0

Questo sembrava esattamente quello che stavo cercando, ma questo non sembra funzionare con Automake 1.15, sfortunatamente: con questo crea file '* .log' e' * .trs' nella directory sorgente (che è già male), ma continua a cercarli nella directory di build e, naturalmente, non trova li là (che è fatale). –

7

Ho avuto lo stesso problema e ho usato una soluzione simile a quella di William. Il mio Makefile.am simile a questa:

EXTRA_DIST = testdata/test1.dat 

AM_CPPFLAGS = -DDATADIR=\"$(srcdir)/\" 

Poi, nel mio unittest, io uso il DATADIR definire:

string path = DATADIR "/testdata/test1.dat" 

Questo funziona con make check e make distcheck.

Problemi correlati