xxxxxxxxxx
71$ cd ~/Projects
2$ cp ../Downloads/fastdfs-6.06.tar.gz .
3$ gunzip fastdfs-6.06.tar.gz
4$ tar -xvf fastdfs-6.06.tar
5$ cd fastdfs-6.06
6$ ./make.sh
7$ sudo ./make.sh install
执行fastdfs-6.06目录下的make.sh脚本,将分别在tracker、storage、client及其中的test子目录下生成Makefile文件,并通过make命令构建跟踪服务器、存储服务器和客户机。如下图所示:
执行该脚本时若提供install参数,将会把跟踪服务器、存储服务器和客户机的可执行程序、用于重启和停止服务器的Shell脚本、系统服务脚本、配置文件模板、客户端库的头文件、库文件及测试程序等,拷贝到系统的特定目录下。如下图所示:
/usr/bin目录
fdfs_trackerd、fdfs_storaged等15个可执行程序;
restart.sh和stop.sh两个Shell脚本。
/usr/include/fastdfs目录
mime_file_parser.h、trunk_shared.h等15个C语言头文件。
/usr/lib目录
客户端库静态库libfdfsclient.a或共享库libfdfsclient.so文件。
/usr/lib64目录
同/usr/lib目录。
/etc/fdfs目录
tracker.conf.sample、storage.conf.sample等六个配置文件模板。
/etc/init.d目录
fdfs_trackerd和fdfs_storaged两个系统服务脚本。
xxxxxxxxxx
41# 是否安装静态库形式的客户端库
2ENABLE_STATIC_LIB=0
3# 是否安装共享库形式的客户端库
4ENABLE_SHARED_LIB=1
静态库形式的客户端库:libfdfsclient.a 共享库形式的客户端库:libfdfsclient.so
xxxxxxxxxx
61# 可执行程序和客户端库目录前缀
2TARGET_PREFIX=$DESTDIR/usr
3# 配置文件目录
4TARGET_CONF_PATH=$DESTDIR/etc/fdfs
5# 服务脚本目录
6TARGET_INIT_PATH=$DESTDIR/etc/init.d
xxxxxxxxxx
21# 是否做成系统服务
2WITH_LINUX_SERVICE=1
一旦做成系统服务,即可通过如下命令,使跟踪服务器和存储服务器作为系统服务的一部分,在操作系统启动时自动启动:
xxxxxxxxxx
21$ sudo update-rc.d fdfs_trackerd defaults
2$ sudo update-rc.d fdfs_storaged defaults
以上两条命令中的fdfs_trackerd和fdfs_storaged,即位于/etc/init.d目录下的系统服务脚本。
xxxxxxxxxx
21# 是否调试模式
2DEBUG_FLAG=1
调试模式意味着使用以下三个编译选项:
-g
-O1
-DDEBUG_FLAG
而非调试模式则只使用-O3选项。
xxxxxxxxxx
111# 打印所有警告,用64位整数表示文件偏移,使用超出POSIX标准的GNU扩展特性
2CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE'
3# 若调试模式
4if [ "$DEBUG_FLAG" = "1" ]; then
5 # 产生调试信息,使用初级优化,定义DEBUG_FLAG宏
6 CFLAGS="$CFLAGS -g -O1 -DDEBUG_FLAG"
7# 否则
8else
9 # 使用高级优化
10 CFLAGS="$CFLAGS -O3"
11fi
关于GCC编译器的优化编译选项:
O0 - 不做优化;
O1 - 初级优化:在不牺牲编译时间的前提下,尽量优化可执行代码的空间大小和运行速度;
O2 - 中级优化:以牺牲编译时间为代价,采用目标配置支持的所有算法,优化大小和速度;
O3 - 高级优化:充分利用现代处理器中的缓存、流水线等技术手段,提高代码的并行程度。
xxxxxxxxxx
131# 若有/usr/include/fastcommon/_os_define.h文件
2if [ -f /usr/include/fastcommon/_os_define.h ]; then
3 # 取该文件中OS_BITS所在行的最后一列作为系统字长
4 OS_BITS=$(fgrep OS_BITS /usr/include/fastcommon/_os_define.h | awk '{print $NF;}')
5# 否则若有/usr/local/include/fastcommon/_os_define.h文件
6elif [ -f /usr/local/include/fastcommon/_os_define.h ]; then
7 # 取该文件中OS_BITS所在行的最后一列作为系统字长
8 OS_BITS=$(fgrep OS_BITS /usr/local/include/fastcommon/_os_define.h | awk '{print $NF;}')
9# 否则
10else
11 # 默认系统字长64位
12 OS_BITS=64
13fi
/usr/include/fastcommon或/usr/local/include/fastcommon目录是libfastcommon库的头文件目录。位于该目录下的_os_define.h文件定义了一组与操作系统有关的宏,其中包括:
xxxxxxxxxx
11
或
xxxxxxxxxx
11
分别表示当前操作系统的字长是32位或64位。
以64位Ubuntu为例:
xxxxxxxxxx
21# 获取操作系统的名称
2uname=$(uname)
xxxxxxxxxx
161# 若64位系统
2if [ "$OS_BITS" -eq 64 ]; then
3 # 若Darwin系统
4 if [ "$uname" = "Darwin" ]; then
5 # 客户端库的库文件放在lib目录下
6 LIB_VERSION=lib
7 # 否则
8 else
9 # 客户端库的库文件放在lib64目录下
10 LIB_VERSION=lib64
11 fi
12# 否则
13else
14 # 客户端库的库文件放在lib目录下
15 LIB_VERSION=lib
16fi
一般情况下,客户端库的库文件,在32位系统上放在/usr/lib目录下,而在64位系统上则放在/usr/lib64目录下,但在苹果系统上,则无论32位还是64位,一律放在/usr/lib目录下。
xxxxxxxxxx
501# 链接选项
2LIBS=''
3# 若Linux系统
4if [ "$uname" = "Linux" ]; then
5 # 若64位系统
6 if [ "$OS_BITS" -eq 64 ]; then
7 # 库路径为/usr/lib64
8 LIBS="$LIBS -L/usr/lib64"
9 # 否则
10 else
11 # 库路径为/usr/lib
12 LIBS="$LIBS -L/usr/lib"
13 fi
14 CFLAGS="$CFLAGS"
15# 否则若FreeBSD或Darwin系统
16elif [ "$uname" = "FreeBSD" ] || [ "$uname" = "Darwin" ]; then
17 # 库路径为/usr/lib
18 LIBS="$LIBS -L/usr/lib"
19 CFLAGS="$CFLAGS"
20 # 若Darwin系统
21 if [ "$uname" = "Darwin" ]; then
22 # 定义DARWIN宏
23 CFLAGS="$CFLAGS -DDARWIN"
24 # 在可执行程序和客户端库目录前缀后面追加local
25 TARGET_PREFIX=$TARGET_PREFIX/local
26 fi
27# 否则若SunOS系统
28elif [ "$uname" = "SunOS" ]; then
29 # 库路径为/usr/lib
30 LIBS="$LIBS -L/usr/lib"
31 # 定义_THREAD_SAFE宏
32 CFLAGS="$CFLAGS -D_THREAD_SAFE"
33 # 链接socket库、nsl库和resolv库
34 LIBS="$LIBS -lsocket -lnsl -lresolv"
35 # 设置CC环境变量的值为gcc
36 export CC=gcc
37# 否则若AIX系统
38elif [ "$uname" = "AIX" ]; then
39 # 库路径为/usr/lib
40 LIBS="$LIBS -L/usr/lib"
41 # 定义_THREAD_SAFE宏
42 CFLAGS="$CFLAGS -D_THREAD_SAFE"
43 # 设置CC环境变量的值为gcc
44 export CC=gcc
45# 否则若HP-UX系统
46elif [ "$uname" = "HP-UX" ]; then
47 # 库路径为/usr/lib
48 LIBS="$LIBS -L/usr/lib"
49 CFLAGS="$CFLAGS"
50fi
不同操作系统的链接选项LIBS、编译选项CFLAGS、可执行程序和客户端库目录前缀TARGET_PREFIX,以及CC环境变量,会有所不同。
xxxxxxxxxx
621# 是否有POSIX线程库
2have_pthread=0
3# 若有POSIX线程库
4if [ -f /usr/lib/libpthread.so ] || [ -f /usr/local/lib/libpthread.so ] || [ -f /lib64/libpthread.so ] || [ -f /usr/lib64/libpthread.so ] || [ -f /usr/lib/libpthread.a ] || [ -f /usr/local/lib/libpthread.a ] || [ -f /lib64/libpthread.a ] || [ -f /usr/lib64/libpthread.a ]; then
5 # 链接POSIX线程库
6 LIBS="$LIBS -lpthread"
7 have_pthread=1
8# 否则若HP-UX系统
9elif [ "$uname" = "HP-UX" ]; then
10 # 若有POSIX线程库
11 lib_path="/usr/lib/hpux$OS_BITS"
12 if [ -f $lib_path/libpthread.so ]; then
13 # 链接POSIX线程库
14 LIBS="-L$lib_path -lpthread"
15 have_pthread=1
16 fi
17# 否则若FreeBSD系统
18elif [ "$uname" = "FreeBSD" ]; then
19 # 若/usr/lib目录下有c_r库
20 if [ -f /usr/lib/libc_r.so ]; then
21 # 若是POSIX线程库
22 line=$(nm -D /usr/lib/libc_r.so | grep pthread_create | grep -w T)
23 if [ $? -eq 0 ]; then
24 # 链接POSIX线程库
25 LIBS="$LIBS -lc_r"
26 have_pthread=1
27 fi
28 # 否则若/lib64目录下有c_r库
29 elif [ -f /lib64/libc_r.so ]; then
30 # 若是POSIX线程库
31 line=$(nm -D /lib64/libc_r.so | grep pthread_create | grep -w T)
32 if [ $? -eq 0 ]; then
33 # 链接POSIX线程库
34 LIBS="$LIBS -lc_r"
35 have_pthread=1
36 fi
37 # 否则若/usr/lib64目录下有c_r库
38 elif [ -f /usr/lib64/libc_r.so ]; then
39 # 若是POSIX线程库
40 line=$(nm -D /usr/lib64/libc_r.so | grep pthread_create | grep -w T)
41 if [ $? -eq 0 ]; then
42 # 链接POSIX线程库
43 LIBS="$LIBS -lc_r"
44 have_pthread=1
45 fi
46 fi
47fi
48# 若未找到POSIX线程库且非Darwin系统
49if [ $have_pthread -eq 0 ] && [ "$uname" != "Darwin" ]; then
50 # 若共享库路径缓存中有POSIX线程库
51 /sbin/ldconfig -p | fgrep libpthread.so > /dev/null
52 if [ $? -eq 0 ]; then
53 # 链接POSIX线程库
54 LIBS="$LIBS -lpthread"
55 # 否则
56 else
57 # 报错
58 echo -E 'Require pthread lib, please check!'
59 # 退出
60 exit 2
61 fi
62fi
不同操作系统POSIX线程库的安装目录和文件名有所不同,若能找到,则将其添加到链接选项LIBS中。
xxxxxxxxxx
111# 跟踪服务器附加模块
2TRACKER_EXTRA_OBJS=''
3# 存储服务器附加模块
4STORAGE_EXTRA_OBJS=''
5# 若调试模式
6if [ "$DEBUG_FLAG" = "1" ]; then
7 # 在跟踪服务器附加模块中增加跟踪服务器转储模块
8 TRACKER_EXTRA_OBJS="$TRACKER_EXTRA_OBJS tracker_dump.o"
9 # 在存储服务器附加模块中增加存储服务器转储模块
10 STORAGE_EXTRA_OBJS="$STORAGE_EXTRA_OBJS storage_dump.o"
11fi
跟踪服务器和存储服务器的转储模块仅在调试模式下启用。
xxxxxxxxxx
161# 进入跟踪服务器代码目录
2cd tracker
3# 将跟踪服务器构建脚本模板复制为跟踪服务器构建脚本
4cp Makefile.in Makefile
5# 填写编译选项
6perl -pi -e "s#\\\$\(CFLAGS\)#$CFLAGS#g" Makefile
7# 填写链接选项
8perl -pi -e "s#\\\$\(LIBS\)#$LIBS#g" Makefile
9# 填写可执行程序和客户端库目录前缀
10perl -pi -e "s#\\\$\(TARGET_PREFIX\)#$TARGET_PREFIX#g" Makefile
11# 填写跟踪服务器附加模块
12perl -pi -e "s#\\\$\(TRACKER_EXTRA_OBJS\)#$TRACKER_EXTRA_OBJS#g" Makefile
13# 填写配置文件目录
14perl -pi -e "s#\\\$\(TARGET_CONF_PATH\)#$TARGET_CONF_PATH#g" Makefile
15# 构建跟踪服务器
16make $1 $2
将编译选项(CFLAGS)、链接选项(LIBS)等变量的值,代入跟踪服务器构建脚本模板(tracker/Makefile.in)中的相应变量,生成跟踪服务器构建脚本(tracker/Makefile),执行make命令,得到跟踪服务器可执行程序(fdfs_trackerd),并在提供install参数情况下完成安装。如下图所示:
xxxxxxxxxx
161# 进入存储服务器代码目录
2cd ../storage
3# 将存储服务器构建脚本模板复制为存储服务器构建脚本
4cp Makefile.in Makefile
5# 填写编译选项
6perl -pi -e "s#\\\$\(CFLAGS\)#$CFLAGS#g" Makefile
7# 填写链接选项
8perl -pi -e "s#\\\$\(LIBS\)#$LIBS#g" Makefile
9# 填写可执行程序和客户端库目录前缀
10perl -pi -e "s#\\\$\(TARGET_PREFIX\)#$TARGET_PREFIX#g" Makefile
11# 填写存储服务器附加模块
12perl -pi -e "s#\\\$\(STORAGE_EXTRA_OBJS\)#$STORAGE_EXTRA_OBJS#g" Makefile
13# 填写配置文件目录
14perl -pi -e "s#\\\$\(TARGET_CONF_PATH\)#$TARGET_CONF_PATH#g" Makefile
15# 构建存储服务器
16make $1 $2
将编译选项(CFLAGS)、链接选项(LIBS)等变量的值,代入存储服务器构建脚本模板(storage/Makefile.in)中的相应变量,生成存储服务器构建脚本(storage/Makefile),执行make命令,得到存储服务器可执行程序(fdfs_storaged),并在提供install参数情况下完成安装。如下图所示:
xxxxxxxxxx
241# 进入客户机代码目录
2cd ../client
3# 将客户机构建脚本模板复制为客户机构建脚本
4cp Makefile.in Makefile
5# 填写编译选项
6perl -pi -e "s#\\\$\(CFLAGS\)#$CFLAGS#g" Makefile
7# 填写链接选项
8perl -pi -e "s#\\\$\(LIBS\)#$LIBS#g" Makefile
9# 填写可执行程序和客户端库目录前缀
10perl -pi -e "s#\\\$\(TARGET_PREFIX\)#$TARGET_PREFIX#g" Makefile
11# 填写客户端库的库文件目录
12perl -pi -e "s#\\\$\(LIB_VERSION\)#$LIB_VERSION#g" Makefile
13# 填写配置文件目录
14perl -pi -e "s#\\\$\(TARGET_CONF_PATH\)#$TARGET_CONF_PATH#g" Makefile
15# 填写是否安装静态库形式的客户端库
16perl -pi -e "s#\\\$\(ENABLE_STATIC_LIB\)#$ENABLE_STATIC_LIB#g" Makefile
17# 填写是否安装共享库形式的客户端库
18perl -pi -e "s#\\\$\(ENABLE_SHARED_LIB\)#$ENABLE_SHARED_LIB#g" Makefile
19# 将共享库符号链接创建脚本模板复制为共享库符号链接创建脚本
20cp fdfs_link_library.sh.in fdfs_link_library.sh
21# 填写可执行程序和客户端库目录前缀
22perl -pi -e "s#\\\$\(TARGET_PREFIX\)#$TARGET_PREFIX#g" fdfs_link_library.sh
23# 构建客户机
24make $1 $2
将编译选项(CFLAGS)、链接选项(LIBS)等变量的值,代入客户机构建脚本模板(client/Makefile.in)中的相应变量,生成客户机构建脚本(client/Makefile),执行make命令,得到客户机可执行程序(fdfs_monitor、fdfs_test等)和客户端库文件(libfdfsclient.a和libfdfsclient.so),并在提供install参数情况下完成安装。如下图所示:
xxxxxxxxxx
121# 进入客户端库测试程序代码目录
2cd test
3# 将客户端库测试程序构建脚本模板复制为客户端库测试程序构建脚本
4cp Makefile.in Makefile
5# 填写编译选项
6perl -pi -e "s#\\\$\(CFLAGS\)#$CFLAGS#g" Makefile
7# 填写链接选项
8perl -pi -e "s#\\\$\(LIBS\)#$LIBS#g" Makefile
9# 填写可执行程序和客户端库目录前缀
10perl -pi -e "s#\\\$\(TARGET_PREFIX\)#$TARGET_PREFIX#g" Makefile
11# 返回上级目录,即客户机代码目录(client)
12cd ..
将编译选项(CFLAGS)、链接选项(LIBS)等变量的值,代入客户端库测试程序构建脚本模板(client/test/Makefile.in)中的相应变量,生成客户端库测试程序构建脚本(client/test/Makefile)。如下图所示:
xxxxxxxxxx
421# 若提供install参数
2if [ "$1" = "install" ]; then
3 # 返回上级目录,即项目目录(fastdfs-6.06)
4 cd ..
5 # /usr/bin/restart.sh
6 cp -f restart.sh $TARGET_PREFIX/bin
7 # /usr/bin/stop.sh
8 cp -f stop.sh $TARGET_PREFIX/bin
9 # 若Linux系统
10 if [ "$uname" = "Linux" ]; then
11 # 若做成系统服务
12 if [ "$WITH_LINUX_SERVICE" = "1" ]; then
13 # 若无/etc/fdfs目录
14 if [ ! -d /etc/fdfs ]; then
15 # 创建/etc/fdfs目录
16 mkdir -p /etc/fdfs
17 # /etc/fdfs/tracker.conf.sample
18 cp -f conf/tracker.conf $TARGET_CONF_PATH/tracker.conf.sample
19 # /etc/fdfs/storage.conf.sample
20 cp -f conf/storage.conf $TARGET_CONF_PATH/storage.conf.sample
21 # /etc/fdfs/client.conf.sample
22 cp -f conf/client.conf $TARGET_CONF_PATH/client.conf.sample
23 # /etc/fdfs/storage_ids.conf.sample
24 cp -f conf/storage_ids.conf $TARGET_CONF_PATH/storage_ids.conf.sample
25 # /etc/fdfs/http.conf.sample
26 cp -f conf/http.conf $TARGET_CONF_PATH/http.conf.sample
27 # /etc/fdfs/mime.types.sample
28 cp -f conf/mime.types $TARGET_CONF_PATH/mime.types.sample
29 fi
30 # 创建/etc/init.d目录
31 mkdir -p $TARGET_INIT_PATH
32 # /etc/init.d/fdfs_trackerd
33 cp -f init.d/fdfs_trackerd $TARGET_INIT_PATH
34 # /etc/init.d/fdfs_storaged
35 cp -f init.d/fdfs_storaged $TARGET_INIT_PATH
36 # 将fdfs_trackerd脚本加入系统服务
37 # /sbin/chkconfig --add fdfs_trackerd
38 # 将fdfs_storaged脚本加入系统服务
39 # /sbin/chkconfig --add fdfs_storaged
40 fi
41 fi
42fi
在提供install参数的情况下执行项目构建安装脚本(make.sh),将安装分别用于重启和停止服务器的两个Shell脚本、六个配置文件模板和两个系统服务脚本。如下图所示:
而诸如跟踪服务器、存储服务器和客户机的可执行程序,客户端库的头文件、库文件和测试程序等,则依据它们各自的构建脚本(Makefile),在执行构建(make)的过程中完成安装。
xxxxxxxxxx
21# 将.c和.o追加到可识别后缀列表的末尾
2.SUFFIXES: .c .o
xxxxxxxxxx
21# 编译命令及选项
2COMPILE = $(CC) $(CFLAGS)
xxxxxxxxxx
41# 包含路径
2INC_PATH = -I../common -I/usr/local/include
3# 链接选项
4LIB_PATH = $(LIBS) -lfastcommon
xxxxxxxxxx
41# 可执行程序目录(/usr/bin)
2TARGET_PATH = $(TARGET_PREFIX)/bin
3# 配置文件目录(/etc/fdfs)
4CONFIG_PATH = $(TARGET_CONF_PATH)
xxxxxxxxxx
81# 共享目标模块
2SHARED_OBJS = ../common/fdfs_global.o \
3 tracker_proto.o tracker_mem.o tracker_service.o tracker_status.o \
4 tracker_global.o tracker_func.o fdfs_server_id_func.o \
5 fdfs_shared_func.o tracker_nio.o tracker_relationship.o \
6 $(TRACKER_EXTRA_OBJS)
7# 全部目标模块
8ALL_OBJS = $(SHARED_OBJS)
xxxxxxxxxx
21# 全部可执行程序
2ALL_PRGS = fdfs_trackerd
xxxxxxxxxx
21# 默认目标依赖于全部目标模块和全部可执行程序
2all: $(ALL_OBJS) $(ALL_PRGS)
xxxxxxxxxx
81# fdfs_trackerd依赖于fdfs_trackerd.o
2.o:
3 # 将fdfs_trackerd.o和共享目标模块及库链接成fdfs_trackerd
4 $(COMPILE) -o $@ $< $(SHARED_OBJS) $(LIB_PATH) $(INC_PATH)
5# fdfs_trackerd依赖于fdfs_trackerd.c
6.c:
7 # 将编译后的fdfs_trackerd.c和全部目标模块及库链接成fdfs_trackerd
8 $(COMPILE) -o $@ $< $(ALL_OBJS) $(LIB_PATH) $(INC_PATH)
xxxxxxxxxx
41# xxx.o依赖于xxx.c
2.c.o:
3 # 将xxx.c编译成xxx.o
4 $(COMPILE) -c -o $@ $< $(INC_PATH)
跟踪服务器的构建结构如下图所示:
xxxxxxxxxx
121../common/fdfs_global.c ---> ../common/fdfs_global.o \
2fdfs_server_id_func.c ---> fdfs_server_id_func.o |
3fdfs_shared_func.c ---> fdfs_shared_func.o | fdfs_trackerd.c
4tracker_proto.c ---> tracker_proto.o | |
5tracker_mem.c ---> tracker_mem.o | v / pthread
6tracker_service.c ---> tracker_service.o +--> fdfs_trackerd <--+
7tracker_status.c ---> tracker_status.o | \ fastcommon
8tracker_global.c ---> tracker_global.o |
9tracker_func.c ---> tracker_func.o |
10tracker_nio.c ---> tracker_nio.o |
11tracker_relationship.c ---> tracker_relationship.o |
12tracker_dump.c ---> tracker_dump.o(仅用于调试) /
xxxxxxxxxx
121# 安装目标无依赖
2install:
3 # 创建可执行程序目录(/usr/bin)
4 mkdir -p $(TARGET_PATH)
5 # 创建配置文件目录(/etc/fdfs)
6 mkdir -p $(CONFIG_PATH)
7 # /usr/bin/fdfs_trackerd
8 cp -f $(ALL_PRGS) $(TARGET_PATH)
9 # /etc/fdfs/tracker.conf.sample
10 if [ ! -f $(CONFIG_PATH)/tracker.conf.sample ]; then cp -f ../conf/tracker.conf $(CONFIG_PATH)/tracker.conf.sample; fi
11 # /etc/fdfs/storage_ids.conf.sample
12 if [ ! -f $(CONFIG_PATH)/storage_ids.conf.sample ]; then cp -f ../conf/storage_ids.conf $(CONFIG_PATH)/storage_ids.conf.sample; fi
跟踪服务器的目录结构如下图所示:
xxxxxxxxxx
41# 清除目标无依赖
2clean:
3 # 删除全部目标模块和全部可执行程序
4 rm -f $(ALL_OBJS) $(ALL_PRGS)
xxxxxxxxxx
21# 将.c和.o追加到可识别后缀列表的末尾
2.SUFFIXES: .c .o
xxxxxxxxxx
21# 编译命令及选项
2COMPILE = $(CC) $(CFLAGS)
xxxxxxxxxx
41# 包含路径
2INC_PATH = -I. -Itrunk_mgr -I../common -I../tracker -I../client -Ifdht_client -I/usr/include/fastcommon
3# 链接选项
4LIB_PATH = $(LIBS) -lfastcommon
xxxxxxxxxx
41# 可执行程序目录(/usr/bin)
2TARGET_PATH = $(TARGET_PREFIX)/bin
3# 配置文件目录(/etc/fdfs)
4CONFIG_PATH = $(TARGET_CONF_PATH)
xxxxxxxxxx
171# 共享目标模块
2SHARED_OBJS = ../common/fdfs_global.o ../tracker/fdfs_shared_func.o \
3 ../tracker/fdfs_server_id_func.o ../tracker/tracker_proto.o \
4 tracker_client_thread.o storage_global.o storage_func.o \
5 storage_sync_func.o storage_service.o storage_sync.o \
6 storage_nio.o storage_dio.o storage_ip_changed_dealer.o \
7 storage_param_getter.o storage_disk_recovery.o \
8 trunk_mgr/trunk_mem.o trunk_mgr/trunk_shared.o \
9 trunk_mgr/trunk_sync.o trunk_mgr/trunk_client.o \
10 trunk_mgr/trunk_free_block_checker.o \
11 ../client/client_global.o ../client/tracker_client.o \
12 ../client/storage_client.o ../client/client_func.o \
13 fdht_client/fdht_proto.o fdht_client/fdht_client.o \
14 fdht_client/fdht_func.o fdht_client/fdht_global.o \
15 $(STORAGE_EXTRA_OBJS)
16# 全部目标模块
17ALL_OBJS = $(SHARED_OBJS)
xxxxxxxxxx
21# 全部可执行程序
2ALL_PRGS = fdfs_storaged
xxxxxxxxxx
21# 默认目标依赖于全部目标模块和全部可执行程序
2all: $(ALL_OBJS) $(ALL_PRGS)
xxxxxxxxxx
81# fdfs_storaged依赖于fdfs_storaged.o
2.o:
3 # 将fdfs_storaged.o和共享目标模块及库链接成fdfs_storaged
4 $(COMPILE) -o $@ $< $(SHARED_OBJS) $(LIB_PATH) $(INC_PATH)
5# fdfs_storaged依赖于fdfs_storaged.c
6.c:
7 # 将编译后的fdfs_storaged.c和全部目标模块及库链接成fdfs_storaged
8 $(COMPILE) -o $@ $< $(ALL_OBJS) $(LIB_PATH) $(INC_PATH)
xxxxxxxxxx
41# xxx.o依赖于xxx.c
2.c.o:
3 # 将xxx.c编译成xxx.o
4 $(COMPILE) -c -o $@ $< $(INC_PATH)
存储服务器的构建结构如下图所示:
xxxxxxxxxx
291../common/fdfs_global.c ---> ../common/fdfs_global.o \
2../tracker/fdfs_shared_func.c ---> ../tracker/fdfs_shared_func.o |
3../tracker/fdfs_server_id_func.c ---> ../tracker/fdfs_server_id_func.o |
4../tracker/tracker_proto.c ---> ../tracker/tracker_proto.o |
5../client/client_global.c ---> ../client/client_global.o |
6../client/tracker_client.c ---> ../client/tracker_client.o |
7../client/storage_client.c ---> ../client/storage_client.o |
8../client/client_func.c ---> ../client/client_func.o |
9trunk_mgr/trunk_mem.c ---> trunk_mgr/trunk_mem.o |
10trunk_mgr/trunk_shared.c ---> trunk_mgr/trunk_shared.o |
11trunk_mgr/trunk_sync.c ---> trunk_mgr/trunk_sync.o |
12trunk_mgr/trunk_client.c ---> trunk_mgr/trunk_client.o | fdfs_storaged.c
13trunk_mgr/trunk_free_block_checker.c ---> trunk_mgr/trunk_free_block_checker.o | |
14fdht_client/fdht_proto.c ---> fdht_client/fdht_proto.o | v / pthread
15fdht_client/fdht_client.c ---> fdht_client/fdht_client.o +--> fdfs_storaged <--+
16fdht_client/fdht_func.c ---> fdht_client/fdht_func.o | \ fastcommon
17fdht_client/fdht_global.c ---> fdht_client/fdht_global.o |
18tracker_client_thread.c ---> tracker_client_thread.o |
19storage_global.c ---> storage_global.o |
20storage_func.c ---> storage_func.o |
21storage_sync_func.c ---> storage_sync_func.o |
22storage_service.c ---> storage_service.o |
23storage_sync.c ---> storage_sync.o |
24storage_nio.c ---> storage_nio.o |
25storage_dio.c ---> storage_dio.o |
26storage_ip_changed_dealer.c ---> storage_ip_changed_dealer.o |
27storage_param_getter.c ---> storage_param_getter.o |
28storage_disk_recovery.c ---> storage_disk_recovery.o |
29storage_dump.c ---> storage_dump.o(仅用于调试) /
xxxxxxxxxx
101# 安装目标无依赖
2install:
3 # 创建可执行程序目录(/usr/bin)
4 mkdir -p $(TARGET_PATH)
5 # 创建配置文件目录(/etc/fdfs)
6 mkdir -p $(CONFIG_PATH)
7 # /usr/bin/fdfs_storaged
8 cp -f $(ALL_PRGS) $(TARGET_PATH)
9 # /etc/fdfs/storage.conf.sample
10 if [ ! -f $(CONFIG_PATH)/storage.conf.sample ]; then cp -f ../conf/storage.conf $(CONFIG_PATH)/storage.conf.sample; fi
存储服务器的目录结构如下图所示:
xxxxxxxxxx
41# 清除目标无依赖
2clean:
3 # 删除全部目标模块和全部可执行程序
4 rm -f $(ALL_OBJS) $(ALL_PRGS)
xxxxxxxxxx
21# 将.c、.o和.lo追加到可识别后缀列表的末尾
2.SUFFIXES: .c .o .lo
xxxxxxxxxx
21# 编译命令及选项
2COMPILE = $(CC) $(CFLAGS)
xxxxxxxxxx
41# 包含路径
2INC_PATH = -I../common -I../tracker -I/usr/include/fastcommon
3# 链接选项
4LIB_PATH = $(LIBS) -lfastcommon
xxxxxxxxxx
81# 可执行程序目录(/usr/bin)
2TARGET_PATH = $(TARGET_PREFIX)/bin
3# 客户端库的库文件目录(/usr/lib64)
4TARGET_LIB = $(TARGET_PREFIX)/$(LIB_VERSION)
5# 客户端库的头文件目录的父目录(/usr/include)
6TARGET_INC = $(TARGET_PREFIX)/include
7# 配置文件目录(/etc/fdfs)
8CONFIG_PATH = $(TARGET_CONF_PATH)
xxxxxxxxxx
181# 静态库形式客户端库的目标模块
2FDFS_STATIC_OBJS = ../common/fdfs_global.o ../common/fdfs_http_shared.o \
3 ../common/mime_file_parser.o ../tracker/tracker_proto.o \
4 ../tracker/fdfs_shared_func.o ../tracker/fdfs_server_id_func.o \
5 ../storage/trunk_mgr/trunk_shared.o \
6 tracker_client.o client_func.o \
7 client_global.o storage_client.o
8# 静态目标模块
9STATIC_OBJS = $(FDFS_STATIC_OBJS)
10# 共享库形式客户端库的目标模块
11FDFS_SHARED_OBJS = ../common/fdfs_global.lo ../common/fdfs_http_shared.lo \
12 ../common/mime_file_parser.lo ../tracker/tracker_proto.lo \
13 ../tracker/fdfs_shared_func.lo ../tracker/fdfs_server_id_func.lo \
14 ../storage/trunk_mgr/trunk_shared.lo \
15 tracker_client.lo client_func.lo \
16 client_global.lo storage_client.lo
17# 全部目标模块
18ALL_OBJS = $(STATIC_OBJS) $(FDFS_SHARED_OBJS)
xxxxxxxxxx
51# 全部可执行程序
2ALL_PRGS = fdfs_monitor fdfs_test fdfs_test1 fdfs_crc32 fdfs_upload_file \
3 fdfs_download_file fdfs_delete_file fdfs_file_info \
4 fdfs_appender_test fdfs_appender_test1 fdfs_append_file \
5 fdfs_upload_appender fdfs_regenerate_filename
xxxxxxxxxx
201# 是否安装静态库形式的客户端库
2ENABLE_STATIC_LIB = $(ENABLE_STATIC_LIB)
3# 是否安装共享库形式的客户端库
4ENABLE_SHARED_LIB = $(ENABLE_SHARED_LIB)
5# 客户端库的头文件
6FDFS_HEADER_FILES = ../common/fdfs_define.h ../common/fdfs_global.h \
7 ../common/mime_file_parser.h ../common/fdfs_http_shared.h \
8 ../tracker/tracker_types.h ../tracker/tracker_proto.h \
9 ../tracker/fdfs_shared_func.h ../tracker/fdfs_server_id_func.h \
10 ../storage/trunk_mgr/trunk_shared.h \
11 tracker_client.h storage_client.h storage_client1.h \
12 client_func.h client_global.h fdfs_client.h
13# 静态库形式客户端库的库文件
14STATIC_LIBS = libfdfsclient.a
15# 共享库形式客户端库的库文件
16SHARED_LIBS = libfdfsclient.so
17# 客户端共享库
18CLIENT_SHARED_LIBS = libfdfsclient.so
19# 全部客户端库
20ALL_LIBS = $(STATIC_LIBS) $(SHARED_LIBS)
xxxxxxxxxx
21# 默认目标依赖于全部目标模块、全部可执行程序和全部客户端库
2all: $(ALL_OBJS) $(ALL_PRGS) $(ALL_LIBS)
xxxxxxxxxx
161# fdfs_xxx依赖于fdfs_xxx.o
2.o:
3 # 将fdfs_xxx.o和静态目标模块及库链接成fdfs_xxx
4 $(COMPILE) -o $@ $< $(STATIC_OBJS) $(LIB_PATH) $(INC_PATH)
5# fdfs_xxx依赖于fdfs_xxx.c
6.c:
7 # 将编译后的fdfs_xxx.c和静态目标模块及库链接成fdfs_xxx
8 $(COMPILE) -o $@ $< $(STATIC_OBJS) $(LIB_PATH) $(INC_PATH)
9# libfdfsclient.so无依赖
10libfdfsclient.so:
11 # 将共享库形式客户端库的目标模块及库链接成libfdfsclient.so
12 $(COMPILE) -o $@ $< -shared $(FDFS_SHARED_OBJS) $(LIB_PATH)
13# libfdfsclient.a无依赖
14libfdfsclient.a:
15 # 将静态库形式客户端库的目标模块打包成libfdfsclient.a
16 ar rcs $@ $< $(FDFS_STATIC_OBJS)
xxxxxxxxxx
81# xxx.o依赖于xxx.c
2.c.o:
3 # 将xxx.c编译成xxx.o
4 $(COMPILE) -c -o $@ $< $(INC_PATH)
5# xxx.lo依赖于xxx.c
6.c.lo:
7 # 将xxx.c以位置无关码方式编译成xxx.lo
8 $(COMPILE) -c -fPIC -o $@ $< $(INC_PATH)
客户机和客户端库的构建结构如下图所示:
xxxxxxxxxx
551 pthread fastcommon
2 \__________________________________/
3 |
4 v
5fdfs_monitor.c -----------------------> + ---------------------> fdfs_monitor
6fdfs_test.c -----------------------> + ---------------------> fdfs_test
7fdfs_test1.c -----------------------> + ---------------------> fdfs_test1
8fdfs_crc32.c -----------------------> + ---------------------> fdfs_crc32
9fdfs_upload_file.c -----------------------> + ---------------------> fdfs_upload_file
10fdfs_download_file.c -----------------------> + ---------------------> fdfs_download_file
11fdfs_delete_file.c -----------------------> + ---------------------> fdfs_delete_file
12fdfs_file_info.c -----------------------> + ---------------------> fdfs_file_info
13fdfs_appender_test.c -----------------------> + ---------------------> fdfs_appender_test
14fdfs_appender_test1.c -----------------------> + ---------------------> fdfs_appender_test1
15fdfs_append_file.c -----------------------> + ---------------------> fdfs_append_file
16fdfs_upload_appender.c -----------------------> + ---------------------> fdfs_upload_appender
17fdfs_regenerate_filename.c -----------------------> + ---------------------> fdfs_regenerate_filename
18 ^
19 ________________|_________________
20 / \
21 +--> ../common/fdfs_global.o \
22 +--> ../common/fdfs_http_shared.o |
23 +--> ../common/mime_file_parser.o |
24 +--> ../tracker/tracker_proto.o |
25 +--> ../tracker/fdfs_shared_func.o |
26 +--> ../tracker/fdfs_server_id_func.o +--> libfdfsclient.a
27 +--> ../storage/trunk_mgr/trunk_shared.o |
28 +--> tracker_client.o |
29 +--> storage_client.o |
30 +--> client_global.o |
31 +--> client_func.o /
32 |
33../common/fdfs_global.c ---+
34../common/fdfs_http_shared.c ---+
35../common/mime_file_parser.c ---+
36../tracker/tracker_proto.c ---+
37../tracker/fdfs_shared_func.c ---+
38../tracker/fdfs_server_id_func.c ---+
39../storage/trunk_mgr/trunk_shared.c ---+
40tracker_client.c ---+
41storage_client.c ---+
42client_global.c ---+
43client_func.c ---+
44 |
45 +--> ../common/fdfs_global.lo \
46 +--> ../common/fdfs_http_shared.lo |
47 +--> ../common/mime_file_parser.lo |
48 +--> ../tracker/tracker_proto.lo |
49 +--> ../tracker/fdfs_shared_func.lo | / pthread
50 +--> ../tracker/fdfs_server_id_func.lo +--> libfdfsclient.so <--+
51 +--> ../storage/trunk_mgr/trunk_shared.lo | \ fastcommon
52 +--> tracker_client.lo |
53 +--> storage_client.lo |
54 +--> client_global.lo |
55 +--> client_func.lo /
xxxxxxxxxx
251install:
2 # 创建可执行程序目录(/usr/bin)
3 mkdir -p $(TARGET_PATH)
4 # 创建配置文件目录(/etc/fdfs)
5 mkdir -p $(CONFIG_PATH)
6 # 创建客户端库的库文件目录(/usr/lib64)
7 mkdir -p $(TARGET_LIB)
8 # 创建向下兼容的客户端库的库文件目录(/usr/lib)
9 mkdir -p $(TARGET_PREFIX)/lib
10 # /usr/bin/fdfs_xxx
11 cp -f $(ALL_PRGS) $(TARGET_PATH)
12 # 若安装静态库形式的客户端库:
13 # /usr/lib64/libfdfsclient.a
14 # /usr/lib/libfdfsclient.a
15 if [ $(ENABLE_STATIC_LIB) -eq 1 ]; then cp -f $(STATIC_LIBS) $(TARGET_LIB); cp -f $(STATIC_LIBS) $(TARGET_PREFIX)/lib/;fi
16 # 若安装共享库形式的客户端库:
17 # /usr/lib64/libfdfsclient.so
18 # /usr/lib/libfdfsclient.so
19 if [ $(ENABLE_SHARED_LIB) -eq 1 ]; then cp -f $(CLIENT_SHARED_LIBS) $(TARGET_LIB); cp -f $(CLIENT_SHARED_LIBS) $(TARGET_PREFIX)/lib/;fi
20 # 创建客户端库的头文件目录(/usr/include/fastdfs)
21 mkdir -p $(TARGET_INC)/fastdfs
22 # /usr/include/fastdfs/xxx.h
23 cp -f $(FDFS_HEADER_FILES) $(TARGET_INC)/fastdfs
24 # /etc/fdfs/client.conf.sample
25 if [ ! -f $(CONFIG_PATH)/client.conf.sample ]; then cp -f ../conf/client.conf $(CONFIG_PATH)/client.conf.sample; fi
客户机和客户端库的目录结构如下图所示:
xxxxxxxxxx
41# 清除目标无依赖
2clean:
3 # 删除全部目标模块、全部可执行程序和全部客户端库
4 rm -f $(ALL_OBJS) $(ALL_PRGS) $(ALL_LIBS)
xxxxxxxxxx
21# 将.c和.o追加到可识别后缀列表的末尾
2.SUFFIXES: .c .o
xxxxxxxxxx
21# 编译命令及选项
2COMPILE = $(CC) $(CFLAGS)
xxxxxxxxxx
51# 包含路径
2INC_PATH = -I/usr/include/fastcommon -I/usr/include/fastdfs \
3 -I/usr/local/include/fastcommon -I/usr/local/include/fastdfs
4# 链接选项
5LIB_PATH = -L/usr/local/lib -lfastcommon -lfdfsclient $(LIBS)
xxxxxxxxxx
21# 可执行程序目录(/usr/bin)
2TARGET_PATH = $(TARGET_PREFIX)/bin
xxxxxxxxxx
41# 共享目标模块
2SHARED_OBJS =
3# 全部目标模块
4ALL_OBJS = $(SHARED_OBJS)
xxxxxxxxxx
21# 全部可执行程序
2ALL_PRGS = fdfs_monitor fdfs_test fdfs_test1
xxxxxxxxxx
21# 默认目标依赖于全部目标模块和全部可执行程序
2all: $(ALL_OBJS) $(ALL_PRGS)
xxxxxxxxxx
81# fdfs_xxx依赖于fdfs_xxx.o
2.o:
3 # 将fdfs_xxx.o和共享目标模块及库链接成fdfs_xxx
4 $(COMPILE) -o $@ $< $(SHARED_OBJS) $(LIB_PATH) $(INC_PATH)
5# fdfs_xxx依赖于fdfs_xxx.c
6.c:
7 # 将编译后的fdfs_xxx.c和全部目标模块及库链接成fdfs_xxx
8 $(COMPILE) -o $@ $< $(ALL_OBJS) $(LIB_PATH) $(INC_PATH)
xxxxxxxxxx
41# xxx.o依赖于xxx.c
2.c.o:
3 # 将xxx.c编译成xxx.o
4 $(COMPILE) -c -o $@ $< $(INC_PATH)
客户端库测试程序的构建结构如下图所示:
xxxxxxxxxx
111 pthread fastcommon
2 \__________________________________/
3 |
4 v
5fdfs_monitor.c -----------------------> + ---------------------> fdfs_monitor
6fdfs_test.c -----------------------> + ---------------------> fdfs_test
7fdfs_test1.c -----------------------> + ---------------------> fdfs_test1
8 ^
9 ________________|_________________
10 / \
11 fdfsclient
xxxxxxxxxx
41# 安装目标无依赖
2install:
3 # /usr/bin/fdfs_xxx
4 cp -f $(ALL_PRGS) $(TARGET_PATH)
客户端库测试程序的目录结构如下图所示:
xxxxxxxxxx
41# 清除目标无依赖
2clean:
3 # 删除全部目标模块和全部可执行程序
4 rm -f $(ALL_OBJS) $(ALL_PRGS)
达内集团◇C++/嵌入式◇闵卫