我的文件夹结构是这样的:
build
ch01
foo.c
bar.c
ch02
baz.c
meow.c
每个文件都是一个单独的程序,必须放入
build/
目录中具有相同名称的子文件夹中(整个构建位于.gitignore
中)
build
ch01
foo, bar
ch02
baz, meow
目前我有这个 Makefile 做我需要的事情,但我不喜欢它。
CC = gcc
CFLAGS = -g -Wall -Wextra -ansi
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRCS))
MD = mkdir
BINPREFIX = ../build
BUILD_DIR = $(BINPREFIX)/$(shell basename $(CURDIR))
all: $(OBJS)
$(OBJS): %.o: %.c
@test -d $(BUILD_DIR) || $(MD) -p $(BUILD_DIR)
$(CC) -c $(CFLAGS) $<
$(CC) $@ -o $(patsubst %.o,$(BUILD_DIR)/%,$@)
rm $@
clean:
rm -rf $(BUILD_DIR)
有两个问题。
all: $(OBJS) | $(BUILD_DIR)
$(BUILD_DIR):
$(MD) -p $@
它根本不运行
$(BUILD_DIR)
目标。
我最终得到了这个Makefile
CC = gcc
CFLAGS = -Wall -Wextra -ansi
MD = mkdir
BINPREFIX = ../build
BUILD_DIR = $(BINPREFIX)/$(shell basename $(CURDIR))
SRCS = $(wildcard *.c)
BINS = $(patsubst %.c,$(BUILD_DIR)/%,$(SRCS))
all: $(BINS)
$(BUILD_DIR):
$(MD) -p $(BUILD_DIR)
$(BINS): $(BUILD_DIR)/%: %.c | $(BUILD_DIR)
$(CC) $(CFLAGS) $< -o $@
clean:
rm -rf $(BUILD_DIR)
首先,我从当前目录中的所有 c 文件中创建一组目标,并在它们前面加上我想要放置所有二进制文件的
bin
目录。然后 $(BUILD_DIR)/%: %.c
执行相反的操作 - 将每个目标转换为源文件名。