如何使用IDL编译器在临时目录中构建中间C ++文件?

时间:2014-10-02 20:22:17

标签: c++ gnu-make automake corba

我有一个构建过程调用CORBA IDL编译器生成.cc文件作为中间步骤,我希望在scratch目录中创建这些文件,以便make clean更容易清理。

我有以下适用的automake规则:

if MAKE_CORBA
IDLFLAGS = -bcxx

$(shell mkdir -p ${srcdir}/idlscratch/

%SK.cc: %.idl
    $(IDLCC) $(IDLFLAGS) @^

EXTRA_CORBA_SOURCES = ${srcdir}/blahSK.cc

endif

此规则有效,但它将.cc文件放在 $ {srcdir} 而不是 $ {srcdir} / idlscratch / 中,因此我将其更改为以下规则这不起作用:

if MAKE_CORBA
IDLFLAGS = -bcxx -C${srcdir}/idlscratch/

$(shell mkdir -p ${srcdir}/idlscratch/

%SK.cc: %.idl
    $(IDLCC) $(IDLFLAGS) @^

EXTRA_CORBA_SOURCES = ${srcdir}/idlscratch/blahSK.cc

endif

此规则应调用IDL编译器使其吐出 $ {srcdir} / idlscratch / 中的.cc / .hh文件,但是,它似乎没有调用编译器,而是我明白了:

make[2]: *** No rule to make target `idlscratch/blahSK.cc', needed by `blahSK.o'. Stop.

但是,我发现,如果我手动调用IDL编译器并将.hh / .cc文件放在 $ {srcdir} / idlscratch 目录中,那么编译就会成功完成。

因此,似乎make并不认识blahSK.cc文件需要在子目录中调用IDL编译器。

当输出是子目录时,创建一个规则会导致make系统正确调用IDL编译器的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

这里的相关细节是"并将.hh / .cc文件放在$ {srcdir} / idlscratch目录"中。这样做,它也可以在制作中使用。

问题是像%SK.cc: %.idl这样的规则要求make(默认情况下)在同一位置找到目标及其先决条件,而源文件和所需的输出文件不再位于同一位置。< / p>

你可以通过多种方式解决这个问题。最简单的方法是使用make的vpath指令/特性来指示在搜索先决条件时还有其他源目录可供搜索。将vpath %.idl ${srcdir}添加到makefile可能足以使其工作。

或者,您可以手动(半手动)创建单个输入和输出文件之间的关系,然后使用%SK.cc:规则(注意:此行没有%.idl先决条件)来提供构建%SK.cc文件的方法(使用先前设置的先决条件列表)。

答案 1 :(得分:1)

经过一些实验,我能够创建以下有效的规则:

if MAKE_CORBA
IDLFLAGS = -bcxx -C${srcdir}/idlscratch/ -I$(IDLINCPATH)

$(shell mkdir -p ${srcdir}/idlscratch/

${srcdir}/idlscratch/%SK.cc: $(IDLPATH)/%.idl
    $(IDLCC) $(IDLFLAGS) $^

AM_CPPFLAGS += -I$(srcdir)/idlscratch/

EXTRA_CORBA_SOURCES = ${srcdir}/idlscratch/blahSK.cc

endif

使用此规则,根据是否具有匹配的.idl,检查是否需要在 $ {srcdir} / idlscratch / 中构建 blahSK.cc 文件在 $(IDLPATH)。

建立一个像这样的临时目录还有一个额外的好处,你可以添加一个规则来清理,将吹掉idlscratch目录并强制重新编译.idl-&gt; .cc在下一个make。否则,编译器不会尝试重新编译%SK.cc文件,除非它注意到相应的.idl文件发生了更改。