我有一个生成过程,该过程将调用CORBA IDL编译器以生成.cc文件,作为一个中间步骤,并且我希望这些文件可以在临时目录中创建,以使make clean更容易进行清理。

我有以下有效的自动制作规则:

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编译器?

最佳答案

这里的相关详细信息是“并将.hh / .cc文件放在$ {srcdir} / idlscratch目录中”。这样做,它也会在make中起作用。

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

您可以通过多种方式解决此问题。最简单的方法是使用vpath指令/ make的功能来指示它,在搜索先决条件时还有其他源目录可供搜索。在生成文件中添加vpath %.idl ${srcdir}可能足以完成此工作。

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

关于c++ - 如何使用IDL编译器在临时目录中构建中间C++文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26169016/

10-14 05:58