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

时间:2009-08-25 12:34:40

标签: sed autotools automake

我有c ++代码需要在编译之前完成它。如何将其放入Makefile.am

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

  

gentest.cc:

     
    

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

  

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

  

gentestMakefile.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运行的任何想法?

3 个答案:

答案 0 :(得分:5)

不要使用就地sed。

相反:

gentest_SOURCES = gentest-seded.cc

gentest-seded.cc : gentest.cc
    $(SED) "s|__PREFIX__|@prefix@|" $< >$@

答案 1 :(得分:5)

你有没有考虑#define在config.h中使用它(你正在使用autotools,对吗?)或在编译时使用-D传递它? sed确实不是这种情况。

Andrew Y回答的详细信息:

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

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

然后用

编译
-DSCRIPTPREFIX='"/your/script/prefix"'

答案 2 :(得分:0)

您是否考虑过直接从C ++调用Python代码?这是关于using boost to call python functions from C++的教程。你在这里描述的方法似乎非常脆弱。