在Makefile.am中为SED调用源代码

Jer*_*y L 3 automake sed autotools

我有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

Dou*_*der 5

不要使用就地sed.

代替:

gentest_SOURCES = gentest-seded.cc

gentest-seded.cc : gentest.cc
    $(SED) "s|__PREFIX__|@prefix@|" $< >$@
Run Code Online (Sandbox Code Playgroud)


Mic*_*ker 5

你有没有考虑过#define在config.h中使用它(你正在使用autotools,对吗?)或-D在编译时使用它?事实并非如此sed.

Andrew Y回答的细节:

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

argv2[0] = SCRIPTPREFIX "/bin/slider3.py";
Run Code Online (Sandbox Code Playgroud)

然后编译

-DSCRIPTPREFIX='"/your/script/prefix"'
Run Code Online (Sandbox Code Playgroud)

  • 如果你有config.h(AC_CONFIG_HEADERS),你可以在configure.ac中使用AC_DEFINE_UNQUOTED([THE_PREFIX],["$ prefix"])之类的东西.你真的必须玩它,用文档和其他来源来获得感觉.将CPPFLAGS添加到Makefile.am并使用-DTHE_PREFIX = \"@前缀@ \"(或类似的东西 - 注意正确的转义)可能更容易.在这两种情况下,您都可以在代码中执行THE_PREFX"/bin/slider3.py".这让我觉得你可能更喜欢@ bindir @ over @ prefix @. (2认同)