c ++ makefile - 如何处理混合源文件后缀的规则(例如.cpp和.cxx)

时间:2018-03-29 12:50:08

标签: c++ makefile

我的项目有混合源文件(由于第三方代码),所以我们有一些.cpp和一些.cxx文件。

继我之前的问题here后,我有以下makefile:

# Folders
SRCDIR = src
OBJDIR = obj
SUBFOLDERS = test test/test2
OBJSUBFOLDERS = $(OBJDIR) $(addprefix $(OBJDIR)/, $(SUBFOLDERS))
SRCSUBFOLDERS = $(SRCDIR) $(addprefix $(SRCDIR)/, $(SUBFOLDERS))

# Just for me so I can read my own makefile :o
_TARGET = $@
_DEPEND = $<

# Get sources from /src and /src/test/ and /src/test/test2/
SOURCES = $(foreach dir, $(SRCSUBFOLDERS), $(wildcard $(dir)/*.cpp $(dir)/*.cxx))
# Source file without the /src at the start, then take the basename, then add .o, then add obj/ to the front
OBJECTS = $(addprefix $(OBJDIR)/, $(addsuffix .o, $(basename $(patsubst src/%, %, $(SOURCES)))))

# Main target 'make debug'
debug: debugging $(OBJECTS)
    @echo building: gcc $(OBJECTS) -o out.exe

# Compiling each file
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp         <---- ISSUE HERE
    g++ -c $(_DEPEND) -o $(_TARGET)

debugging:
    @echo $(SOURCES)
    @echo $(OBJECTS)

所以我生成了一个源文件和目标文件列表。对象是.cpp和.cxx。所以我的规则$(OBJDIR)/%.o: $(SRCDIR)/%.cpp仅适用于.cpp文件。我试图让它$(OBJDIR)/%.o: $(SRCDIR)/%.c*,但那不起作用。如何使此规则通用以处理任何一个。或者有更好的方法吗?

如果我从$(dir)/*.cxx删除SOURCES =,那么这一切都有效,但只适用于.cpp文件。

更新

以下是我得到的输出:

SOURCES: src/main.cpp src/test/test.cpp src/test/test2.cxx
OBJECTS: obj/main.o obj/test/test.o obj/test/test2.o

Error: No rule to make target 'obj/test/test2.o', needed by 'debug'

1 个答案:

答案 0 :(得分:1)

您可以有多个规则来构建来自不同扩展程序的目标。

例如,默认的Makefile规则已经包含了从.cppmake构建$(OBJDIR)/%.o: $(SRCDIR)/%.cpp g++ -c $(_DEPEND) -o $(_TARGET) $(OBJDIR)/%.o: $(SRCDIR)/%.cxx g++ -c $(_DEPEND) -o $(_TARGET) 的规则。 properties只使用后缀listed for the .SUFFIXES target搜索第一个数学规则。

在您的情况下,您只需要两条规则:

    {
  "rules": {
    "maintenance" : {
      "$uid" : {
    ".read": "$uid === auth.uid",
    ".write": "$uid === auth.uid"
  }
},
    "properties" : {
      ".read": true,
      ".write": false
    }
}
}