我有一个构建过程,它调用 CORBA IDL 编译器来生成 .cc 文件作为中间步骤,并且我希望在临时目录中创建这些文件,以便使用 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 编译器的正确方法是什么?
最佳答案
此处的相关详细信息是“并将 .hh/.cc 文件放入 ${srcdir}/idlscratch 目录中”。这样做,它也会在 make 中工作。
问题是像 %SK.cc: %.idl
这样的规则需要 make(默认情况下)在同一位置查找目标及其先决条件以及源文件和所需的输出文件不再位于同一位置。
您可以通过多种方式解决这个问题。最简单的方法是使用 make 的 vpath 指令/功能来指示它在搜索先决条件时可以搜索其他源目录。将 vpath %.idl ${srcdir}
添加到 makefile 可能足以使此工作正常进行。
或者,您可以手动(或者半手动)创建各个输入和输出文件之间的关系,然后使用 %SK.cc:
规则(注意:没有 %.idl
prereq 在此行)提供构建 %SK.cc
文件的方法(使用之前设置的先决条件列表)。
关于c++ - 如何使用 IDL 编译器在临时目录中构建中间 C++ 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26169016/