配置

配置了一个CentOS 8的容器, 执行下以下内容

1
2
3
4
5
6
WITH_SEASTAR=true ./install-deps.sh
mkdir build && cd build
# 以下这步官网里没提, 导致失败的.
# . /opt/rh/gcc-toolset-9/enable
cmake -DWITH_SEASTAR=ON -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DCMAKE_EXPORT_COMPILE_COMMANDS=on ..
make -j18 crimson-osd

用服务器跑很快就失败了...发现主要是少了这个一点. /opt/rh/gcc-toolset-9/enable, 导致默认用的是gcc 8

好像找到个Dockerfile.in, 这里好像匹配了jenkins里面的操作, do_cmake.sh -DWITH_SEASTAR=ON

归档一下docker save sean10/centos_ceph_clion:pacific_v1.0.0 | gzip > centos_ceph_clion_pacific_v1.0.0.tar.gz

提交到[sean10/centos\_ceph\_clion Tags](https://hub.docker.com/repository/docker/sean10/centos_ceph_clion/tags?page=1&ordering=last_updated)这里了.

编译内存大概占用了13个g? 4G内存+15G的swap, 用掉了内存+9个G

docker压缩优化

1
docker history sean10/centos_ceph_clion:pacific_v1.1.1

看了下, 后面我所有ssh上去做的复制操作都没有, 我的代码因为需要clion上做同步然后Cmake, 直接把代码放进去并不能省去上传的操作, image容量在clion重新上传一次之后还是被会拉大, 因此暂时不考虑压缩了.

报错

CMAKE_CXX_COMPILER could be found.

我看了下gcc已经装了8.4版本, 那就是cmake没能识别到gcc的环境变量?

嗯, 我没装gcc-c++, 所以的确识别不到.

好像缺失的lz4的库?

姑且试了下, 好像是/usr/lib64/pkgconfig/lz4.pc不存在,但是实际上/usr/lib64/pkgconfig/liblz4.pc存在, 我做了个软链, 过了第一个, 但是后面还是报了上面这条报错.

--debug-output

CMake Warning (dev) at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:273 (message): The package name passed to find_package_handle_standard_args (LZ4) does
not match the name of the calling package (lz4). This can lead to problems
in calling code that expects find_package result variables (e.g.,
_FOUND) to follow a certain pattern.
Call Stack (most recent call first): cmake/modules/Findlz4.cmake:30 (find_package_handle_standard_args)
src/CMakeLists.txt:335 (_find_package) src/seastar/cmake/SeastarDependencies.cmake:98 (find_package)
src/seastar/CMakeLists.txt:330 (seastar_find_dependencies)
This warning is for project developers. Use -Wno-dev to suppress it.

Could NOT find LZ4 (missing: LZ4_LIBRARY)

好像是FindPackageHandleStandardArgs这个函数是类似find_package的.

好像是我理解错了, 这个就是单纯在找lz4-devel这个库提供的内容. 而现在我卸载掉这个devel库, 的确还是报相同的错误. 那就是这个库提供的内容没有在他们的搜索路径里导致的

好像FindLZ4.cmakeFindlz4.cmake本身是不一样的. 我试验了一下, 直接把这几个文件作为CMakeLists.txt的时候, 后者那个小写文件是能够找到的, 而第一个则是找不到的...

但是我把第二个文件覆盖掉第一个问题, 则是不工作的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- Checking for one of the modules 'liblz4'                                                       
CMake Warning (dev) at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:273 (message):
The package name passed to `find_package_handle_standard_args` (lz4) does
not match the name of the calling package (LZ4). This can lead to problems
in calling code that expects `find_package` result variables (e.g.,
`_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
cmake/modules/FindLZ4.cmake:45 (find_package_handle_standard_args)
CMakeLists.txt:325 (find_package)
This warning is for project developers. Use -Wno-dev to suppress it.

-- Found lz4: /usr/lib64/liblz4.so (found version "1.8.3")
-- Looking for LZ4_compress_default
-- Looking for LZ4_compress_default - found

所以是不是有地方定义了大写的LZ4:LZ4, 所以才导致必须有一个大写的导入.

奇怪, 为什么我的代码里这个目录不存在一个几乎同名的findlz4.cmake, 但是在设备上,却在findLZ4.cmake同目录里有一个findlz4.cmake呢?

这个目录疑似是生成的, 因为我改了以后, 这里的findLZ4.cmake就不存在了.

了解一下cmake的工作机制.

但是按照Cmake的工作机制, 理论上这个位置就不是一个动态生成的路径啊?

这里一直提到的The package name passed to find_package_handle_standard_args (lz4) does not match the name of the calling package (LZ4). This can lead to problems in calling code that expectsfind_packageresult variables (e.g.,这里的calling package到底是什么意思呢?

根据cmake里这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
  if (DEFINED CMAKE_FIND_PACKAGE_NAME
AND NOT FPHSA_NAME_MISMATCHED
AND NOT _NAME STREQUAL CMAKE_FIND_PACKAGE_NAME)
message(AUTHOR_WARNING
"The package name passed to `find_package_handle_standard_args` "
"(${_NAME}) does not match the name of the calling package "
"(${CMAKE_FIND_PACKAGE_NAME}). This can lead to problems in clling "
"code that expects `find_package` result variables (e.g., `_FOUND`) "
"to follow a certain pattern.")
endif ()

``CMAKE_FIND_PACKAGE_NAME``
the ``<PackageName>`` which is searched for

也就是调用find_package(LZ4)了.

1
2
src/seastar/cmake/SeastarDependencies.cmake:98 (find_package
src/seastar/CMakeLists.txt:330 (seastar_find_dependencies)

所以是来自这个文件, 传递了lz4为要找的包, 但是实际上只找到了findLZ4.cmake. 但是他隶属于seastar目录, 在那个目录里, 有一个findlz4小写的. 所以我怀疑是嵌套的cmake作用域之类的问题?

build目录下有一个Makefile.cmake如何理解?

这个文件是从CMakeLists.txt里生成出来的? 的确是生辰出来的...

Boost库还没下载下来, 所以直接编译seastar是肯定成功不了的.

最后复制了seastar目录下的cmake/Findlz4.cmake到了cmake/modules目录下, 和FindLZ4.cmake在一起, 就能过了.

不过我推测,应该还有个CMAKE_FIND_ROOT_PATH这种东西可能在工作, 可以让seastar目录在加载时, 自动使用当前目录的cmake来进行find_package操作, 不过目前没找到...

cannot deduce template arguments for 'tuple'

这次是编译报错. 看着比较像是c++支持语言版本不足, 看了下, 官方的jenkins里是有安装了gcc-toolset-9这个操作的, 所以按理来说应该是用gcc 9版本编译才对.

果然, 在ceph.spec.in里是有加载这个toolset的操作的.

1
. /opt/rh/gcc-toolset-9/enable

这个ceph.spec.in是怎么生成的暂时没找到, 不过有个make-dist的脚本,这里有生成的操作, 这里触发应该有用吧

通过make -n可以看到使用的c++的路径不对, 是低版本的, 果然, 我用的Makefile版本不对. 必须得更新一下. 删掉整个build目录, 先执行. /opt/rh/gcc-toolset-9/enable, 这次生成的Makefile版本对了.

从虚拟机开始

1
2
3
4
5
6
7
8
9
# 找一下怎么直接触发
grep -rn "SEASTAR"git submodule foreach --recursive git reset --hard

export WITH_SEASTAR=ON;
bash install-deps.sh

cmake ..
ccache ninja

stream 9 编译

Feature #51156: qa: Teuthology Testing on Centos 9 Stream - Ceph - Ceph

ktdreyer/ceph-el9

1
dnf copr enable -y ceph/el9 centos-stream-9

通过操作该项即可正常执行install-deps.sh

Reference

  1. Crimson developer documentation — Ceph Documentation
  2. crimson — Ceph Documentation