目的:使用一个makefile,实现多源文件夹和多库文件夹的编译。
目录结构:test.c作为main函数所在文件,内部引用了test_a,test_b,test_c的函数和一个lib库。
方案1缺点,每次make所有文件都会重新编译。
原因:${TARGET_OUT}:$(notdir ${OBJECT}) ${LIB_OUT}。最终文件生成依赖$(notdir ${OBJECT}),会在根路径下寻找o文件,但是所有o文件都存在于out/obj下,找不到后就会重新生成依赖项
CC:=gcc
AR:=ar
BASE_DIR=${shell pwd}
BIN_DIR=${BASE_DIR}/out/bin
OBJ_DIR=${BASE_DIR}/out/obj
LIB_DIR=${BASE_DIR}/out/lib
SRC_DIR=${BASE_DIR}
LIB_NAME=lib_test.a
LIB_INCLUDE_LIST=-I${BASE_DIR}/lib/include
LIB_SRC_LIST=${BASE_DIR}/lib/src
LIB_OUT=${LIB_DIR}/${LIB_NAME}
INCLUDE_LIST+=-I${BASE_DIR}/a/include
INCLUDE_LIST+=-I${BASE_DIR}/b/include
INCLUDE_LIST+=-I${BASE_DIR}/c/include
SRC_LIST+=${BASE_DIR}
SRC_LIST+=${BASE_DIR}/a/src
SRC_LIST+=${BASE_DIR}/b/src
SRC_LIST+=${BASE_DIR}/c/src
VPATH+=${SRC_LIST}
VPATH+=${LIB_SRC_LIST}
CFLAGS+=-g
CFLAGS+=${INCLUDE_LIST}
CFLAGS+=${LIB_INCLUDE_LIST}
CFLAGS+=-L${LIB_DIR}
TARGET=test_out
TARGET_OUT=${BIN_DIR}/${TARGET}
SOURCE=$(foreach src_list_temp,${SRC_LIST},${shell find ${src_list_temp} -maxdepth 1 -name "*.c"})
OBJECT=$(foreach src_temp,${SOURCE},$(subst ${SRC_DIR},${OBJ_DIR},$(patsubst %.c,%.o,${src_temp})))
LIB_SOURCE=$(foreach lib_src_list_temp,${LIB_SRC_LIST},${shell find ${lib_src_list_temp} -maxdepth 1 -name "*.c"})
LIB_OBJECT=$(foreach lib_src_temp,${LIB_SOURCE},$(subst ${SRC_DIR},${OBJ_DIR},$(patsubst %.c,%.o,${lib_src_temp})))
${TARGET_OUT}:$(notdir ${OBJECT}) ${LIB_OUT}
@mkdir -p ${BIN_DIR}
${CC} -o $@ $(foreach temp,$(filter %.o,$^),${shell find ${OBJ_DIR} -name ${temp}}) ${LIB_OUT}
%.o:%.c
@mkdir -p ${OBJ_DIR}$(subst ${SRC_DIR},,$(subst .,,$(dir $^))