Chiamata SED per una fonte in Makefile.am
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
?
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.