Jenkins在Mac M1代理上无法正常工作

Jenkins在Mac M1代理上无法正常工作,jenkins,cmake,apple-m1,rosetta-2,Jenkins,Cmake,Apple M1,Rosetta 2,我们希望使用带有M1处理器的MacMini作为CI管道中的代理,以确保拥有新Mac的开发人员能够编译该项目。我们复制了x86的设置,但cmake找不到诸如boost: CMake Error at /opt/homebrew/Cellar/cmake/3.19.7/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message): Could NOT find Boost (missing: Boost_INCLUDE

我们希望使用带有M1处理器的MacMini作为CI管道中的代理,以确保拥有新Mac的开发人员能够编译该项目。我们复制了x86的设置,但cmake找不到诸如boost:

CMake Error at /opt/homebrew/Cellar/cmake/3.19.7/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find Boost (missing: Boost_INCLUDE_DIR container system
  date_time)

奇怪的是,当通过ssh直接连接到机器时,这不是一个问题。即使手动设置环境变量也不会改变任何东西。

Jenkins代理使用Java。如果通过brew安装Java(例如,采用OpenJDK8),则可能会获得使用Rosetta转换层运行的x64版本(截至2021年3月)。您可以通过执行
sysctl sysctl.proc\u translated
来验证这一点。在“正常”SSH连接中,这应该返回0,当在Jenkins中作为
sh“sysctl sysctl.proc_translated”
执行时,您将看到1

首选选项(安装本机JDK) 您可以通过以下方式安装zulu JDK,而不是使用(例如)adoptopenjdk8

brew install --cask zulu
在此之后,您应该能够验证Jenkins中的
proc_translated
是否为0。您可以验证是否按如下所述构建了本机二进制文件

修补程序(不更改JDK) 如果无法安装本机JDK,以下是一个修补程序

通过修改Jenkins文件,我们可以强制cmake以本机方式运行(从而找到本机库),如下所示:

旧的:

新的:

不得不一遍又一遍地重复arch命令真的不太好。也许有人有更好的解决办法

核实结果 我们可以验证生成的二进制文件是否为本机ARM二进制文件:

sh "file hyriseTest"
结果:

+ file ./hyriseTest
./hyriseTest: Mach-O 64-bit executable arm64
编译器警告 注意:我们仍然看到关于“ltmp3”和“ltmp4”的链接器警告。我没有在网上找到任何关于这方面的信息,这似乎不会影响结果的正确性。例如:

ld: warning: direct access in function 'ltmp4' from file 'CMakeFiles/hyriseMvccDeletePlugin.dir/Unity/unity_0_cxx.cxx.o' to global weak symbol 
+ file ./hyriseTest
./hyriseTest: Mach-O 64-bit executable arm64
ld: warning: direct access in function 'ltmp4' from file 'CMakeFiles/hyriseMvccDeletePlugin.dir/Unity/unity_0_cxx.cxx.o' to global weak symbol