如何在主项目中自动编译依赖Git子模块的程序?
依赖Git子模块的项目高效编译方案
你当前的项目依赖Git子模块guard,子模块自带Makefile可编译出guard.o,但现在需要手动先进入子模块执行make,再回到主项目编译,效率很低。通过修改主项目的Makefile,就能让它自动处理子模块的编译流程,具体做法如下:
1. 给子模块目标文件添加自动编译规则
在主Makefile中,为guard/guard.o添加规则,让make自动触发子模块的编译命令:
guard/guard.o: $(MAKE) -C guard
这里$(MAKE)是make的内置变量,会自动调用当前系统的make工具;-C guard表示切换到guard目录执行该目录下的Makefile。
如果想更严谨,可让guard/guard.o依赖子模块的源文件,这样子模块的guard.c或guard.h改动时,主Makefile会自动重新编译子模块:
guard/guard.o: guard/guard.c guard/guard.h $(MAKE) -C guard
不过子模块自身的Makefile已经处理了内部依赖,所以第一条简单规则已能满足需求。
2. 整合clean命令(可选)
如果希望执行make clean时同时清理子模块的编译产物,可修改主Makefile的clean目标:
clean: rm -rf temp ./*.o a.out $(MAKE) -C guard clean
修改后的完整主Makefile
cc = gcc objs = temp/main.o temp/list.o guard/guard.o dirs = temp CFLAGS = -O1 main: $(objs) $(cc) $(CFLAGS) -o a.out $(objs) temp/main.o: main.c $(cc) -c -g -o temp/main.o main.c temp/list.o: list.h list.c $(cc) -c -g -o temp/list.o list.c # 自动编译子模块的规则 guard/guard.o: $(MAKE) -C guard .PHONY: clean clean: rm -rf temp ./*.o a.out $(MAKE) -C guard clean $(shell mkdir -p $(dirs))
修改完成后,你只需在主项目目录执行一次make,它会自动检查子模块的guard.o是否存在,不存在或子模块文件有更新时,会先编译子模块,再完成主项目的链接。执行make clean也会同时清理子模块的编译文件,完全无需手动切换目录操作。
内容的提问来源于stack exchange,提问作者Stone Paul
相关产品推荐
相关产品推荐

