递归编译的Makefile的达成
发布时间:2021-11-15 16:57:08 所属栏目:教程 来源:互联网
导读:最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译。具体的思路是借助第三方文件,将子模块编译好的.o文件的路径自动写到config.mk文件中,在总控Makfile中只需要include这个config.mk
最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译。具体的思路是借助第三方文件,将子模块编译好的.o文件的路径自动写到config.mk文件中,在总控Makfile中只需要include这个config.mk就可以。单个模块的编译只需要cd到相应目录就可以进行本模块的单独编译,整个程序的编译也只需要cd到顶层目录,分别执行make config,make,make install就可以进行编译和安装。下面这个就是顶层Makefile CROSS_COMPILE= #CC=/opt/arm-cross-compile/arm-2010.09/bin/arm-none-linux-gnueabi-gcc #CC=gcc CC=arm-linux-gnueabi-gcc D=-DDEBUG CFLAGS= -g -O3 $(D) export CC CFLAGS INCLUDE_DIR = $(shell cd ./common/include/; pwd) SUB_DIR= ./entry/ ./sqlite/ NFS_DIR:=~/nfs CORE_NAME = core $(shell touch config.mk) include ./config.mk all:$(OBJS) $(CC) $(CFLAGS) $^ -lpthread -L/home/jiang/nfs/usr/lib/ -lsqlite3 -o $(CORE_NAME) config: @echo "OBJS+=" > config.mk @for dir in $(SUB_DIR); do echo "n"; $(MAKE) -C $$dir ; echo "n"; done clean: $(RM) ./config.mk @for dir in $(SUB_DIR); do echo "n"; $(MAKE) -C $$dir clean; echo "n"; done install: cp $(CORE_NAME) $(NFS_DIR) 下面这个就是每一个子模块的Makfile,会把编译成功的.o文件路径添加到config.mk中 CUR_DIR=$(shell pwd) OBJ_DIR:=$(CUR_DIR)/obj INCLUDE_DIR= -I ./include -I ../common/include SRC=$(wildcard ./src/*.c) all:$(SRC) $(CC) $(CFLAGS) $(INCLUDE_DIR) -c $^ mv ./*.o $(OBJ_DIR) echo "${OBJ_DIR}/*.o " >> ../config.mk echo " |