Makefile子目录规则编写方法 如何让目标构建自动校验子目录依赖变更
核心修改思路
- 拆分原来
subsystem的冗余逻辑,仅保留子目录库构建的动作 - 给最终目标
$(NAME)添加subsystem前置依赖,保证任何场景下构建prog_name都会先检查子库变更 - 去掉
subsystem中递归调用make构建$(NAME)的逻辑,避免重复执行和依赖混乱
修改后规则示例
... NAME := prog_name ... all: $(NAME) # subsystem仅负责子目录库构建 subsystem: @$(MAKE) -sC $(D_LIB) $(D_OBJ): @mkdir -p $(D_OBJ) # 给NAME添加subsystem依赖,确保构建前先检查子库变更 $(NAME): subsystem $(D_OBJ) $(OBJ) $(H) $(LIB) $(CC) ... -o $(NAME) $(D_OBJ)%.o: $(D_SRC)%.c $(H) $(LIB) @$(CC) ... -c $< -o $@ .PHONY: all subsystem
效果说明
调整后不管执行make all还是直接执行make prog_name,都会先触发subsystem规则检查$(D_LIB)下的变更:子库有更新的话会先完成子库的重新构建,再继续当前项目的编译链接逻辑,完全覆盖你需要的全依赖检查场景。
如果需要更精细化的子库变更感知(避免每次都触发子目录make调用),可以额外给$(LIB)对应的库文件添加依赖规则,绑定子库的源码文件即可。
内容的提问来源于stack exchange,提问作者vsezanatodazheeto
相关产品推荐
相关产品推荐

