首页 > 解决方案 > Jenkins: CMake Error at /usr/local/share/cmake-3.11/Modules/FindProtobuf.cmake

问题描述

I try running a CMakeLists.txt on a Jenkins build server. The CMakeLists.txt with protobuf invocation looks like this:

find_package(Protobuf REQUIRED)
target_link_libraries(${PROJECT_NAME} INTERFACE ${Protobuf_LIBRARIES})

protobuf_generate_cpp(comm.pb.cc     comm.pb.h     proto/comm.proto)
protobuf_generate_cpp(comm_ccd.pb.cc comm_ccd.pb.h proto/comm_ccd.proto)
protobuf_generate_cpp(comm_cda.pb.cc comm_cda.pb.h proto/comm_cda.proto)
protobuf_generate_cpp(comm_plc.pb.cc comm_plc.pb.h proto/comm_plc.proto)

When running the CMakeLists on a Jenkins, following error is generated:

12:01:11 CMake Error at /usr/local/share/cmake-3.11/Modules/FindProtobuf.cmake:425 (file):
12:01:11   file STRINGS file "/usr/local/include/google/protobuf/stubs/common.h"
12:01:11   cannot be read.
12:01:11 Call Stack (most recent call first):
12:01:11   libraries/ScAPIProtocol/CMakeLists.txt:35 (find_package)

CMake command:

12:01:11 + cd build
12:01:11 + cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/Qt/5.10.0/gcc_64 -DProtobuf_INCLUDE_DIR=/usr/local ../code

标签: qtjenkinsprotocol-buffers

解决方案


我现在有了解决方案:就像@Michał Walenciak 建议的那样。您必须检查 cmake 调用的权限。

首先,我不得不将 cmake 调用调整为

cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/Qt/5.10.0/gcc_64
      -DProtobuf_INCLUDE_DIR=/usr/local/include
      -DProtobuf_LIBRARY=/usr/local/lib/libprotobuf.so ../code

此外,jenkins 使用属于“jenkins”组的“jenkins”用户执行此 bash 调用。为了正确读取 protobuf 文件,您必须更改指定 include 和 lib 目录的用户和组,如下所示:

$ sudo chown -R jenkins:jenkins /usr/local/include
$ sudo chown -R jenkins:jenkins /usr/local/lib

我希望这会有所帮助,至少在我的情况下是这样。感谢米哈乌。


推荐阅读