我正在编写我的第一个Makefile来编译一些CORBA .idl
定义,以用作更大系统的一部分。我使用omniORB的omniidl
程序,该程序需要file.idl
并创建file.hh
和fileSK.cc
。每个.idl
都没有依赖关系,并使用命令omniidl -bcxx file.idl
创建。
从阅读GNU Make教程看起来,模式规则将完全符合我的需要。 .idl
转换的目标受GNU手册Section 10.5.2中bison
示例的启发。我的主要问题是如何实际触发这些规则?我已尝试将所有目标放入并引入.idl
的依赖但无济于事。
OMNIIDL := omniidl
DEPENDFLAGS := -g
CXX := g++
CXXFLAGS := $(DEPENDFLAGS) -Wall -Werror -ansi
%.o : %.cc
$(CXX) $(CXXFLAGS) -c $< -o $@
%.hh %SK.cc : %.idl
$(OMNIIDL) -bcxx $<
all : $(wildcard *.idl)
在相关说明中,通常应该在哪里放置自动生成的代码?我打算将已编译的.o
文件复制到我的项目的/lib
或/include
目录中,但.hh
和.cc
文件应保留在src
中文件夹或放在别处,以方便清洁过程?
答案 0 :(得分:3)
all
目标的依赖关系应该是目标文件列表,而不是idl文件列表。像这样:
all: $(patsubst %.idl, %SK.o, $(wildcard *.idl))
(为清楚起见,您还可以引入一个变量来保存idl文件列表,然后使用替换引用来获取目标文件列表:
IDLS := $(wildcard *.idl) all: $(IDLS:%.idl=%SK.o)
)