在《linux-Unix系统编程》一书中,发现作者的源码编译写的非常高明。虽然尚不能完全理解,顺手牵过来分享给大家。
一、项目结构
首先,项目的目录结构如下,lib是共享的源文件,fileio是一个模块,fileio的源文件会依赖到lib中的文件,这也是一般项目的结构
. ├── fileio │ ├── main │ ├── main2 │ ├── main2.c │ ├── main.c │ └── makefile ├── lib │ ├── function.c │ ├── function.h │ └── Makefile ├── libtlpi.a ├── Makefile └── Makefile.inc
二、一级目录的Makefile
一级目录的Makefile是make命令的配置文件,大概是按顺序将所有二级目录进行构建,这里的lib一定要在fileio之前
DIRS = lib fileio all: for i in $(DIRS); do (cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; done allgen: for dir in ${DIRS}; do (cd $${dir}; ${MAKE} allgen) ; done clean: for i in $(DIRS); do (cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1; done
一级目录的Makefile.inc是二级目录的Makefile都要引用到的
TLPI_DIR = .. TLPI_LIB = ${TLPI_DIR}/libtlpi.a TLPI_INCL_DIR = ${TLPI_DIR}/lib LINUX_LIBRT = -lrt LINUX_LIBDL = -ldl LINUX_LIBACL = -lacl LINUX_LIBCRYPT = -lcrypt LINUX_LIBCAP = -lcap IMPL_CFLAGS = -std=c99 -D_XOPEN_SOURCE=600 -D_DEFAULT_SOURCE -g -I${TLPI_INCL_DIR} -pedantic -Wall -W -Wmissing-prototypes -Wno-sign-compare -Wno-unused-parameter CFLAGS = ${IMPL_CFLAGS} IMPL_THREAD_FLAGS = -pthread IMPL_LDLIBS = ${TLPI_LIB} -lm LDLIBS = ${IMPL_LDLIBS} RM = rm -f
三、lib下的Makefile
include ../Makefile.inc allgen : ${TLPI_LIB} ${TLPI_LIB} : *.c ${CC} -c -g ${CFLAGS} *.c ${RM} ${TLPI_LIB} ${AR} rs ${TLPI_LIB} *.o clean : ${RM} *.o ${TLPI_LIB}
四、fileio中的makefile
include ../Makefile.inc GEN_EXE = main main2 LINUX_EXE = EXE = ${GEN_EXE} ${LINUX_EXE} all : ${EXE} allgen : ${GEN_EXE} clean : ${RM} ${EXE} *.o showall : @ echo ${EXE} ${EXE} : ${TLPI_LIB}
其中fileio/main.c,lib/function.h lib/function.c代码都在上一篇文章中,这里就不贴了