我有一个生成过程,该过程将调用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/