Makefile 静态模板的使用
<targets ...> : <target-pattern> : <prereq-patterns ...>
<commands>
目录结构
$ tree -L 2
.
├── dirA
│ ├── dirA_1.c
│ ├── dirA_2.c
│ └── include
├── makefile
├── output
│ └── objects
└── dirB
├── include
└── dirB.c
源文件
SRC = $(shell find . -iname "*.c")
SRC = $(wildcard dirA/*.c) \
$(wildcard dirB/*.c)
Makefile 规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数 wildcard
目标文件
OBJ = $(SRC:.c=.o)
OBJ = $(addprefix $(objects_dir)/, $(SRC:.c=.o))
OBJ = $(SRC:.c=.o)
这个表示.obj
与.c
位于同一个目录下OBJ = $(addprefix $(objects_dir)/, $(SRC:.c=.o))
.obj
统一放到$(objects_dir)
目录下
include
SUBDIR = dirA
SUBDIR += dirB
CFLAGS += $(patsubst %, -I%, $(SUBDIR))
规则
静态模板
SRC = $(wildcard dirA/*.c) \
$(wildcard dirB/*.c)
OBJ = $(SRC:.c=.o)
$(TARGET): $(OBJ)
@echo "Generating new lib\033[1;31m: $@\033[0m"
@$(AR) -rcs $@ $^
$(OBJ): %.o: %.c
@echo "compiling \033[032m[$(CC)]\033[0m": $<
@$(CC) -c $(CFLAGS) $< -o $@
obj 文件制定路径
SRC = $(wildcard dirA/*.c) \
$(wildcard dirB/*.c)
OBJ = $(addprefix $(objects_dir)/, $(SRC:.c=.o))
$(TARGET): $(OBJ)
@echo "Generating new lib\033[1;31m: $@\033[0m"
@$(AR) -rcs $@ $^
$(objects_dir)/%.o: %.c dirmake
@echo "compiling \033[032m[$(CC)]\033[0m": $<
@$(CC) -c $(CFLAGS) $< -o $@