Chamando sed para uma fonte em makefile.am
Pergunta
Eu tenho código C ++ que precisa de um sed feito antes da compilação. Como faço para colocar isso em Makefile.am
?
Eu tentei a configuração típica makefile e o alvo parece não existir:
gentest.cc:
$(SED) -i "s|FIND|REPLACE|" gentest.cc
Se você está interessado no motivo pelo qual eu quero fazer isso, é porque escrevi meu programa (slider3.py
) em Python e meu parceiro escreveram o dele em C ++ (gentest.cc
) e suas necessidades para ligar para o meu. Estou realizando isso editando o argv
e depois usando 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;
} ...
Eu já lidei com a obtenção do #!
Adicionado a slider3.py
e chmod +x
usando o método que não estava funcionando para gentest.cc
. Eu também lidei adicionando slider3.py
para a lista de arquivos que são instalados.
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
é definido dessa maneira em Makefile.am
:
bin_PROGRAMS = gentest
gentest_SOURCES = gentest.cc
gentest_LDADD = libgen.a #../libsbsat.la $(LIBM)
E isso não é executado durante a marca (observe o @
o padrão é expandido com sucesso em Makefile
):
gentest.cc:
$(SED) -i "s|__PREFIX__|@prefix@|" gentest.cc
Qualquer idéia sobre como conseguir sed
Para correr antes de compilar gentest.cc
?
Solução
Não use sed no local.
Em vez de:
gentest_SOURCES = gentest-seded.cc
gentest-seded.cc : gentest.cc
$(SED) "s|__PREFIX__|@prefix@|" $< >$@
Outras dicas
Você já considerou #define
-ing em config.h (você está usando autotools
, certo?) Ou passando usando -D
Ao compilar? Este não é realmente o caso sed
.
Os detalhes da resposta de Andrew Y:
Na sua fonte C ++, especifique:
argv2[0] = SCRIPTPREFIX "/bin/slider3.py";
então compilar com
-DSCRIPTPREFIX='"/your/script/prefix"'
Você já pensou em chamar o código Python diretamente do C ++? Aqui está um tutorial sobre Usando o Boost para chamar funções Python de C ++. O método que você está descrevendo aqui parece muito quebradiço.