Appel ETD pour une source Makefile.am
Question
J'ai c ++ code qui a besoin d'un Sed fait à elle avant la compilation. Comment puis-je placer cela en Makefile.am
?
J'ai essayé la configuration typique de makefile et la cible semble ne pas exister:
gentest.cc:
$(SED) -i "s|FIND|REPLACE|" gentest.cc
Si vous êtes intéressé à pourquoi je veux faire, c'est parce que je l'ai écrit mon programme (slider3.py
) en python et mon partenaire a écrit son en C ++ (gentest.cc
) et ses besoins à appeler la mienne. J'accomplir en éditant le argv
, puis en utilisant 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;
} ...
Je l'ai déjà manié obtenir le #!
ajouté à slider3.py
et chmod +x
en utilisant la méthode qui ne fonctionnait pas pour gentest.cc
. J'ai aussi manié l'ajout slider3.py
à la liste des fichiers qui sont installées.
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
est défini de cette façon dans Makefile.am
:
bin_PROGRAMS = gentest
gentest_SOURCES = gentest.cc
gentest_LDADD = libgen.a #../libsbsat.la $(LIBM)
Et ce ne être exécuté pendant le make (notez le modèle de @
est développé avec succès dans Makefile
):
gentest.cc:
$(SED) -i "s|__PREFIX__|@prefix@|" gentest.cc
Toutes les idées sur la façon d'obtenir sed
à courir avant de compiler gentest.cc
?
La solution
Ne pas utiliser en place sed.
Au lieu de cela:
gentest_SOURCES = gentest-seded.cc
gentest-seded.cc : gentest.cc
$(SED) "s|__PREFIX__|@prefix@|" $< >$@
Autres conseils
Avez-vous déjà pensé #define
-ing dans config.h (vous utilisez autotools
, non?) Ou le passage à l'aide -D
lors de la compilation? C'est vraiment pas le cas pour sed
.
Les détails de la réponse d'Andrew Y:
dans votre source de C ++, spécifiez:
argv2[0] = SCRIPTPREFIX "/bin/slider3.py";
puis compiler avec
-DSCRIPTPREFIX='"/your/script/prefix"'
Avez-vous envisagé d'appeler le code Python directement à partir du C ++? Voici un tutoriel sur utilisant boost pour appeler python les fonctions de la C. La méthode que vous décrivez semble ici très fragile.