3

我有 c++ 代码,需要在编译之前对其进行 sed 处理。我怎么把它放进去Makefile.am

我尝试了典型的 makefile 设置,但目标似乎不存在:

gentest.cc:

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

如果您对我为什么要这样做感兴趣,那是因为我slider3.py用 python 编写了我的程序 (),而我的伙伴用 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.pychmod +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)

这在 make 期间无法运行(注意@模式在 中成功扩展Makefile):

gentest.cc:

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

关于如何sed在编译之前运行的任何想法gentest.cc

4

3 回答 3

5

不要使用就地 sed。

反而:

gentest_SOURCES = gentest-seded.cc

gentest-seded.cc : gentest.cc
    $(SED) "s|__PREFIX__|@prefix@|" $< >$@
于 2009-08-25T12:40:21.117 回答
5

你有没有考虑过#define在 config.h 中使用它(你正在使用autotools,对吗?)或者-D在编译时使用它?对于sed.

Andrew Y 回答的详细信息:

在您的 C++ 源代码中,指定:

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

然后编译

-DSCRIPTPREFIX='"/your/script/prefix"'
于 2009-08-25T12:44:36.500 回答
0

您是否考虑过直接从 C++ 调用 Python 代码?这是一个关于使用 boost 从 C++ 调用 python 函数的教程。您在这里描述的方法似乎很脆弱。

于 2009-08-25T12:46:11.057 回答