0%

Makefile 静态模板使用

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 $@

Ref

  1. 静态模式
  2. 规则的语法