C++ 如何使生成中间C++;使用IDL编译器在暂存目录中的文件?
作为中间步骤,我有一个调用CORBA IDL编译器生成.cc文件的构建过程,我希望在一个临时目录中创建这些文件,以便使用make clean更轻松地进行清理 我有以下有效的汽车制造规则:C++ 如何使生成中间C++;使用IDL编译器在暂存目录中的文件?,c++,gnu-make,automake,corba,C++,Gnu Make,Automake,Corba,作为中间步骤,我有一个调用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
if MAKE_CORBA
IDLFLAGS = -bcxx
$(shell mkdir -p ${srcdir}/idlscratch/
%SK.cc: %.idl
$(IDLCC) $(IDLFLAGS) @^
EXTRA_CORBA_SOURCES = ${srcdir}/blahSK.cc
endif
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
此规则有效,但它将.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(默认情况下)在同一位置查找目标及其prereq,并且源文件和所需输出文件不再位于同一位置
你可以通过多种方式来解决这个问题。最简单的方法是使用make的vpath
directive/feature来指示它在搜索先决条件时有额外的源目录可供搜索。将vpath%.idl${srcdir}
添加到makefile中可能就足够了
或者,您可以手动(也可以半手动)创建各个输入和输出文件之间的关系,然后使用
%SK.cc:
规则(注意:此行中没有%.idl
prereq)提供构建%SK.cc
文件的方法(使用先前设置的先决条件列表).经过一些实验,我能够创建以下规则:
if MAKE_CORBA
IDLFLAGS = -bcxx
$(shell mkdir -p ${srcdir}/idlscratch/
%SK.cc: %.idl
$(IDLCC) $(IDLFLAGS) @^
EXTRA_CORBA_SOURCES = ${srcdir}/blahSK.cc
endif
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
使用此规则,根据在$(IDLPATH)中是否有匹配的.idl文件,检查是否需要在${srcdir}/idlscratch/中构建blahSK.cc
像这样构建一个scratch dir还有一个额外的好处,那就是您可以添加一个规则来清除idlscratch dir,并在下一个make上强制重新编译.idl->.cc。否则,编译器不会尝试重新生成%SK.cc文件,除非它注意到相应的.idl文件发生了更改。哪个CORBA idl编译器?它与make调用的发生方式无关,但我使用的是Omni ORB 4.2.0。我问的原因是TAO会使用MPC工具自动为您处理这些。这当然有效。我不知道为什么我没有在我的答案中也列出这个选项。我想我假设您想保持更一般的
%SK.cc
规则不变。