【ceph】使用cmake编译Ceph简易教程|Ceph工程

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:共享库名

猜你喜欢

转载自blog.csdn.net/bandaoyu/article/details/114739976