【发布时间】:2020-08-10 21:53:53
【问题描述】:
我有这个 Makefile。
# Variables
CC = gcc
CFLAGS = -Wall -g -c
ODUMP = objdump
ODFLAGS = -d
# Directories
OBJDIR := obj
TGTDIR := target
SRCDIR := src
DMPDIR := dump
# Sources list
SRCS := main.c kernel.c
# Sources location
VPATH := src:../headers
# Objects list
objects = $(notdir $(patsubst %.c,%.o,$(addprefix $(SRCDIR)/,$(SRCS))))
# Objects list with prefix
prefix_objs = $(addprefix $(OBJDIR)/, $(objects))
# Target name
target = main
$(target) : $(prefix_objs)
$(CC) -o $(TGTDIR)/$@ $(prefix_objs)
$(OBJDIR)/%.o: %.c | folders
$(CC) $(CFLAGS) -o $@ $<
$(ODUMP) $(ODFLAGS) $@ > $(DMPDIR)/$@
folders:
mkdir -p $(OBJDIR)
mkdir -p $(TGTDIR)
mkdir -p $(DMPDIR)/$(OBJDIR)
.PHONY: clean
clean:
rm -rf $(OBJDIR) $(TGTDIR) $(DMPDIR) *.o
我希望能够支持嵌套在 src 目录下的至少一层深度的“模块或功能”。我也希望能够不必手动构建 # Sources list SCRS := main.c kernel.c
我的文件夹结构如下
| dump
| obj
| src ----
| kernel.c
| kernel.h
| main.c
| target
| .gitignore
| Makefile
| README.md
不过,我希望能够支持。
| dump
| obj
| src ----
| kernel ----
| kernel.h
| thing.c
| kernel.c
| any.c
| feature1 ----
| ...whatever files
| main.c
| target
| .gitignore
| Makefile
| README.md
如果你看看我的folders 规则。我必须显式创建$(DMPDIR)/$(OBJDIR),因为$(OBJDIR)/%.o 目标会添加前缀,即使对于转储文件也是如此。如果我开始为我的“功能”添加文件夹,我也需要支持 mkdir,因为它是obj/kernel/kernal.o。我还需要列出 SRCS 中的每个文件......现在使用 VPATH 的推荐方式也已经崩溃,因为它不再只是 src。似乎增加了一个新的要求已经增加了扩展这个 Makefile 的难度。是否有任何 GNU Make 技巧来帮助支持嵌套目录?
【问题讨论】:
-
是否要在
obj/中重新创建src/的目录结构? -
@Beta 我对此并不特别关心。如果我猜我有重复的文件名,结构可能会很好。