2009-08-25 2 views
3

У меня есть код C++, которому требуется sed, сделанный до его компиляции. Как разместить это в Makefile.am?Вызов SED для источника в Makefile.am

Я попробовал типичную установку Makefile и цель, как представляется, не существует:

gentest.cc:

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

Если вас интересует, почему я хочу сделайте это, потому что я написал свою программу (slider3.py) в python и мою часть ner написал его в C++ (gentest.cc), и ему нужно позвонить мне. Я делаю это, редактируя argv, а затем используя 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;

} ...

Я уже обработаны получать #! добавлены в slider3.py и chmod +x с помощью метода, который не работал на gentest.cc. Я также обработал добавление slider3.py к списку файлов, которые устанавливаются.

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 определяется таким образом, в Makefile.am:

bin_PROGRAMS = gentest

gentest_SOURCES = gentest.cc

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

И это не может быть запущен во время сборки (обратите внимание на @ модель успешно расширяется в Makefile):

gentest.cc:

$(SED) -i "s|__PREFIX__|@[email protected]|" gentest.cc

Любые идеи о том, как получить sed для запуска перед компиляцией gentest.cc?

ответ

5

Вы когда-нибудь думали #define -ную его в config.h (вы используете autotools, верно?) Или передать его с помощью -D при компиляции? Это действительно не так для sed.

Детали из ответа Andrew Y в:

в вашем C++ источника, укажите:

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

затем компилировать с

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

Да, я использую autotools - в первый раз. Можете ли вы показать мне примеры ваших предложений? –

+0

А, это предложение Эндрю Y -D вы говорили? –

+2

Если у вас есть config.h (AC_CONFIG_HEADERS), вы можете использовать что-то вроде AC_DEFINE_UNQUOTED ([THE_PREFIX], ["$ prefix"]) в вашем файле configure.ac. Вам действительно нужно поиграть с ним, с документацией и другим источником, чтобы почувствовать это. Может быть проще добавить CPPFLAGS в ваш Makefile.am и передать его с помощью -DTHE_PREFIX = \ "@ prefix @ \" (или что-то в этом роде - следите за правильным экранированием). В обоих случаях вы должны сделать THE_PREFX "/bin/slider3.py" в своем коде. Это заставляет меня думать, что вы можете предпочесть @ bindir @ over @ prefix @. –

0

Рассматривали ли вы вызова код Python непосредственно из C++? Вот урок using boost to call python functions from C++. Метод, который вы здесь описываете, кажется очень хрупким.

+0

Мой партнер также решил использовать CVS, так что вы можете себе представить, что это будет длинная битва пока мы не закончим :-) Проблема с переключением на Boost заключается в том, что я бы предпочел не переписывать его код. Я думал, что использование замены через make-файлы было бы целесообразным, чтобы этого избежать. –

+0

Я обязательно буду помнить о работе с C++ в будущем! –