Domanda

Ho codice C ++ che ha bisogno di un SED fatto ad esso prima della compilazione. Come faccio a piazzare questo in Makefile.am?

Ho provato la configurazione tipica makefile e l'obiettivo sembra non esistere:

  

gentest.cc:

     
    

$(SED) -i "s|FIND|REPLACE|" gentest.cc

  

Se siete interessati da questo che voglio fare questo, è perché ho scritto il mio programma (slider3.py) in Python e il mio compagno ha scritto la sua in C ++ (gentest.cc) e le sue necessità di chiamare il mio. Sto realizzare questo modificando il argv e quindi utilizzando execv().

  

... {

     

char **argv2 = new char*[argc];

     

memset(argv2,0,sizeof(argv2));

     

argv2[0] = "__PREFIX__/bin/slider3.py";

     

memcpy(argv2 + 1, argv + 2, sizeof(char *) * (argc - 2));

     

int oranges = execv(argv2[0], argv2);

     

printf("%s\n", strerror(oranges));

     

return oranges;

     

} ...

Ho già gestito ricevendo il #! aggiunto al slider3.py e chmod +x utilizzando il metodo che non funzionava per gentest.cc. Ho anche gestito aggiungendo slider3.py alla lista dei file che vengono installati.

  

EXTRA_DIST=testite.sh slider3_base.py

     

bin_SCRIPTS = slider3.py

     

CLEANFILES = $(bin_SCRIPTS)

     

slider3.py: slider3_base.py

     
    

rm -f slider3.py

         

echo "#! " $(PYTHON) > slider3.py

         

cat slider3_base.py >> slider3.py

         

chmod +x slider3.py

  

gentest è definito in questo modo in Makefile.am:

  

bin_PROGRAMS = gentest

     

gentest_SOURCES = gentest.cc

     

gentest_LDADD = libgen.a #../libsbsat.la $(LIBM)

E questo non riesce a essere eseguito durante il make (notare il modello @ è ampliato con successo in Makefile):

  

gentest.cc:

     
    

$(SED) -i "s|__PREFIX__|@prefix@|" gentest.cc

  

Tutte le idee su come ottenere sed da eseguire prima di compilare gentest.cc?

È stato utile?

Soluzione

Non utilizzare sul posto sed.

Invece:

gentest_SOURCES = gentest-seded.cc

gentest-seded.cc : gentest.cc
    $(SED) "s|__PREFIX__|@prefix@|" $< >$@

Altri suggerimenti

Avete mai considerato #define-ing in config.h (che si sta utilizzando autotools, giusto?) O passando utilizzando -D durante la compilazione? Questo non è davvero il caso di sed.

I dettagli da risposta di Andrew Y:

nell'origine C ++, specificare:

argv2[0] = SCRIPTPREFIX "/bin/slider3.py";

quindi compilare con

-DSCRIPTPREFIX='"/your/script/prefix"'

Avete considerato chiamando il codice Python direttamente dal C ++? Ecco un tutorial su usare il boost per chiamare pitone funzioni dal C ++ . Il metodo si sta descrivendo qui sembra molto fragile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top