ceph的编译优化等级、运行时加载库的目等在link.txt中指定。(记载库https://blog.csdn.net/bandaoyu/article/details/113181179)
Makefile
详尽的Makefile规则教程:https://blog.csdn.net/liang13664759/article/details/1771246
这里有篇很简单的cmake入门博客:如何编写CMakeList.txt https://www.cnblogs.com/cv-pr/p/6206921.html
cmake
跨平台的编译管理工具。主要作用其实就是根据规则自动生成Makefile,然后使用make命令进行编译链接。
使用cmake需要如下步骤:
1. 编写CMakeList.txt文件
2. 生成Makefile,mkdir build && cd build && cmake ../CMakeList.txt。因为cmake生成的目录文件很多,一般情况下都会创建一个build目录进行放置。
3. 执行make 命令进行项目编译链接。
cmake生成的目录结果大致如下所示:
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.2.2
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ └── CMakeCCompilerId.c
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ └── CMakeCXXCompilerId.cpp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ ├── TargetDirectories.txt
│ │ └── test_sqrt.dir
│ │ ├── build.make
│ │ ├── C.includecache
│ │ ├── cmake_clean.cmake
│ │ ├── DependInfo.cmake
│ │ ├── depend.internal
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── progress.make
│ │ └── src
│ │ ├── b.c.o
│ │ └── main.c.o
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── test_sqrt
├── CMakeLists.txt
├── include
│ └── b.h
└── src
├── b.c
└── main.c
使用cmake编译ceph
之前学习ceph的时候,想修改代码,比如增加些打印语句等等,这还好办,直接从新make对应的模块就好了。比如修改了rbd模块相关文件,那就执行make rbd就行。但是如果想添加个文件,模块或者工具tool时,就不太好办了。因为Makefile中并没有相关文件的信息,也就是说即使执行make,新加的模块也不会进行编译。
但是自从有了cmake后就好办多了。可以直接在CMakeList.txt中把新写的模块文件添加进去,然后make就好。因为是基于ceph整个工程的,所以头文件include路径依照ceph/src为工程根目录导入即可。同时,也不太需要关心global链接依赖的问题,直接模仿一下ceph的写法就好。
先说明一下ceph CMakeList.txt的结构,如下所示。在工程根目录下有一个总的CMakeList.txt文件,然后使用add_subdirectory语句包含指定文件夹层层递进,从而找到所有的CMakeList的配置。因此,我们在更改ceph源码时,只需要修改该模块下的CMakeList.txt即可。
├── ceph-root
│ ├── build
│ │ ├── ...
│ ├── CMakeLists.txt
│ ├── src
│ │ ├── CMakeLists.txt
│ │ ├── tools
│ │ │ ├── CMakeLists.txt
│ │ ├── osd
│ │ │ ├── CMakeLists.txt
│ │ ├── mon
│ │ │ ├── CMakeLists.txt
│ │ │...
比如,我们想增加一个命令行工具,在 src/tools/ 目录下,新建了一个目录,嗯,叫demo。这个工程什么都不做,就使用了boost-pragram_option进行命令行的解析,然后打印参数值。其程序如下:
#include <boost/program_options.hpp>
#include <iostream>
using namespace std;
namespace po = boost::program_options;
int main(int args, char** argv){
try {
po::options_description generic("Generic Options: ");
generic.add_options()
("help", "help message")
("version,v", "print procedure version");
int opt = 5;
po::options_description ha("haha Options: ");
ha.add_options()
("opt", po::value<int>(&opt)->default_value(10), "optimize value");
po::options_description cmdline_options;
cmdline_options.add(generic).add(ha);
po::variables_map vm;
po::store(po::parse_command_line(args, argv, cmdline_options), vm);
po::notify(vm);
if (vm.count("help")){
cout << cmdline_options << endl;
return 1;
}
cout << "vm opt = " << vm["opt"].as<int>() << endl;
cout << "no opt = " << opt << endl;
}
catch(exception& e) {
}
catch(...) {
}
cout << "haha!" << endl;
return 0;
然后再demo/ 目录下,新建一个CMakeList.txt文件,只需要在文件上写上这么几句话:
set(demo test.cc)
add_executable(demo ${demo})
target_link_libraries(demo global
${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
然后在上层目录的CMakeList.txt中标识demo这个文件。
...
add_subdirectory(demo)
...
然后,返回root/build目录,执行cmake ..,会重新生成一个Makefile,然后执行make demo,就能够找到 build/bin/demo 这个可执行文件,执行就会输出:
@ ./bin/demo --help
Generic Options: :
--help help message
-v [ --version ] print procedure version
haha Options: :
--opt arg (=10) optimize value
按照这个例子,可以引用librados、librbd等库或者函数,然后就可以依样画葫芦,编译出自己的tool了。
原文链接:https://blog.csdn.net/hedongho/article/details/79993098
添加动态库依赖
vi ceph-L/src/osd/CMakeList.txt
target_link_libraries(osd so_libname)
osd:可执行程序名
so_libname:共享库名